java arraylist的问题
不得不說(shuō),我犯了錯(cuò),很基礎(chǔ)的。。
遍歷list的時(shí)候可以刪除數(shù)組元素嗎? 答案是:簡(jiǎn)單/增強(qiáng)for循環(huán)不可以,list.iterator()這樣的方式就可以。
我之前做過(guò)類似面試題的,不過(guò)忘記了, 不記得是list還是set或者map了 。list? 貌似也可以吧。
對(duì)于set、map也是同理。
?
如果是刪除list倒數(shù)第一、倒數(shù)第二個(gè)元素,不會(huì)報(bào)錯(cuò),
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#現(xiàn)在的索引為2,被認(rèn)為已經(jīng)遍歷過(guò)了的,被略去!!
[Java, C, C#]------ 刪除是成功了的!!!
?
把c++改成c,則報(bào)錯(cuò)
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就沒(méi)問(wèn)題, 這顯然跟jdk、jvm本身相關(guān)。 —— 參考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();}}?
?
同樣的,對(duì)list做add操作會(huì)導(dǎo)致list長(zhǎng)度動(dòng)態(tài)增加、增加for和iterator都可以立即檢測(cè)到。
?
另外一方面,如果我們對(duì)list里面的元素做修改呢?—— 對(duì)基礎(chǔ)類型元素不會(huì)生效,———— 而對(duì)引用類型會(huì)生效。 當(dāng)然,估計(jì)沒(méi)人這么用。
?
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 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/FlyAway2013/p/3670987.html
總結(jié)
以上是生活随笔為你收集整理的java arraylist的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从无头单链表中删除节点 结构之
- 下一篇: 通用寄存器的专门用途