欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

java之ArrayList使用方法,javaarraylist

来源: javaer 分享于  点击 16031 次 点评:101

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、在删除元素时候可以倒着删除。



相关文章

    暂无相关文章

用户点评