java arraylist的问题

不得不说,我犯了错,很基础的。。

遍历list的时候可以删除数组元素吗? 答案是:简单/增强for循环不可以,list.iterator()这样的方式就可以。

我之前做过类似面试题的,不过忘记了, 不记得是list还是set或者map了 。list? 貌似也可以吧。

对于set、map也是同理。

如果是删除list倒数第一、倒数第二个元素,不会报错,

private static void listtest() {List<String> list = new ArrayList<String>();  list.add("Java");  list.add("C");  list.add("C++");  list.add("C#");  try {for(String str:list) {System.out.println(str);if(str.equalsIgnoreCase("C++")) {list.remove(str);}}} catch (Exception e) {e.printStackTrace();}System.out.println(list);}

打印:

Java
C
C++    -----C#现在的索引为2,被认为已经遍历过了的,被略去!!
[Java, C, C#]------ 删除是成功了的!!!

把c++改成c,则报错

Java
C
java.util.ConcurrentModificationException
[Java, C++, C#]at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)at java.util.ArrayList$Itr.next(ArrayList.java:791)at Test.listtest(Test.java:154)at Test.main(Test.java:135)

否则:

java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(Unknown Source)at java.util.ArrayList$Itr.next(Unknown Source)at com.huawei.oms.app.sysmgr.agent.neagent.db.DatabaseMonitor.queryDBInfo(DatabaseMonitor.java:291)at com.huawei.oms.app.sysmgr.agent.neagent.NeAgentImpl.queryDBInfo(NeAgentImpl.java:486)at sun.reflect.GeneratedMethodAccessor265.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at sun.reflect.misc.Trampoline.invoke(Unknown Source)at sun.reflect.GeneratedMethodAccessor114.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at sun.reflect.misc.MethodUtil.invoke(Unknown Source)at com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn(Unknown Source)at com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn(Unknown Source)at com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2(Unknown Source)at com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2(Unknown Source)at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(Unknown Source)at com.sun.jmx.mbeanserver.PerInterface.invoke(Unknown Source)at com.sun.jmx.mbeanserver.MBeanSupport.invoke(Unknown Source)at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)at javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source)at javax.management.remote.rmi.RMIConnectionImpl.access$300(Unknown Source)at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)at javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source)at sun.reflect.GeneratedMethodAccessor176.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)at java.lang.reflect.Method.invoke(Unknown Source)at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)at sun.rmi.transport.Transport$1.run(Unknown Source)at sun.rmi.transport.Transport$1.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at sun.rmi.transport.Transport.serviceCall(Unknown Source)at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)

如何处理这种情况呢?

用list的iterator就没问题, 这显然跟jdk、jvm本身相关。 —— 参考http://www.cnblogs.com/dongzhouzhou/articles/ConcurrentModificationException.html

Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String str = (String) iterator.next();System.out.println(str);if(str.equalsIgnoreCase("C")) {iterator.remove();}}

同样的,对list做add操作会导致list长度动态增加、增加for和iterator都可以立即检测到。

另外一方面,如果我们对list里面的元素做修改呢?—— 对基础类型元素不会生效,———— 而对引用类型会生效。 当然,估计没人这么用。

private static void listtest() {List<Persion> list = new ArrayList<Persion>();  List<String> list2 = new ArrayList<String>(10); Persion p1 = new Persion("lk1", 1);Persion p2 = new Persion("lk2", 2);Persion p3 = new Persion("lk3", 3);Persion p4 = new Persion("lk4", 4);list.add(p1);  list.add(p2);  list.add(p3);  list.add(p4);  Iterator<Persion> iterator = list.iterator();while (iterator.hasNext()) {Persion str = (Persion) iterator.next();System.out.println(str.getName());if(str.getName().equalsIgnoreCase("lk2")) {str.setName("123123");//iterator.remove();
              }}System.out.println(list);}class Persion {String name;int age;public Persion(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "name : " + this.name + "  age : " + this.age;}
}

posted on 2014-04-17 16:02 CanntBelieve 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/FlyAway2013/p/3670987.html

java arraylist的问题相关推荐

  1. java arraylist 函数_Java Extend ArrayList函数

    让我说我有 class Dummy { String a, b; public Dummy(String a, String b) { this.a = a; this.b = b; } public ...

  2. java arraylist初始大小_Java - ArrayList默认初始值

    当您在Java中创建Integer类型的数组列表时,默认值是什么?我需要检查一个数组列表是否已满,然后我将获取数组的大小,然后获取最后一个索引处的值,并检查它是否为默认值.Java - ArrayLi ...

  3. Java Arraylist 如何使用 Comparator排序

    Java Arraylist 如何使用 Comparator排序import java.util.ArrayList; import java.util.Collections; import jav ...

  4. java arraylist .get_Java ArrayList get()方法

    Java ArrayList get()方法 java.util.ArrayList.get(int index) 方法返回在ArrayList中的指定位置的元素. 1 语法 public E get ...

  5. Java ArrayList与LinkedList数据结构和特点

    Java ArrayList与LinkedList数据结构和特点 1. ArrayList 数据结构: ArrayList低层是实现的是一个Object类型的数组(空间连续,类型相同) 当我们调用Ar ...

  6. Java ArrayList到数组

    Sometimes we have to convert ArrayList to Array in java program. Today we will look into different j ...

  7. Java ArrayList的Array,Array的ArrayList

    Today we will learn how to create a Java array of ArrayList. We will also learn how to create an Arr ...

  8. java arraylist删除元素_java集合类ArrayList操作之删除remove某些元素的案例分析

    在java开发中,会经常出现需要删除java ArrayList的某些元素的场景,比如从在线用户列表的ArrayList中删除离线用户的ArrayList,但有的人会出现循环在线用户ArrayList ...

  9. java -ArrayList的用法实例--学生宿舍管理系统

    java -ArrayList的用法实例--学生宿舍管理系统 对于利用ArrayLis来实现增,删,改,查希望对大家有用! import java.util.*; import java.io.*; ...

最新文章

  1. mssql sqlserver 模拟for循环的写法
  2. SQL Server FOR XML PATH 语句的应用
  3. java处理图像库函数_图象处理详解-Java架构师必看
  4. 如何正确修补系统漏洞?
  5. 不可靠的信号、可靠信号
  6. 1.6_quick_sort_快速排序
  7. 【3】测试用例设计-因果图
  8. RK3288_Android7.1调试以太网ethernet
  9. 浅析免费加密软件应该如何选择性下载
  10. 7.11 不区分大小写的匹配
  11. python图片裁剪
  12. 智遥工作流调用SAP基础数据,解决方案
  13. “百练”成钢:NumPy 100练
  14. 谷歌地图网页版_【软件】谷歌地球,带你看遍全球美景,快来神游吧Google Earth...
  15. 软件自我成长之路——关于自动更新
  16. mysql cast 和 pgsql cast
  17. 图情论文笔记 | 学术图书馆“十四五”规划的思考(杨新涯)
  18. 发射端无线充线圈与接收端无线充线圈的区别
  19. thinkpad E470 更换SSD全程记录
  20. Wuawua知识管理 -- Python推荐书籍

热门文章

  1. ios推送服务,php服务端
  2. ps -aux返回超过100%
  3. ZZ:new/delete 和malloc/free 的区别
  4. 【FJOI2015】最小覆盖双圆问题
  5. android设置程序开机自启动
  6. Linux下 jenkins的安装
  7. python之路_django路由配置及模板
  8. POJ3111 K Best —— 01分数规划 二分法
  9. dos2unix批量转换的脚本
  10. 五个计算机软件,近五个交易日计算机软件概念股市复盘(4月19日)