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:)
- at java.util.ArrayList$Itr.next(ArrayList.java:)
- at Test.listtest(Test.java:)
- at Test.main(Test.java:)
否则:
- 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:)
- at com.huawei.oms.app.sysmgr.agent.neagent.NeAgentImpl.queryDBInfo(NeAgentImpl.java:)
- 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$(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$.run(Unknown Source)
- at sun.rmi.transport.Transport$.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>();
- Persion p1 = new Persion("lk1", );
- Persion p2 = new Persion("lk2", );
- Persion p3 = new Persion("lk3", );
- Persion p4 = new Persion("lk4", );
- 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("");
- //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;
- }
- }
java arraylist的问题的更多相关文章
- Java ArrayList、Vector和LinkedList等的差别与用法(转)
Java ArrayList.Vector和LinkedList等的差别与用法(转) ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都 ...
- 浅析 java ArrayList
浅析 java ArrayList 简介 容器是java提供的一些列的数据结构,也可以叫语法糖.容器就是用来装在其他类型数据的数据结构. ArrayList是数组列表所以他继承了数组的优缺点.同时他也 ...
- Java ArrayList中对象的排序 (Comparable VS Comparator)
我们通常使用Collections.sort()方法来对一个简单的数据列表排序.但是当ArrayList是由自定义对象组成的,就需要使用comparable或者comparator接口了.在使用这两者 ...
- Java ArrayList源码剖析
转自: Java ArrayList源码剖析 总体介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现.除该类未实现同步外 ...
- Java ArrayList 源代码分析
Java ArrayList 之前曾经参考 数据结构与算法这本书写过ArrayList的demo,本来以为实现起来都差不多,今天抽空看了下jdk中的ArrayList的实现,差距还是很大啊 首先看一下 ...
- Java ArrayList trimToSize()
前几天看了Java ArrayList,没有明白trimToSize()这个方法是什么意思,所以看了一下源码并且debug一下自己的一个例子,明白了其中的含义.贴在这里. ArrayList al = ...
- jdk 1.8下 java ArrayList 添加元素解析
转载请注明http://www.cnblogs.com/majianming/p/8006452.html 有人问我,java ArrayList底层是怎么实现的?我就回答数组,他再问我,那它是怎么实 ...
- Java ArrayList【笔记】
Java ArrayList[笔记] ArrayList ArrayList基本结构 ArrayList 整体架构比较简单,就是一个数组结构 源码中的基本概念 index 表示数组的下标,从 0 开始 ...
- JAVA - ArrayList是否会越界?
JAVA - ArrayList是否会越界? ArrayList并发add()可能出现数组下标越界异常. ArrayList是实现了基于动态数组的数据结构. LinkedList是基于链表的数据结构 ...
- 【简易版】Java ArrayList(增删改查)
1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: (1)动态的增加和减少元素 (2)实现了ICollectio ...
随机推荐
- 使用Concurrency Visualizer优化性能
Concurrency Visualizer: https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=- ...
- Android Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...
- c#制作计算器全过程
前言: 网上看的计算器制作只有代码,没有为全过程下面贴图,所以我在下面主要是贴图,让大家零基础制作计算器. 我的环境是visual studio 2010,其他版本例如2008,2012 都可以 1. ...
- android 模拟器上网问题
android 模拟器上网问题 1.配置Adroid环境变量(Win7为例) ,启动模拟器 第一步:桌面右键——>我的电脑——>高级系统设置 第二步:高级——>环境变量——&g ...
- github基本操作
http://www.cnblogs.com/SeeYouBug/p/6193527.html#3583637
- Method not found : Void System.Data.Objects.ObjectContextOptions.set_UseConsistentNullReferenceBehavior(Boolean)
找不到方法:“Void System.Data.Objects.ObjectContextOptions.set_UseConsistentNullReferenceBehavior(Boolean) ...
- R语言中的logical(0)和numeric(0)以及赋值问题
logical(0) 不等于 numeric(0).两者都不等于NULL值,即is.null(logical(0))和is.null(numeric(0))返还值都是FALSE.这很有意思,说明长度为 ...
- ibatis 使用 in 查询的几种XML写法
原文地址:http://blog.csdn.net/dracotianlong/article/details/35303593 这里摘抄学习 1.传入参数是数组 <select id=&quo ...
- MongoDB学习比较-07 C#驱动操作MongoDB
下载驱动 驱动的下载有两种方式:一种是在C#项目中通过NuGet进行安装,另一种是通过下面的链接:https://github.com/mongodb/mongo-csharp-driver/rele ...
- windows 7下qtcreator里QWT文件的pro配置
http://blog.chinaunix.net/uid-20717410-id-272331.html 把编译好的qwt的include文件夹下面 所有的.h文件 复制到qt目录下 然后在pro里 ...