java中的集合(Collection)
1. 为什么需要Collection
-
java是面向对象的语言,需要对对象进行一系列操作
-
为了操作一堆对象,就需要把这么多对象存储起来
-
存储时就需要一个装对象的容器
-
因此,JDK中提供了集合(Collection)来处理若干对象
2. 数组和集合的区别
-
长度区别
- 数组长度固定
- 集合长度可变化
-
内容不同
- 数组中只能存储同一种类型的元素
- 集合可以存储不同类型的元素(一般情况下只存相同类型元素)
-
元素数据类型
- 数组中可以存基本数据类型,也可以存引用数据类型
- 集合只能存引用数据类型(比如int 类型,需要存Integer)
3.Collection中重要的子类
4. Collection的功能
-
添加功能
- boolean add(Object obj) 添加一个元素
- boolean addAll(Collection c) 添加一个集合的元素
-
删除功能
- void clear() 移除所有元素
- boolean remove(Object o) 移除一个元素
- boolean removeAll(Collection o) 移除一个集合的元素
-
判断功能
- boolean contains(Object o) 判断一个元素是否存在
- boolean contains(Collection c) 判断集合中是否全部包含某集合的元素
- boolean isEmpty() 判断集合是否为空
-
获取功能
- Iterator<E> iterator() 迭代器
- 长度功能
- int size() 元素的个数
-
交集功能
-
boolean retainAll(Collection c) 溢出此collection中未包含在指定collection中的所有元素。
集合A和集合B做交集,最终的结果保存在集合A,返回值表示的是A是否发生过变化。
-
5. 迭代器介绍
在Collection类中,它继承了Iterable接口,而Iterable接口继承了Iterator类。
Iterator类中一共有三个方法,next,hasNext,remove。
这些方法都是在Collection的实现类中实现的,根据实现类的数据结构不同,迭代器的实现方法也不同
6. Set实现类
HashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public int size() {
return map.size();
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
public void clear() {
map.clear();
}
public boolean isEmpty() {
return map.isEmpty();
}
public Iterator<E> iterator() {
return map.keySet().iterator();
}
}
HashSet底层用了HashMap做存储结构,将元素当做键,每次存入同一个Object类做值,实现Set中元素不重复的特性。
LinkedHashSet
LinkedHashSet底层使用哈希数组和链表做存储结构,线程不安全
TreeSet
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable{
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
public TreeSet() {
this(new TreeMap<E,Object>());
}
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
}
TreeSet底层使用了TreeMap做存储(自平衡二叉树),保证了元素的有序,用Map的键存Set中的元素,实现了树结构的Set。
7. List实现类
相比Set集合,List集合的特点就是,有序且可重复。
和Set集合不同的一点,List集合中,使用了其独特的迭代器(ListIterator),其中有向前遍历,向后遍历,set和add方法。
常用的List集合实现类:
-
ArrayList
底层是数组结构,线程不安全。
-
LinkedList
底层是链表结构,线程不安全。
-
Vector
使用了其独特的迭代器(ListIterator),其中有向前遍历,向后遍历,set和add方法。
常用的List集合实现类:
-
ArrayList
底层是数组结构,线程不安全。
-
LinkedList
底层是链表结构,线程不安全。
-
Vector
底层是数组结构,线程安全。