关系图
Collection
Collection - 存储的都是value对象;
Collection是一个接口是最基本的集合接口,可以存储一组不唯一、无序的对象。
Collection下包含List、Queue、Set三个子类
List
List接口是继承自Collection接口的,它的实现类包括:ArrayList、Vector、LinkedList,我们统称它们为List家族吧。
List 家族有一个显著的特点:有序可重复的。
ArrayList
ArrayList的底层实现是数组的数据结构形式,所以它的特点是:适合遍历循环,不适合插入删除操作。
如何创建对象:
1-无参构造方法:new ArrayList();
2-带默认空间的构造方法:new ArrayList(int initialCapacity);
3-带collection参数的构造方法:ArrayList(Collection<? extends E> c);
常用的方法有:
方法 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾添加,其实索引位置从0开始 |
void add(int index, Object o) | 在指定的索引位置添加元素 |
boolean remove(Object o) | 从列表中删除元素o |
Object remove(int index) | 从列表中删除指定位置的元素 |
void set(int index, Object o) | 将index索引位置的元素替换成o元素 |
Object get(int index) | 返回指定索引位置处的元素,取出的元素是Object类型 |
int size() | 返回列表中的元素个数 |
boolean contains(Object o) | 判断列表中是否存在指定元素o |
void clear() | 清空元素 |
Vector
vector是ArrayList的早期版本,底层实现也是数组的数据结构形式;它与ArrayList的区别类似于StringBuffer与StringBuilder的区别;
vector线程安全,安全性高,但效率低;vector默认扩容2倍,arrayList默认扩容1.5
如何创建对象:
1-无参构造方法:new Vector()
2-带collection参数的构造方法:Vector(Collection<? extends E> c)
3-带默认空间的构造方法:Vector(int initialCapacity)
LinkedList
linkedlist既是List的实现类,也是Queue的实现类;所以它实现了两个接口的方法。
linkedList的底层使用双向链表的数据结构形式来存储,适合做插入和删除操作,不适合遍历循环(因为链表结构中的数据不连)
如何创建对象:
1-无参构造方法:new LinkedList()
2- 带collection参数构造方法:LinkedList(Collection<? extends E> c)
常用方法:
方法 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾添加,其实索引位置从0开始 |
void add(int index, Object o) | 在指定的索引位置添加元素 |
void addFirst(Object o) | 在当前集合的首部添加元素 |
void addLast(Object o) | 在当前集合的尾部添加元素 |
boolean remove(Object o) | 从列表中删除元素o |
Object remove(int index) | 从列表中删除指定位置的元素 |
Object removeFirst() | 移除当前集合首部的元素 |
Object removeLast() | 移除当前集合尾部的元素 |
void set(int index, Object o) | 将index索引位置的元素替换成o元素 |
Object get(int index) | 返回指定索引位置处的元素,取出的元素是Object类型 |
Object getFirst() | 获取当前集合首部的元素 |
Object getLast() | 获取当前集合尾部的元素 |
int size() | 返回列表中的元素个数 |
boolean contains(Object o) | 判断列表中是否存在指定元素o |
void clear() | 清空元素 |
Queue
Queue接口目前用的比较少,我们简单的讲一下。
Queue接口的存储效果是先进先出。通常子类包含:linkedList,ArrayDeque
常用方法:
add();添加元素
remove();删除元素
element();获取元素
offer()// 相当于add(),但不会抛异常
poll()//相当于remove(),只不过poll是取最先进入元素删除,且获取失败时返回空,不抛异常
peek()//相当于element(),但不会抛异常
Set
set接口继承collection接口,它的实现类有:HashSet和TreeSet;我们统称它们为Set家族。
Set家族有一个特点是:无序不可重复的;这里的无序是指添加的顺序和获取的顺序不一致。
HashSet
HashSet的底层是HashMap实现的。HashSet的值存放在HashMap的key上,HashMap的value统一为PRESENT。因此HashSet是无序不可重复的。
其实HashSet本身有自己的算法排布顺序,根据hash算法,但我们前面已经讲了,这里的无序是指添加顺序和获取顺序不一致。
因为set家族是不可重复的,所以它们都没有修改方法。
不重复规则:
1-利用equals和hashcode方法进行比较是否重复
2-发现重复元素,拒绝存入,只存储第一次的元素
常用方法:
方法 | 说明 |
---|---|
boolean add(Object o) | 在Set中添加元素o |
boolean remove(Object o) | 从Set中删除元素o |
int size() | 返回set中的元素个数 |
boolean contains(Object o) | 判断set中是否存在指定元素o |
void clear() | 清空set中所有元素 |
boolean isEmpty() | 判断set是否为空 |
由于HashSet的底层是HashMap实现的,所以我们不能像获取List中元素一样,使用数组下标进行获取;
那么我们该如何实现获取呢?
1-使用增强for循环进行集合遍历
for(Object set:HashSet){
system.out.println(set);
}
2-使用迭代器
HashSet<E> hashset= new HashSet<E>();
Iterator<E> iterator = hashset.iterator();
while (iterator.hasNext()){
iterator.next();
}
TreeSet
TreeSet底层是由TreeMap实现;
不可重复规则:按照compareTo(unicode码)规则排序
这里有一个小提示–当你想要将自己写的类存入TreeSet中时,需要实现comparable接口重写compareTo方法;返回int值,负数靠前,正数靠后排序
如何创建对象:
1- 无参构造函数:new TreeSet()
2- 带collection参构造函数:TreeSet(Collection<? extends E> c)
Map
Map家族的存储方式是以key-value的形式存值的,key是无序不可重复的,value无序可重复;
当发现key相同的情况下,value进行覆盖存储,保留最后一次存储的值。
HashMap
HashMap有一个早期版本HashTable;
HashMap和HashTable的区别:
1-HashTable是线程安全的
2-HashTable是同步的,效率低
3-HashTable不允许有空键值
底层的数据结构:散列表形式(数组+链表);数组存放的是HashCode码;如发现存储对象的HashCode码相同,就会在当前数组后面串上一个Node。因此HashMap插入删除操作的效率更高一些
如何创建对象:
1-无参构造方法:HashMap()
2-带默认空间的构造方法:HashMap(int initialCapacity)
3-带map的构造方法:HashMap(Map<? extends K,? extends V> m)
常用方法:
方法 | 说明 |
---|---|
Object put(Object key, Object value) | 将相互关联的一个key和value放入该集合 |
Object remove(Object key) | 从Map中移除与指定key相关联的映射 |
Object repalce(Object key, Object value) | 替换map中指定key相关联的映射 |
Object get(Object key) | 获取指定key相关联的映射 |
Set keySet() | 获取所有key的集合 |
boolean containsKey(Object key) | 判断集合中是否存在key |
boolean containsValue(Object value) | 判断集合中是否存在value |
int size() | 返回集合中元素的数量 |
void clear() | 清除集合中所有元素 |
Object getOrDefault(Object key, Object defaultValue) | 如果key存在取值,不存在使用defaultValue |
Object putIfAbsent(Object key, Object value) | 如果key存在就放弃,如果key不存在就存入 |
对于Map家族来说,遍历集合就显得有些麻烦了;我们需要先遍历所有的key,再通过key获取到value;
Set keys = hashMap.keySet();
for(Object key: keys) {
hashmap.get(key);
}
TreeMap
底层实现:红黑二叉树
如何创建对象:
1-无参构造方法:TreeMap()
2-带map参数的构造方法TreeMap(Map<? extends K,? extends V> m)
常用方法:
方法 | 说明 |
---|---|
Object put(Object key, Object value) | 将相互关联的一个key和value放入该集合 |
Object remove(Object key) | 从Map中移除与指定key相关联的映射 |
Object repalce(Object key, Object value) | 替换map中指定key相关联的映射 |
Object get(Object key) | 获取指定key相关联的映射 |
Set keySet() | 获取所有key的集合 |
boolean containsKey(Object key) | 判断集合中是否存在key |
boolean containsValue(Object value) | 判断集合中是否存在value |
int size() | 返回集合中元素的数量 |
void clear() | 清除集合中所有元素 |
Object getOrDefault(Object key, Object defaultValue) | 如果key存在取值,不存在使用defaultValue |
Object putIfAbsent(Object key, Object value) | 如果key存在就放弃,如果key不存在就存入 |