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

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

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

对于set、map也是同理。

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

  1. private static void listtest() {
  2. List<String> list = new ArrayList<String>();
  3. list.add("Java");
  4. list.add("C");
  5. list.add("C++");
  6. list.add("C#");
  7. try {
  8. for(String str:list) {
  9. System.out.println(str);
  10.  
  11. if(str.equalsIgnoreCase("C++")) {
  12. list.remove(str);
  13. }
  14. }
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. System.out.println(list);
  19. }

打印:

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

把c++改成c,则报错

  1. Java
  2. C
  3. java.util.ConcurrentModificationException
  4. [Java, C++, C#]
  5. at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:)
  6. at java.util.ArrayList$Itr.next(ArrayList.java:)
  7. at Test.listtest(Test.java:)
  8. at Test.main(Test.java:)

否则:

  1. java.util.ConcurrentModificationException
  2. at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
  3. at java.util.ArrayList$Itr.next(Unknown Source)
  4. at com.huawei.oms.app.sysmgr.agent.neagent.db.DatabaseMonitor.queryDBInfo(DatabaseMonitor.java:)
  5. at com.huawei.oms.app.sysmgr.agent.neagent.NeAgentImpl.queryDBInfo(NeAgentImpl.java:)
  6. at sun.reflect.GeneratedMethodAccessor265.invoke(Unknown Source)
  7. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  8. at java.lang.reflect.Method.invoke(Unknown Source)
  9. at sun.reflect.misc.Trampoline.invoke(Unknown Source)
  10. at sun.reflect.GeneratedMethodAccessor114.invoke(Unknown Source)
  11. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  12. at java.lang.reflect.Method.invoke(Unknown Source)
  13. at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
  14. at com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn(Unknown Source)
  15. at com.sun.jmx.mbeanserver.ConvertingMethod.invokeWithOpenReturn(Unknown Source)
  16. at com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2(Unknown Source)
  17. at com.sun.jmx.mbeanserver.MXBeanIntrospector.invokeM2(Unknown Source)
  18. at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(Unknown Source)
  19. at com.sun.jmx.mbeanserver.PerInterface.invoke(Unknown Source)
  20. at com.sun.jmx.mbeanserver.MBeanSupport.invoke(Unknown Source)
  21. at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
  22. at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
  23. at javax.management.remote.rmi.RMIConnectionImpl.doOperation(Unknown Source)
  24. at javax.management.remote.rmi.RMIConnectionImpl.access$(Unknown Source)
  25. at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(Unknown Source)
  26. at java.security.AccessController.doPrivileged(Native Method)
  27. at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(Unknown Source)
  28. at javax.management.remote.rmi.RMIConnectionImpl.invoke(Unknown Source)
  29. at sun.reflect.GeneratedMethodAccessor176.invoke(Unknown Source)
  30. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  31. at java.lang.reflect.Method.invoke(Unknown Source)
  32. at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
  33. at sun.rmi.transport.Transport$.run(Unknown Source)
  34. at sun.rmi.transport.Transport$.run(Unknown Source)
  35. at java.security.AccessController.doPrivileged(Native Method)
  36. at sun.rmi.transport.Transport.serviceCall(Unknown Source)
  37. at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
  38. at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
  39. at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
  40. at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  41. at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  42. at java.lang.Thread.run(Unknown Source)

如何处理这种情况呢?

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

  1. Iterator<String> iterator = list.iterator();
  2. while (iterator.hasNext()) {
  3. String str = (String) iterator.next();
  4. System.out.println(str);
  5. if(str.equalsIgnoreCase("C")) {
  6. iterator.remove();
  7. }
  8.  
  9. }

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

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

  1. private static void listtest() {
  2. List<Persion> list = new ArrayList<Persion>();
  3.  
  4. List<String> list2 = new ArrayList<String>();
  5. Persion p1 = new Persion("lk1", );
  6. Persion p2 = new Persion("lk2", );
  7. Persion p3 = new Persion("lk3", );
  8. Persion p4 = new Persion("lk4", );
  9. list.add(p1);
  10. list.add(p2);
  11. list.add(p3);
  12. list.add(p4);
  13.  
  14. Iterator<Persion> iterator = list.iterator();
  15. while (iterator.hasNext()) {
  16. Persion str = (Persion) iterator.next();
  17. System.out.println(str.getName());
  18. if(str.getName().equalsIgnoreCase("lk2")) {
  19. str.setName("");
  20. //iterator.remove();
  21. }
  22. }
  23.  
  24. System.out.println(list);
  25. }
  26.  
  27. class Persion {
  28. String name;
  29. int age;
  30. public Persion(String name, int age) {
  31. this.name = name;
  32. this.age = age;
  33. }
  34. public String getName() {
  35. return name;
  36. }
  37. public void setName(String name) {
  38. this.name = name;
  39. }
  40. public int getAge() {
  41. return age;
  42. }
  43. public void setAge(int age) {
  44. this.age = age;
  45. }
  46.  
  47. @Override
  48. public String toString() {
  49.  
  50. return "name : " + this.name + " age : " + this.age;
  51. }
  52. }

java arraylist的问题的更多相关文章

  1. Java ArrayList、Vector和LinkedList等的差别与用法(转)

    Java ArrayList.Vector和LinkedList等的差别与用法(转) ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都 ...

  2. 浅析 java ArrayList

    浅析 java ArrayList 简介 容器是java提供的一些列的数据结构,也可以叫语法糖.容器就是用来装在其他类型数据的数据结构. ArrayList是数组列表所以他继承了数组的优缺点.同时他也 ...

  3. Java ArrayList中对象的排序 (Comparable VS Comparator)

    我们通常使用Collections.sort()方法来对一个简单的数据列表排序.但是当ArrayList是由自定义对象组成的,就需要使用comparable或者comparator接口了.在使用这两者 ...

  4. Java ArrayList源码剖析

    转自: Java ArrayList源码剖析 总体介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现.除该类未实现同步外 ...

  5. Java ArrayList 源代码分析

    Java ArrayList 之前曾经参考 数据结构与算法这本书写过ArrayList的demo,本来以为实现起来都差不多,今天抽空看了下jdk中的ArrayList的实现,差距还是很大啊 首先看一下 ...

  6. Java ArrayList trimToSize()

    前几天看了Java ArrayList,没有明白trimToSize()这个方法是什么意思,所以看了一下源码并且debug一下自己的一个例子,明白了其中的含义.贴在这里. ArrayList al = ...

  7. jdk 1.8下 java ArrayList 添加元素解析

    转载请注明http://www.cnblogs.com/majianming/p/8006452.html 有人问我,java ArrayList底层是怎么实现的?我就回答数组,他再问我,那它是怎么实 ...

  8. Java ArrayList【笔记】

    Java ArrayList[笔记] ArrayList ArrayList基本结构 ArrayList 整体架构比较简单,就是一个数组结构 源码中的基本概念 index 表示数组的下标,从 0 开始 ...

  9. JAVA - ArrayList是否会越界?

    JAVA - ArrayList是否会越界? ArrayList并发add()可能出现数组下标越界异常. ArrayList是实现了基于动态数组的数据结构. LinkedList是基于链表的数据结构 ...

  10. 【简易版】Java ArrayList(增删改查)

    1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: (1)动态的增加和减少元素 (2)实现了ICollectio ...

随机推荐

  1. 使用Concurrency Visualizer优化性能

    Concurrency Visualizer: https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=- ...

  2. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

  3. c#制作计算器全过程

    前言: 网上看的计算器制作只有代码,没有为全过程下面贴图,所以我在下面主要是贴图,让大家零基础制作计算器. 我的环境是visual studio 2010,其他版本例如2008,2012 都可以 1. ...

  4. android 模拟器上网问题

    android 模拟器上网问题 1.配置Adroid环境变量(Win7为例) ,启动模拟器 第一步:桌面右键——>我的电脑——>高级系统设置    第二步:高级——>环境变量——&g ...

  5. github基本操作

    http://www.cnblogs.com/SeeYouBug/p/6193527.html#3583637

  6. Method not found : Void System.Data.Objects.ObjectContextOptions.set_UseConsistentNullReferenceBehavior(Boolean)

    找不到方法:“Void System.Data.Objects.ObjectContextOptions.set_UseConsistentNullReferenceBehavior(Boolean) ...

  7. R语言中的logical(0)和numeric(0)以及赋值问题

    logical(0) 不等于 numeric(0).两者都不等于NULL值,即is.null(logical(0))和is.null(numeric(0))返还值都是FALSE.这很有意思,说明长度为 ...

  8. ibatis 使用 in 查询的几种XML写法

    原文地址:http://blog.csdn.net/dracotianlong/article/details/35303593 这里摘抄学习 1.传入参数是数组 <select id=&quo ...

  9. MongoDB学习比较-07 C#驱动操作MongoDB

    下载驱动 驱动的下载有两种方式:一种是在C#项目中通过NuGet进行安装,另一种是通过下面的链接:https://github.com/mongodb/mongo-csharp-driver/rele ...

  10. windows 7下qtcreator里QWT文件的pro配置

    http://blog.chinaunix.net/uid-20717410-id-272331.html 把编译好的qwt的include文件夹下面 所有的.h文件 复制到qt目录下 然后在pro里 ...