现在在实际开发工作中经常用到各种集合类数据,有必要好好总结下
1.基本知识点
(1)形式上为一个集合接口,因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法 。
只要是集合类接口都会有个“迭代子”( Iterator ),利用这个迭代子,就可以对list内存的一组对象进行操作。 所有要想操作这个list内存的东西,就首先要得到此迭代子的实例:Iterator it=l.iterator(); 用add()方法即可添加新的成员对象,他可以添加的仅仅只能为对象,不能添加基本数据类型;容器还对应get(),remove()方法来获取和删除数据成员;
(2)最大特点: 有序、可重复;
(3)常用实现类有ArrayList和LinkedList
ArrayList:底层数据结构的实现方式采用的是数组结构,其特点是查询快,增删较慢,线程不同步;
LinkedList:底层数据结构的实现是链表结构,其特点是查询较慢,增删较快
Vector:底层是数组数据结构 线程同步(无论查询还是增删都很慢,被ArrayList替代了)
注意:
需要快速插入,删除元素,应该使用LinkedList;
需要快速随机访问元素,应该使用ArrayList;
对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList);
对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector);
2. 常用方法和功能
(1)实现方式:
List<String> list1 = new ArrayList<String>();
List<String> list2 = new LinkedList<String>();
(2)常用方法:
add(int index, Object obj)方法和set(int index, Object obj)方法,前者是向指定索引位置添加对象,而后者是修改指定索引位置的对象
list1.add(0, "JAVA");
list1.add(1, "C++");
list1.add(2, "C");
list1.add(3, "Phython");
list1.set(3, "改过了");
(3)遍历方式有三种:
a.用迭代器Iterator ,在大量数据情况,用迭代器遍历是最快的(也可以用List集合特有的迭代器:ListIterator(是Iterator的子接口) )
Iterator<String> it = list1.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
注意:
在迭代时,是不可以通过集合对象的方法操作集合中的元素
因为会发生ConcurrentModificationEx
所以,在迭代器时,只能用迭代器的方法操作元素
因为Iterator方法是有限的所以只能对元素进行判断,取出,删除的操作
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口只能通过List集合的listIterator方法获取
ListIterator<String> it2 = list2.listIterator();
while (it2.hasNext()) {
if (it2.next().equals("C++")) {
it2.add("新加一个");
//it2.set("修改你");
}
}
b.
for (String data : list1) {
System.out.println(data);
}
c.
for (int i = 0; i < list1.size(); i++) {
System.err.println(list1.get(i));
}
(4)LinkedList特有方法:
addFirst();在头部添加元素 addLast();在尾部添加元素
getFirst(); getLast(); 获取元素但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst(); removeLast(); 获取元素但是删除元素。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法
offerFirst(); offerLast();
peekFirst(); peekLast(); 获取元素,但是元素不被删除。如果集合中没有元素,会返回null
pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null