一.基本概念
java集合类类库的用途是“保存对象”,并将其划分为两个不同的概念
- Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
- ArrayList和LinkedList都是List类型,它们都按照被插入的顺序保存元素,两者的不同之处不仅在于执行某些类型的操作时的性能,而且LinkedList包含的操作也多于ArrayList。
- HashSet、TreeSet和LinkedHashSet都是Set类型,HashSet存储是无序的,但是是很快的获取元素方式;TreeSet按照比较结果的升序保存对象;LinkedHashSet按照被添加的顺序保存对象。
- Map。一组成对的“键值对”对象,允许你使用键来查找值。ArraList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起,映射表允许我们使用另一个对象来查找某个对象,它也被成为“关联数组”,因此它将某些对象与另外一些对象关联在了一起;或者成为“字典”,因此你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是去哪搞大的编程工具。
- Map(也被成为关联数组)可以用键来查找对象,就像一个简单的数据库。Map可以自动调整尺寸,HashMap没有明显的顺序来保存元素,但是提供最快的查找技术,TreeMap按照比较结果的升序保存键,LinkedHashMap按照插入顺序保存键,并且保留了HashMap的查找速度。
二.List
1.ArrayList常用api:
- contains()来确定某个对象是否在列表中;containsAll()来判断是否包含指定集合中的所有元素,显然,顺序是不重要的(contains()底层基于indexOf()判断,indexOf()基于equals())。
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
public class Test01 {
@Test
public void main () {
List<Integer> list1 = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list1.add(i);
}
List<Integer> list2 = new ArrayList<Integer>();
list2.add(5);
list2.add(3);
list2.add(4);
boolean contains = list1.containsAll(list2);
System.out.println(contains);
}
}
输出:true。
- remove()可以通过对象的引用或者索引编号来删除该对象(底层基于equals())。
- subList()方法允许你从较大的列表中创建一个片段。
- retainAll()方法保留同时存在于两个集合(集合类型不需要相同)中的元素(基于contains()方法判断,contains()方法基于equals()):
public class Test01 {
@Test
public void main () {
List<Integer> list1 = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list1.add(i);
}
List<Integer> list2 = new ArrayList<Integer>();
for (int i = 5; i < 15; i++) {
list2.add(i);
}
Set<Integer> set = new HashSet<Integer>();
set.add(8);
set.add(5);
set.add(12);
list1.retainAll(list2);
System.out.println("List1为:"+list1);
System.out.println("List2为:"+list2);
list2.retainAll(set);
System.out.println("List2为:"+ list2);
}
}
2.LinkedList常用api:
- LinkedList还添加了可以使其用作栈,队列,或双端队列的方法:
getFirst()、addFirst()、removeFirst()等。 - peek()返回第一个元素,没有则返回null。
- poll()返回并删除第一个元素,没有则返回null。
3.Stack
- pop()移除并保留栈顶元素。peek()取栈顶元素。
- push() 入栈操作。
4.Queue
- LinkedLIst提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。
- offer()方法将一个元素插入队尾,或者返回false。
- peek()和element()在不移除元素的情况下返回队头,队列为空时分别返回null和NoSuchElementException。
- poll()和remove()移除并返回第一个元素,队列为空时分别返回null和NoSuchElementException。
三.Set
- Set不存在重复元素,查找是Set中最重要的操作,因此通常会选择HashSet实现,而HashSet底层实际是new了一个HashMap。。
public HashSet() {
map = new HashMap<>();
}
其他构造函数有关初始容量(initialCapacity)和装载因子(loadFactor)的内容以后再谈。
- TreeSet可以对元素进行排序,元素需要重写compareTo()方法或者实现Comparable接口,或者在初始化对象的时候传入Comparator比较器。TreeSet底层实际是new了一个TreeMap。
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet() {
this(new TreeMap<E,Object>());
}