在了解了java的集合根接口Collection之后,今天来说一下它的的一大子接口list集合以及其常用的子接口。
list集合位于java.util.List包中,相比数组无法确定有效元素这一弊端,List系列集合存在索引值这一概念。因此该集合存储的元素特点是有序的,并且允许有重复元素。
而list集合又有几个常用的实现类:ArrayList、LinkedList、Vector,vector集合不常用了,就主要说一说
ArrayList和LinkedList。
ArrayList:位于java.util.ArrayList包中,该集合采用的是数组结构存储元素,所谓数组结构存储元素,可以用一副简单的图来表示:
上图是一个存储了5个元素的ArrayList,索引值从0-4,当我们查询某个数据时,程序根据其索引取出相应的值,而当我们对其中某个元素进行增加或者删除时,该元素相邻的元素索引会随之变化,比如对第二个元素进行删除,第三个元素会移动至第二个元素的位置上,并将索引变为1,后续的元素索引也依次进行变化,这也就说明ArrayList适用于查询操作,而不适用修改操作。
由于List集合继承自Collection集合,这里就说一说List集合独有的方法:
collection集合中有add(E e)方法,用于给集合添加指定的元素,而由于List集合存在索引值,提供了一个add(int index,e Element)的方法,用于在指定的索引中添加指定元素:
List list=new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add(1,"DD");
System.out.println(list);
运行结果:
类似的,还有addAll(int index,Collection<? extends E> c)方法,在指定的索引位置添加集合中的全部元素:
List list2=new ArrayList();
list2.add("EE");
list2.add("FF");
list.addAll(1,list2);
System.out.println(list);
还可以根据指定的索引提取元素:Object get(int index),获取指定元素的索引位置:
int indexOf(Object obj),以及获取指定元素的最后索引lastIndexOf(Object obj),或是通过索引删除指定元素remove(int index)等等:
List list=new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add("BB");
list.add("BB");
list.add("BB");
Object obj=list.get(1);
System.out.println(list.indexOf("BB"));
System.out.println(list.lastIndexOf("BB"));
list.remove(5);
System.out.println(list);
调用set(int index, E element)方法可以通过索引修改指定元素的值:
List list=new ArrayList();
list.add("AA");
list.add("BB");
list.add("CC");
list.add("BB");
//修改指定索引的值
list.set(3,"DD");
System.out.println(list);
类似string的subString方法,list集合还提供了subList(int fromIndex, int toIndex)方法,通过指定一个索引区间截取出指定元素形成一个新的集合,注意的是截取范围为左闭右开区间:
List list2=list.subList(1,3);
System.out.println(list2);
接下来说一说LinkedList,不同于ArrayList的数组结构,LinkedList存储数据采用的是链表结构,在上面介绍ArrayList有说到,由于数组结构的原因,对元素增加或是删除效率不高,而采用链表结构的LinkedList集合刚好补上了这个弊端,先简单的看看链表结构:
比如该图为一个存储了4个元素的LinkedList集合,该集合本身是无序的,元素之间根据链进行连接,即前一个元素的后向索引指向后一个前向索引元素,后一个元素的前向索引指向前一个的后向索引元素,而当我们要插入一个元素或是删除时,只需在插入的位置对前后两个元素重新进行指向,再断掉原来的指向,这样大大提高了效率,而相反的,由于没有索引值的存在,当查询某一个元素时,必须通过一级一级的联系去查找需要的元素,所以该集合不适合查询,而适合增加或是删除元素。
同样地,LinkedList由于其结构不同,也有了新的方法:
添加集合中的第一个元素 public void addFirst(E e)和最后一个元素public void addLast(E e):
LinkedList list=new LinkedList();
list.addFirst("AA");
list.addFirst("BB");
list.addFirst("CC");
list.addFirst("DD");
list.addLast("FF");
int size=list.size();
for (int i=0;i<size;i++){
Object obj2=list.removeFirst();
System.out.println(obj2);
}
类似的还有移除并取得第一个元素removeFirst()、获取第一个元素getFirst()等等,用法类似,就不一一列出来了,而通过LinkedList,我们可以实现堆栈(先进后出)或是队列(先进先出)存储数据,比如我们要完成堆栈,先写一个类封装好方法:
再调用:
这样通过addFirst()方法,让最先添加的元素最后出来。