1.List接口的常用方法
public static void main(String[] args) {
List list = new ArrayList();
//add添加元素
list.add("jack");
list.add(10);
list.add(true);
System.out.println("list = " + list);
//remove, clear, size, isEmpty, set, get(int)过于简单,略过
//contains查找元素是否存在
System.out.println(list.contains("jack"));
//int indexOf(Object obj):返回obj在集合中首次出现的位置
System.out.println(list.indexOf(10));//2
// List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
// 注意返回的子集合 (fromIndex,toIndex] 左开右闭
List returnlist = list.subList(0, 2);
//addAll添加多个元素
ArrayList list2 = new ArrayList();
list2.add("hlm");
list2.add("sgyy");
list.addAll(list2);
System.out.println("list = " + list);
//containsAll:判断多个元素是否存在
System.out.println(list.containsAll(list2));
//removeAll 删除多个元素
list.add("lz");
list.removeAll(list2);
System.out.println("list = " + list);
}
2. 迭代器 iterator
iterator多用来遍历list,可以理解成一个指针。他只有nset(), hasNext(), move()三个方法。
增强循环 for(数据类型 a:集合名称){} 底层实现就是iterator
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1));
col.add(new Book("小李飞刀", "古龙", 5.1));
col.add(new Book("三红楼梦", "曹雪芹", 34.6));
// 使用迭代器实现遍历集合
//1、 先得到col对应的迭代器
Iterator iterator = col.iterator();
//2、使用while循环遍历
while(iterator.hasNext()) {
//3.返回下一个元素, 类型是Object
Object obj = iterator.next();
//iterator.move() //这个方法可以删除此时iterator所指向的元素
System.out.println("obj=" + obj);
}
}
3.各个类的区别
都实现了list接口,另外linkliset实现了deque接口。
3.1 Vector
vector和arraylist都是用可变数组实现的。但是vector使用了synchronized,保证了线程安全,但是牺牲了性能。所以,vector or arraylist 要视情况而定。
strack是vector的子类,其方法有:
- peek() //看栈顶
- pop() //弹出
- push() //压栈
- empty() //空判断
- search(Obj) //查找对象位置,不存在返回null
3.2ArryList
- 是数组实现的。
- 数组有下标,查改效率高
3.3LinkList
- LinkedList底层维护了一个双向链表
- LinkedList中维护了两个属性first和last分别指向首节点和尾节点
- 每个节点(Node对象),里面又维护了prev、next、item三个属性,其中prev指向前一个,通过next指向后一个节点,最终实现双向链表
- 通过link增删元素,不需要像array一样涉及扩容,移位的问题,增删效率高。
- 可以添加任意元素(可以重复), 包括null
- 线程不安全,没有实现同步