关于java集合可以分为两类
- 单列集合(根接口Collection )
- 双列集合(分根接口Map)
1、单列集合
| Collection 单列集合的根接口
—-| List 实现了List接口的集合类,具备的特点: 有序,可重复
——–| ArrayList ArrayList 底层是维护了一个Object数组实现 的, 特点: 查询速度快,增删慢,是线程不同步的,操作效率高,线程不安全
——–| LinkList 是实现了链表的数据结构实现的,查询速度慢,增删块.这个集合同时模拟了堆栈的存储结构(提供push()/pop()方法),和队列的存储结构(提供offer()/poll())
——–| Vector 底层维护了一个Object数组实现的,Vector是同步的,线程安全的。
—-| Set 如果实现了Set接口的集合类,具备特点:无序、不可重复
——–| HashSet 底层使用了Hash表来实现,存取速度快。
——–| TreeSet 若果元素具备自然顺序的特征,那么就按照元素自然顺序的特征进行存储。
HashSet存储的原理
实际HashSet底层是构建了一个HashMap实现的,key值就是添加的set的元素值,value值是static final Object PRESENT = new Object();
TreeSet实现原理
TreeSet可以根据元素自然顺序进行排序,如果元素不具备自然顺序,则元素必须实现Comparable结构,并重写compareTo()方法,确定元素之间的比较规则。
TreeSet底层是使用红黑树,也就是二叉树实现。左小右大
实际TreeSet底层是调用TreeMap实现
2、双列集合
| Map 双列集合的根接口,存储数据都是键值对形式,键不可重复,值可重复
—–| HashMap HashMap是一个以Entry<K,V>
为类型的数组,数组的每个元素是一个链表,线程不安全。
—–| TreeMap 底层数据结构是基于红黑树实现(当key值不具有自然顺序时必须实现comparable接口)
—–| Hashtable 较早版本的jdk的集合,原理和HashMap类似,都是实现一个Entry<K,V>
为类型的数组,是线程同步的,速度慢,已经不用了
Map接口中的方法
void clear(); // 移除map中所有数据
boolean containsKey(Object key);// 如果map中含有key值返回true,否则false
boolean containsValue(Object value);// 如果map中含有一个或多个value值,则返回true
Set<Map.Entry<K,V>> entrySet();//返回一个set集合,元素时Map.Entry对象,map中所有key、value值封装在Map.Entry对象中
boolean remove(Object key, Object value); // 移除map中key值和value值和给定相等的键值对
boolean replace(K key, V oldValue, V newValue);// 替换map中key值,仅仅当对应的value值为oldValue时,替换为newValue,替换成功返回true
V remove(Object key);// 移出key值对应的项
int size();
V get(Object key); // 根据键获取相应的值
Set<K> keySet(); // 将key值存放在Set中(因为键值是唯一的)
Collection<V> values(); // 将value值存放在Collection中
3、集合工具类
Collections集合的工具类,针对List集合
排序
Collections.sort(list) // 可以实现对list进行排序
按照list中元素的自然顺序排序,当元素没有自然顺序,则必须提供一个比较器,需要传入一个匿名内部类,实现Comparator比较器接口。
查找
Collections.binarySearch(list,key) // 二分查找,寻找索引值,元素具有自然顺序
Collections.binarySearch(list,key,Comparator) // 元素不具备自然顺序时,需要传入一个比较器
Collections.max(list); // 查找集合最大值
Collections.max(list,Comparator); // 不具备自然顺序时
反转
Collections.reverse(list);
转换为线程安全的工具类
返回一个线程安全的集合
LinkedList<Integer> li = (LinkedList<Integer>) Collections.synchronizedList(list);