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;} }
转载于:https://www.cnblogs.com/FlyAway2013/p/3670987.html
java arraylist的问题相关推荐
- java arraylist 函数_Java Extend ArrayList函数
让我说我有 class Dummy { String a, b; public Dummy(String a, String b) { this.a = a; this.b = b; } public ...
- java arraylist初始大小_Java - ArrayList默认初始值
当您在Java中创建Integer类型的数组列表时,默认值是什么?我需要检查一个数组列表是否已满,然后我将获取数组的大小,然后获取最后一个索引处的值,并检查它是否为默认值.Java - ArrayLi ...
- Java Arraylist 如何使用 Comparator排序
Java Arraylist 如何使用 Comparator排序import java.util.ArrayList; import java.util.Collections; import jav ...
- java arraylist .get_Java ArrayList get()方法
Java ArrayList get()方法 java.util.ArrayList.get(int index) 方法返回在ArrayList中的指定位置的元素. 1 语法 public E get ...
- Java ArrayList与LinkedList数据结构和特点
Java ArrayList与LinkedList数据结构和特点 1. ArrayList 数据结构: ArrayList低层是实现的是一个Object类型的数组(空间连续,类型相同) 当我们调用Ar ...
- Java ArrayList到数组
Sometimes we have to convert ArrayList to Array in java program. Today we will look into different j ...
- 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 ...
- java arraylist删除元素_java集合类ArrayList操作之删除remove某些元素的案例分析
在java开发中,会经常出现需要删除java ArrayList的某些元素的场景,比如从在线用户列表的ArrayList中删除离线用户的ArrayList,但有的人会出现循环在线用户ArrayList ...
- java -ArrayList的用法实例--学生宿舍管理系统
java -ArrayList的用法实例--学生宿舍管理系统 对于利用ArrayLis来实现增,删,改,查希望对大家有用! import java.util.*; import java.io.*; ...
最新文章
- mssql sqlserver 模拟for循环的写法
- SQL Server FOR XML PATH 语句的应用
- java处理图像库函数_图象处理详解-Java架构师必看
- 如何正确修补系统漏洞?
- 不可靠的信号、可靠信号
- 1.6_quick_sort_快速排序
- 【3】测试用例设计-因果图
- RK3288_Android7.1调试以太网ethernet
- 浅析免费加密软件应该如何选择性下载
- 7.11 不区分大小写的匹配
- python图片裁剪
- 智遥工作流调用SAP基础数据,解决方案
- “百练”成钢:NumPy 100练
- 谷歌地图网页版_【软件】谷歌地球,带你看遍全球美景,快来神游吧Google Earth...
- 软件自我成长之路——关于自动更新
- mysql cast 和 pgsql cast
- 图情论文笔记 | 学术图书馆“十四五”规划的思考(杨新涯)
- 发射端无线充线圈与接收端无线充线圈的区别
- thinkpad E470 更换SSD全程记录
- Wuawua知识管理 -- Python推荐书籍