List
有序 :访问顺序和插入顺序一致
添加了根据下标来操作元素
Set
参考 数学上集合的概念
无序(访问顺序和插入顺序不一致)
不允许重复
可以null
没有添加额外的方法
HashSet 最常用的实现类,此实现不是同步的
实际上是一个 HashMap 实例
LinkedHashSet
维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序
保证访问顺序和插入顺序一致
TreeSet
底层实现:红黑树
使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
根据Comparable接口中compareTo方法来判断元素是否重复的,不是equals()
但是一个类中同时有这两个方法时,相等的逻辑要一致
练习:Student 使用集合存储 姓名 ,出生日期MyDate(年月日)
要求输出,按照出生日期有小到大排序
Map 两列集合
键映射到值---参考函数 y=x^2 ---键值对 Set<Node>
一个映射不能包含重复的键---键唯一(set)
每个键最多只能映射到一个值 ---一对一,多对一(Collection)
V get(Object key) 根据键获取值
V put(K key, V value) 添加
V remove(Object key) 移除
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
具体实现类
HashMap 最常用
允许使用 null 值和 null 键
不是同步的
实现原理:
jdk1.7 数组+链表
jdk1.8 数组+链表/红黑树
Node<K,V>[] table
jdk1.8
1、调用无参构造初始化时,没有申请空间
2、第一次put对象的时候,申请长度为16的数组空间Node<K,V>[] table
3、添加数据的时候,先计算hash值(会调用到hashCode()),确定元素在数组中的位置i
4、判断i位置上是否已经有对象,
如果没有,直接添加到数组i位置上----存
如果有(哈希冲突),当前对象和i位置上对象进行比较(key的hash,equals)
如果相等,就把value覆盖---修改
如果不相等,遍历此位置上链表中存储的每一个对象进行比较(key的hash,equals)
如果存在相等,就把value覆盖---修改
如果不存在相等,直接添加到链表中(如果链表中数据量超过8,则使用红黑树存储)----存
综上,key的hashCode 和equals()不相等,对象才会被存储 ,否则是被修改
LinkedHashMap
维护插入顺序的
Hashtable
不允许使用 null 值和 null 键e
同步的
Collections 工具类
addAll(Collection<? super T> c, T... elements)
binarySearch(List<? extends Comparable<? super T>> list, T key) 要求集合升序
sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。
sort(List<T> list, Comparator<? super T> c)
max(Collection<? extends T> coll)
min(Collection<? extends T> coll)
reverse(List<?> list) 反转指定列表中元素的顺序
shuffle(List<?> list) 打乱顺序,重新洗牌
fill()
List和数组怎么转换
List--数组 List:Object[] toArray()
数组--List Arrays:List<T> asList(T... a)