上一次复习了Collection的内容:http://blog.csdn.net/m0_38012174/article/details/77488041
这次复习完了List的基础内容,现在就总结一下吧。
一、List集合的基本特有功能
① void add(int index,E element)
② E remove(int index)
③ E get(int index)
④ E set(int index,E element)
例子①:
@SuppressWarnings("all")
public static void main(String[] args) {
// TODO Auto-generated method stub
List list = new ArrayList();
list.add(11);
list.add(12);
list.add(13);
System.out.println(list);
list.add(1, 14);
list.add(1, 15);
System.out.println(list);
}
所得到的结果为:
[11, 12, 13]
[11, 15, 14, 12, 13]
例子②:
继续使用上面的例子,list为[11, 15, 14, 12, 13]
Object obj = list.remove(1);
System.out.println(obj);
System.out.println(list);
list.removeAll(list);
System.out.println(list);
所得结果为:
15
[11, 14, 12, 13]
[]
用Object对象获取
即:remove是删除某个位置的对象。注意,使用该方法时,不要直接使用list里面的对象去调用,即不要list.remove(13),因为他会把13当做一个索引,不会自动装箱,会发生错误。
removeAll是删除整个List的内容
例子③:
同样道理,例子①中的list,list.get(2)就是得到14,第3个位置的的数据,因为list是由0开始算的,所以2就是第三个位置。
例子④:
System.out.println(list);
list.set(3, 16);
System.out.println(list);
得到的结果为:
[11, 15, 14, 12, 13]
[11, 15, 14, 16, 13]
结果是将第三个位置的数据覆盖了。
二、遍历数组
这个很简单,可以直接用for循环或者for—each循环直接遍历集合,集合长度为size(),利用get()方法进行遍历
得到一个list
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
三、查找对象
假如有一个集合:
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
那么可以使用迭代器Iterator获取每一个对象,再用equals()方法进行比较,得知在哪一个位置之后,再回到集合中增删查改。
注意,遍历的同时增加元素,会产生ConcurrentModificationException,避免这种情况就只能获取对象的索引位置,然后迭代完了再退回去集合中利用索引进行增删查改。
那么有没有简便一点的方法可以并发地修改集合list呢?
可以使用ListIterator
ListIterator lit = list.listIterator(); //获取迭代器(List集合特有的)
System.out.println(list);
while(lit.hasNext()) {
String str = (String)lit.next(); //向下转型
if("world".equals(str)) {
//list.add("javaee"); //遍历的同时在增加元素,并发修改ConcurrentModificationException
lit.add("javaee");
lit.add("abc");
}
}
System.out.println(list);
得到的结果是:
[a, b, world, c, d, e]
[a, b, world, javaee, abc, c, d, e]
ListIterator特有的add方法,这个Iterator是没有的,这个方法可以迭代器修改元素
这里给个题外话:
ListIterator的一些基本用法
boolean hasNext()是否有下一个
boolean hasPrevious()是否有前一个
Object next()返回下一个元素
Object previous();返回上一个元素
五、Vector类
Vector类概述
Vector类特有功能
三个基本方法:添加,查找位置,枚举
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
六、LinkedList的总结
LinkedList的特有功能:
public void addFirst(E e)及addLast(E e)
public E getFirst()及getLast()
public E removeFirst()及public E removeLast()
public E get(int index);
LinkedList是链表实现了链表的集合
例子如下:
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addFirst("a");
list.addFirst("b");
list.addFirst("c");
list.addFirst("d");
list.addLast("e");
System.out.println(list);
System.out.println(list.getFirst());
System.out.println(list.getLast());
System.out.println(list.removeFirst());
System.out.println(list.removeLast());
System.out.println(list.get(1));
System.out.println(list);
}
得到的结果是:
[d, c, b, a, e]
d
e
d
e
b
[c, b, a]
值得一提的是,Stack底层就是用LinkedList构建的。
七、asList()方法:
1.asList方法
public static void demo1() {
String[] arr = {"a","b","c"};
List<String> list = Arrays.asList(arr); //将数组转换成集合
//list.add("d"); //不能添加
System.out.println(list);
}
要注意的是,这里的数组一定要是引用数据类型,如能是基本数据类型
int[] arr = {11,22,33,44,55};
List<int[]> list = Arrays.asList(arr); //基本数据类型的数组转换成集合,会将整个数组当作一个对象转换
System.out.println(list);
Integer[] arr1 = {11,22,33,44,55}; //将数组转换成集合,数组必须是引用数据类型
List<Integer> list1 = Arrays.asList(arr1);
System.out.println(list1);
得到的结果是:
[[I@544a5ab2]
[11, 22, 33, 44, 55]
八、List的子类总结
了解过List的基本用法后,可以去了解他的三个子类的特点了
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
他们之间存在的区别:
1.Vector相对ArrayList查询慢(线程安全的)
2.Vector相对LinkedList增删慢(数组结构)
3.Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
4.ArrayList和LinkedList的区别。
(1)ArrayList底层是数组结果,查询和修改快
(2)LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
(3)共同点:都是线程不安全的
5.那么什么时候用哪一个?
查询多用ArrayList
增删多用LinkedList
如果都多ArrayList
那么List的内容就总结完了,接下来就开始复习Set和map的内容