subList ArrayList LinkedList

List<E> subList(int fromIndex,int toIndex)


该方法返回原有集合从fromIndex 到 toIndex之间一部分数据,组成一个新的集合,这两个集合之间是有联系的。

 1:你对原来的集合与返回的集合做非结构性的修改,都会影响到对方。

 2:如果你对原来的集合进行结构性的修改,在使用返回的子List语义上将会是undefined, 使用的时候将会抛出        ConcurrentModificationException异常

      List<String> parentList = new ArrayList<>();

        System.out.println("-----------以下输出subList------------");
        for(int i=0;i<5;i++){
            parentList.add(String.valueOf(i));
        }

        List<String> subList = parentList.subList(1,3);
        for(String s:subList){
            System.out.println(s);
        }    //out: 1,2


        System.out.println("-----------以下修改subList中元素 后输出parentList------------");
        subList.set(0,"new_1");

        for(String s:parentList){
            System.out.println(s);  //out: 0 new_1 2 3 4
        }

        System.out.println("-----------以下在subList中增加元素 后输出parentList------------");
        subList.add("2.5");
        for(String s:parentList){
            System.out.println(s);  //out: 0 new_1 2 2.5 3 4
        }
        System.out.println("-----------以下在prentList中修改元素 后输出subList-----------");
        parentList.set(2,"new_2");
        for(String s:subList){
            System.out.println(s);  //out: new_1 new_2 2.5
        }

        System.out.println("-----------以下在prentList中增加元素 后输出subList-----------");
         parentList.add("parentListAdd");
        for(String s:subList){
            System.out.println(s);   //Exception in thread "main" java.util.ConcurrentModificationException
        }

 ArrayList和LinkedList


插入:ArrayList是基于数组实现的,数组是一块连续的内存空间,因此总是在末尾增加元素,只有在空间不足的时候才产生数组的扩容和复制。如果在数组的任意位置插入元素,就会导致在该位置后的所有元素重新排序,因此效率极差。linkedList是基于链表的数据结构,不会因为插入数据而导致性能下降。

 

删除:arrayList每次删除元素后都会进行数据的重组,删除的数据位置越靠前,开销越大。

 System.out.println("----------------------用ArrayList预置5千万对象-----------");
        long start = System.currentTimeMillis();
        Object object = new Object();
        List list = new ArrayList();
        for(int i=0;i<50000000;i++){
            list.add(object);
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);   //850


        System.out.println("----------------------用LinkedList预置5千万对象-----------");
        start = System.currentTimeMillis();
        Object object1 = new Object();
        List list1 = new LinkedList();
        for(int i=0;i<50000000;i++){
            list.add(object);
        }
        end = System.currentTimeMillis();
        System.out.println(end-start); //750

        System.out.println("----------------------ArrayList增加元素-----------");
        start = System.currentTimeMillis();
        Object object2 = new Object();
//        for(int i=0;i<1000;i++){
//            list.add(0,object); //76562
//        }
        end = System.currentTimeMillis();
        System.out.println(end-start);
        System.out.println("----------------------LinkedList增加元素-----------");
        start = System.currentTimeMillis();
        Object object3 = new Object();
        for(int i=0;i<1000;i++){
            list1.add(object);
        }
        end = System.currentTimeMillis();
        System.out.println(end-start); //0

        System.out.println("----------------------ArrayList删除元素-----------");
        start = System.currentTimeMillis();

        list.remove(500);

        end = System.currentTimeMillis();
        System.out.println(end-start);  //130

        System.out.println("----------------------LinkedList删除元素-----------");
        start = System.currentTimeMillis();

        list1.remove(500);

        end = System.currentTimeMillis();
        System.out.println(end-start);  //0

上面的实验可以说明,如果数据稳定,我们可以使用ArrayList,如果容易发生修改,我们可以考虑使用LinkedList。还用注意:在linkedList中不要使用get(),即使元素只有几个。因为在链表中,随机访问 get(i) 的时候,链表只能从前往后数,第i个才能返回,随着 i 越大,时间会越来越长。

原文地址:https://www.cnblogs.com/dsitn/p/7047952.html