集合种类
集合的父接口有两个,一个是Collection接口,另一个是Map接口。
List的特点
- 有序
- 有下标
- 元素可重复
Set的特点
- 无序
- 无下标
- 元素不能重复
List的实现类
- ArrayList
- LinkedList
- Vector
Set的实现类
- HashSet
- SortSet中的TreeSet
Collection父接口
方法
- boolean add(Object obj) 添加一个对象
- boolean addAll(Collection c) 将一个集合中的所有对象添加到此集合中
- void clear() 清空元素
- boolean contains(Object o) 检查集合是否包含对象
- boolean equals(Object o) 比较集合是否与指定对象相等
- boolean isEmpty() 判断集合是否为空
- boolean remove(Object o) 在集合中移除o对象
- int size() 返回集合中元素个数
- Object[] toArray() 将列表转为数组
- Iterator iterator() 迭代器
对于迭代器Iterator的使用
- 创建一个Iterator接收迭代器
- Iterator中的方法:
方法名 | 作用 |
---|---|
hasnext | 判断迭代器是否还有元素 |
next | 返回迭代的下一个元素 |
remove | 移除当前元素 |
注意事项:在迭代过程中不可以使用collection中的方法。
List子接口
方法
- void add(int index,Object o) 在index下标插入对象o
- boolean addAll(int index,Collection c) 将一个集合中的元素添加到此集合中index的位置
- Object get(int index) 返回指定位置的元素
- List subList(int fromIndex, int toIndex) 返回两个index之间的元素(不包括右边界)
- ListIlterator listIterator() 列表迭代器
- ListIlterator listIterator(int index) 列表迭代器,从指定位置开始
- E set(int index,E element) 替换元素
迭代器ListIterator
特点
- 允许按任一方向遍历列表
- 迭代期间修改列表
- 获得迭代器在列表中的当前位置
- 无当前元素,光标位置位于previous()和next()之间
方法
返回值 | 方法名 | 参数 | 作用 |
---|---|---|---|
void | add | E | 指定元素插入列表 |
boolean | hasNext | / | 判断下一个元素是否存在 |
boolean | hasPrevious | / | 判断上一个元素是否存在 |
E | next | / | 下一个元素 |
int | nextIndex | / | 返回下一个的索引 |
E | previous | / | 上一个元素 |
int | previousIndex | / | 返回上一个的索引 |
void | remove | / | 删除元素 |
void | set | E | 替换元素 |
List实现类
ArrayList
特点:
- 数组结构实现,查询快、增删慢
- 运行效率快、线程不安全
Vector
特点:
- 数组结构实现,查询快、增删慢
- 运行效率慢、线程安全
LinkedList
特点:
- 链表结构实现,增删快、查询慢
ArrayList
属性:
属性 | 默认值 | 作用 |
---|---|---|
DEFAULT_CAPACITY | 10 | 添加了元素以后才会改变默认容量为10 |
elementData | null | 当使用无参构造方法创建ArrayList的时候,会自动让这个数组等于DEFAULTCAPACITY_EMPTY_ELEMENTDATA,默认容量为0 |
size | 0 | 实际元素个数 |
EMPTY_ELEMENTDATA | {} | 空数组实例 |
扩容机制:
先增加容量,再让最后一个位置放入新元素(第一个元素插入后会默认把容量变为10,后续扩容都会变成上一次的1.5倍) 核心代码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
LinkedList
存储结构: 双向链表
扩容机制:
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
LinkedList和ArrayList的区别:
- 结构实现方式不同
- 插⼊和删除是否受元素位置的影响
- 内存空间占⽤
Set子接口
方法:
全部继承自Collection中的方法
Set实现类
HashSet
- 基于HashCode实现元素不重复
- 当存入元素的HashCode相同时,会调用equals来确认,如果结果为true,则拒绝存入
TreeSet
- 基于排列顺序实现元素不重复
- 实现SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过CompareTo方法确定是否为重复元素
HashSet
存储结构: 哈希表(jdk1.8之后 数组+红黑树) 使用HashMap
存储过程:
- 根据hashcode计算保存的位置,如果为空,直接保存,不为空则执行下一步
- 调用equals方法,如果equals方法为true,则认为是重复,不允许加入,否则,形成链表(红黑树)
注意事项: 使用equals和hashcode的方式判断是否重复(所以部分对象需要重写)
TreeSet
存储结构: 红黑树 使用TreeMap
存储过程: 根据元素的大小分布在节点的左右
注意事项: 元素对象必须实现Comparable接口(需要制定泛型),重写CompareTo方法从而制定排序规则 (用CompareTo方法判断是否重复)
定制比较器comparator(让元素不需要实现comparable接口)
Map体系
Map的实现类
- HashMap
- SortedMap接口下的TreeMap
Map接口的特点:
- 用于存储任意键值对(K-V)
- 键: 无序、无下标、不允许重复
- 值: 无序、无下标、允许重复
Map接口常用方法
- V put(K key,V value) 存储对象 key重复则覆盖原值
- Object get(Object key) 根据键获取对应的value
- Set keySet() 返回所有key
- Collection values() 返回所有vaue的集合
- Set<Map.Entry<K,V>> entrySet() 返回键值匹配的Set集合
- boolean containsKey(Object key) 判断是否有此key
- boolean containsValue(Object value) 判断是否有此value
- boolean equals(Object o) 比较是否相等
EntrySet()使用方法
调用EntrySet方法会返回一个Set集合里面是Map.Entry类型,此类型封装了key和value。
HashMap
存储结构: 数组+红黑树
默认初始容量: 16
默认记载因子(当实际容量等于总容量75%的时候实行扩容机制): 0.75
对于键判断重复的机制: 使用equals和hashcode的方式判断是否重复(所以部分对象需要重写)
线程不安全
属性
属性 | 默认值 | 作用 |
---|---|---|
DEFAULT_INITIAL_CAPACITY | 16 | 默认容量(添加第一个元素后才会使用该容量) |
MAXIMUM_CAPACITY | 2的30次方 | 最大容量 |
DEFAULT_LOAD_FACTOR | 0.75 | 默认加载因子 |
TREEIFY_THRESHOLD | 8 | 当数组长度大于MIN_TREEIFY_CAPACITY并且链表长度大于该值时,HashMap的结构从数组+链表转换为数组+红黑树 |
UNTREEIFY_THRESHOLD | 6 | 当树的元素少于该值时,HashMap的结构从数组+红黑树转换为数组+链表 |
MIN_TREEIFY_CAPACITY | 64 | 当数组长度大于该值并且链表长度大于TREEIFY_THRESHOLD时,HashMap的结构从数组+链表转换为数组+红黑树 |
总结
- HashMap创建时,为了节省空间,添加第一个元素时,table容量调整为16
- 当元素个数大于阈值时,会进行2n扩容,目的是减少调整元素的个数
- jdk1.8后 每个链表长度大于8,且元素个数大于64时,会调整为红黑树,提高执行效率
- jdk1.8后 当红黑树元素小于6时,调整成链表
Hashtable
特点: 线程安全,运行效率慢;不允许null作为key或者value
子类: Properties
要求key和value都是String,通常用在配置文件读取
泛型
泛型类
语法: 类名****
注意事项: 泛型不能使用new来创建对象(构造方法可能为私有的)
泛型接口
语法: 接口名
注意事项: 可以创建静态常量 但不可以是泛型静态常量
泛型方法
**语法:**修饰符 返回值类型 方法名()
注意事项: 调用的时候会根据传入的数据自动判断类型(也可以在方法面前通过<>来指定类型)
泛型集合
语法: 集合类型
Collections工具类
方法
- public static void reverse(List<?> list) 反转集合中元素的顺序
- public static void shuffle(List<?> list) 随机重置集合元素的顺序
- public static void sort(List<?> list) 升序排序(元素类型必须实现comparable接口)
- public static int binarySearch(List<? extends Comparable<? super T>> list, T key) 二分查找法,集合需要已经排好序
- toArray(集合类型) list转换为数组 不可以是基本类型
- Arrays.asList(集合类型) 数组转换为list 不可以是基本类型