不得不说,我犯了错,很基础的。。html
遍历list的时候能够删除数组元素吗? 答案是:简单/加强for循环不能够,list.iterator()这样的方式就能够。java
我以前作过相似面试题的,不过忘记了, 不记得是list仍是set或者map了 。list? 貌似也能够吧。c++
对于set、map也是同理。面试
若是是删除list倒数第1、倒数第二个元素,不会报错,数组
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); }
打印:app
Java
C
C++ -----C#如今的索引为2,被认为已经遍历过了的,被略去!!
[Java, C, C#]------ 删除是成功了的!!!jvm
把c++改为c,则报错tcp
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)
不然:ide
java.util.ConcurrentModificationException at 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)
如何处理这种状况呢?this
用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; } @Override public String toString() { return "name : " + this.name + " age : " + this.age; } }