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 越大,时间会越来越长。