当前位置:首页 » 编程语言 » java遍历删除

java遍历删除

发布时间: 2023-02-10 04:38:45

1. java List遍历方法及其效率对比

Java代码

package zbalpha test;

import java util ArrayList;

import java util Iterator;

import java util List;

public class ListTest {

public static void main(String args[]){

List<Long> lists = new ArrayList<Long>();

for(Long i= l;i< l;i++){

lists add(i);

}

Long oneOk = oneMethod(lists);

Long oOk = oMethod(lists);

Long threeOk = threeMethod(lists);

Long fourOk = fourMethod(lists);

System out println( One: + oneOk);

System out println( Two: + oOk);

System out println( Three: + threeOk);

System out println( four: + fourOk);

}

public static Long oneMethod(List<Long> lists){

Long timeStart = System currentTimeMillis();

for(int i= ;i<lists size();i++) {

System out println(lists get(i));

}

Long timeStop = System currentTimeMillis();

return timeStop timeStart ;

}

public static Long oMethod(List<Long> lists){

Long timeStart = System currentTimeMillis();

for(Long string : lists) {

System out println(string);

}

Long timeStop = System currentTimeMillis();

return timeStop timeStart ;

}

public static Long threeMethod(List<Long> lists){

Long timeStart = System currentTimeMillis();

Iterator<Long> it = erator();

while (it hasNext())

{

System out println(it next());

}

Long timeStop = System currentTimeMillis();

return timeStop timeStart ;

}

public static Long fourMethod(List<Long> lists){

Long timeStart = System currentTimeMillis();

for(Iterator<Long> i = erator(); i hasNext();) {

System out println(i next());

}

Long timeStop = System currentTimeMillis();

return timeStop timeStart ;

}

}

容器类可以大大提高编程效率和编程能力 在Java 中 所有的容器都由SUN公司的Joshua Bloch进行了重新设计 丰富了容器类库的功能

Java 容器类类库的用途是 保存对象 它分为两类

Collection 一组独立的元素 通常这些元素都服从某种规则 List必须保持元素特定的顺序 而Set不能有重复元素

Map 一组成对的 键值对 对象 即其元素是成对的对象 最典型的应用就是数据字典 并且还有其它广泛的应用 另外 Map可以返回其所有键组成的Set和其所有值组成的Collection 或其键值对组成的Set 并且还可以像数组一样扩展多维Map 只要让Map中键值对的每个 值 是一个Map即可

迭代器

迭代器是一种设计模式 它是一个对象 它可以遍历并选择序列中的对象 而开发人员不需要了解该序列的底层结构 迭代器通常被称为 轻量级 对象 因为创建它的代价小

Java中的Iterator功能比较简单 并且只能单向移动

( ) 使用方法iterator()要求容器返回一个Iterator 第一次调用Iterator的next()方法时 它返回序列的第一个元素

( ) 使用next()获得序列中的下一个元素

( ) 使用hasNext()检查序列中是否还有元素

( ) 使用remove()将迭代器新返回的元素删除

Iterator是Java迭代器最简单的实现 为List设计的ListIterator具有更多的功能 它可以从两个方向遍历List 也可以从List中插入和删除元素

List的功能方法

List(interface): 次序是List最重要的特点 它确保维护元素特定的顺序 List为Collection添加了许多方法 使得能够向List中间插入与移除元素(只推荐 LinkedList使用) 一个List可以生成ListIterator 使用它可以从两个方向遍历List 也可以从List中间插入和删除元素

ArrayList: 由数组实现的List 它允许对元素进行快速随机访问 但是向List中间插入与移除元素的速度很慢 ListIterator只应该用来由后向前遍历ArrayList 而不是用来插入和删除元素 因为这比LinkedList开销要大很多

LinkedList: 对顺序访问进行了优化 向List中间插入与删除得开销不大 随机访问则相对较慢(可用ArrayList代替) 它具有方法addFirst() addLast() getFirst() getLast() removeFirst() removeLast() 这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈 队列和双向队列使用

Set的功能方法

Set(interface): 存入Set的每个元素必须是唯一的 因为Set不保存重复元素 加入Set的Object必须定义equals()方法以确保对象的唯一性 Set与Collection有完全一样的接口 Set接口不保证维护元素的次序

HashSet: 为快速查找而设计的Set 存入HashSet的对象必须定义hashCode()

TreeSet: 保持次序的Set 底层为树结构 使用它可以从Set中提取有序的序列

LinkedHashSet: 具有HashSet的查询速度 且内部使用链表维护元素的顺序(插入的次序) 于是在使用迭代器遍历Set时 结果会按元素插入的次序显示

lishixin/Article/program/Java/hx/201311/26494

2. java遍历list 并删除相同值对象

用一个for循环遍历List时,不能删除其中的元素。

用Iterator操作即可。

还有 Pro类要重写一下 toString方法。这样System.out.println里才能打印出来。

import java.util.*;

public class ListTest {
public static void main(String[] args) {

List<Pro> list = new ArrayList();
Pro p1 = new Pro("1000","1000");
Pro p2 = new Pro("1001","1002");
Pro p3 = new Pro("1003","1004");
Pro p4 = new Pro("1005","1006");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);

for (Iterator<Pro> i = list.iterator(); i.hasNext();) {
Pro o = i.next();
if(o.getProid().equals(o.getProName())){
i.remove();
}
}
System.out.println(list);
}
}

class Pro{
private String proid;
private String proName;

public String getProid() {
return proid;
}
public void setProid(String proid) {
this.proid = proid;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public Pro(String proid, String proName) {
super();
this.proid = proid;
this.proName = proName;
}
public Pro() {
}

public String toString() {
return proid + ":" + proName;
}
}

3. Java中遍历ArrayList的过程中删除元素操作会发生并发修改异常

首先搞清楚不是x=n-1不报错。是因为他避开了错误,实际当你用倒数第2个来删除的时候,他就已经跳出循环,不会判断最后以为,这是为什么呢?

我们先看看加强for循环是怎么实现的。都知道是通过迭代实现,那么将for写成迭代器来看。

Iterator<Object>itr=al.iterator();
while(itr.hasNext()){
Objecto=itr.next();
System.out.println(itr.hasNext());
if("n".equals(o)){
al.remove(o);
}
}

以上就是加强for循环的真正样子。再来透析源代码。

al.iterator():返回一个迭代器没什么好说的;

itr.hasNext():通过判断cursor(游标) != size(长度)来决定是否结束循环,cursor(游标) 初始是0 每次经过itr.next() +1;当cursor==size时 会跳出循环,这也是为什么倒数第2个不会出错的主要原因;

itr.next(): 看源代码可以发现每次在next()调用后,都会先调用checkForComodification()这个方法;

checkForComodification(): 主要作用是判断itr迭代器数据是否和list一致,

有两个参数,

第一个modCount 集合结构变动次数,如:一开始你add调用了7次,那么这个数就是7,

第二个expectedModCount 在调用iterator()方法时,初始化值等于modCount ,

这个方法判断当modCount !=expectedModCount 时

抛出异常,如果你调用迭代器的remove方法,expectedModCount 会重新赋值,但是你调用的是list的remove方法,那么modCount 就会+1 而expectedModCount 不变,这就会造成modCount !=expectedModCount;

最后,看看为什么倒数第2个不会抛异常:

当他遍历到“n-1”时,cursor=6,然后调用remover(o)方法,size=6,这个时候调用了itr.hasNext()判断cursor是否等于size,前面说过,当cursor==size时,跳出循环,那么就不会进入next(),也就不会进入checkForComodification()方法,所以不会抛出异常,说白了,也就是循环次数少了一次。

结合着源码看,应该会比较清晰。

4. JAVA中HashMap如何删除元素

HashMap删除元素根据其遍历方式一般有两种方法,实例演示如下:

一、采用foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况。

1、遍历如下:

原因在于,迭代器遍历时,每一次调用 next() 函数,至多只能对容器修改一次。上面的代码则进行了两次修改:一次添加,一次删除。

5. java 多线程操作hashtable(添加,删除,遍历)

public class TestThread {
public static void main(String[] args){
Map<Integer, Object> tables = new Hashtable<Integer, Object>();
Thread add = new Thread(new ThreadAdd(tables));
Thread del = new Thread(new ThreadDel(tables));
Thread count = new Thread(new ThreadCount(tables));
//启动线程
add.start();
del.start();
count.start();
}
/**
*添加对象线程
*/
private static class ThreadAdd implements Runnable{
private Map<Integer, Object> table;

public ThreadAdd(Map<Integer, Object> tables){
this.table=tables;
}
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
table.put(i, new Object());
System.out.println("添加对象,序号为:"+i);
}
}
}
/**
*删除对象线程
*/
private static class ThreadDel implements Runnable{
private Map<Integer, Object> table;

public ThreadDel(Map<Integer, Object> table){
this.table=table;
}
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
table.remove(i);
System.out.println("移除对象,序号为:"+i);
}
}
}
/**
*统计线程
*/
private static class ThreadCount implements Runnable{
private Map<Integer, Object> table;

public ThreadCount(Map<Integer, Object> table){
this.table=table;
}
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("当前队列还剩"+table.size()+"个对象");
}
}
}
}
这是我的写的demo,不知道符合不符合你的意思,大家共同交流共同进步。

6. java List 遍历和删除 急

List可以用序号来遍历,但通常推荐使用iterator来遍历
Iterator itr = list.iterator();
while (itr.hasNext()) {
Object nextObj = itr.next();
}

如果要全部删除,用clear()方法是最简单的。
另外,Iterator也带有remove()方法,可以在遍历的时候,根据一定条件来进行删除。

示例:

import java.util.*;

public class Test {
public static void print(List<Integer> list) {
Iterator<Integer> itr = list.iterator();
while (itr.hasNext()) {
System.out.print(itr.next());
System.out.print(", ");
}
System.out.println();
}

public static void main(String[] args) {
List<Integer> s = new ArrayList<Integer>();
for (Integer i = 0; i < 10; i++) {
s.add(i);
}
print(s);

Iterator<Integer> itr = s.iterator();
while (itr.hasNext()) {
Integer i = itr.next();
if (i % 3 == 0) {
itr.remove();
}
}
print(s);
}
}

7. java中的集合哪些可以边遍历边删除,哪些不可以,还有哪些可以边遍历边添加哪些不可以

都可以,关键是小心别越界了!

确切的说你应该注意遍历的方式和增删的方式是否一致(即:普通循环和迭代器别混合用)。

或者你的意思是有哪些集合是线程安全的,可两个线程一个遍历一个操作。这个api里有。
凡是自身是线程安全的都可以,不是就要自己实现线程安全,但还是小心别越界。

8. java用迭代器边遍历边删除的问题

if ((Integer.parseInt((String) it.next()) == 9)
|| (Integer.parseInt((String) it.next()) == 12)) {

你这个判断有问题,你执行了两次 next()方法。

这样改以下。

int i = Integer.parseInt((String) it.next();
if ((i == 9)|| (i == 12)) {

9. java:用Iterator遍历对象中,删除因元素不符合的对象,并显示出来

Vector<Student> stu = new Vector<Student>(6);
stu.add(new Student(1001,"张三"));
stu.add(new Student(1002,"李四"));
stu.add(new Student(1003,"王五"));
stu.add(new Student(1004,"赵六"));
stu.add(new Student(1005,"赵小宝"));
stu.add(new Student(1006,"张小明"));
Iterator<Student> iter = stu.iterator();
while(iter.hasNext()){
String s =iter.next().getName();
if(s.length()==3){
System.out.println(s);
iter.remove();
}
}

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:582
制作脚本网站 发布:2025-10-20 08:17:34 浏览:876
python中的init方法 发布:2025-10-20 08:17:33 浏览:571
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:757
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:673
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1000
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:244
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:103
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:795
python股票数据获取 发布:2025-10-20 07:39:44 浏览:701