java之ArrayList使用方法,javaarraylist
java之ArrayList使用方法,javaarraylist
一、ArrayList的遍历方式
ArrayList的遍历方式较多主要有通过下标遍历和叠加器遍历。如下
List<String> list = new ArrayList<String>();
list.add("a");list.add("b");
//方法1
Iterator it1 = list.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
//方法2
for(Iterator it2 = list.iterator();it2.hasNext();){
System.out.println(it2.next());
}
//方法3
for(String tmp:list){
System.out.println(tmp);
}
//方法4
for(int i = 0;i < list.size(); i ++){
System.out.println(list.get(i));
}
二、ArrayList添加元素
需要注意的是add和set的区别
List<String> list = new ArrayList<String>();
list.add("0");
list.add("4");
System.out.println(list.get(1));
list.add("1");
System.out.println(list.get(1));
list.add(0, "3");
System.out.println(list.get(1));
list.set(0, "6");
System.out.println(list.size());
三、ArrayList删除元素
跟添加元素差不多,着就不细说了
四、ArrayList之遍历add元素
先上代码
List<String> list = new ArrayList<String>();
list.add("0");
list.add("4");
for (String string : list) {
if("4".equals(string)){
list.add("6");
}
}
这个看着没有错,编译也通过,但是执行的时候会报错,java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at csdb.arraylist.TestArrayList.testWhile(TestArrayList.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
这是因为用下标遍历的和用叠加器遍历的,在调用add方法的时候,下标遍历的方式修改了一个计数的,而叠加器那边没有同步。
在看看这个,报内存溢出了,例子写的简单,但是在复杂的业务中很容易出现。所有在循环中要谨慎,操作list
List<String> list = new ArrayList<String>();
list.add("0");
list.add("4");
while(true){
list.add("aa");
}
五、ArrayList删除元素
List<String> list = new ArrayList<String>();
list.add("0");list.add("4");
list.add("4");
for (int i = 0; i < list.size(); i++) {
if("4".equals(list.get(i))){
list.remove(i);
}
}
for (String string : list) {
System.out.println(string);
}
我们要删除list中所有的4,但是看遍历结果发现,我们之删除了一个4,list还有4,其实这是在删除元素的过程中,下标发生了改变,导致删除元素的的后面元素下标都减少了1,从而少删除了一个4,所有在删除元素的时候要考虑下标会改变。使用叠加器删除是没有这种情况的,但是这两种删除方式不能混着用,会抛异常。
六、总结
1、操作ArrayList时要注意下标会改变。
2、下标和叠加器方式最好不能混着用。
3、在删除元素时候可以倒着删除。
相关文章
- 暂无相关文章
用户点评