java arraylist的问题
生活随笔
收集整理的這篇文章主要介紹了
java arraylist的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从无头单链表中删除节点 结构之
- 下一篇: 通用寄存器的专门用途