Java基础知识总结梳理(四)
重要的集合知识点梳理来了!
Java集合
集合框架体系
Collection
先上Collection接口知识框架图
- List :有序,可重复
实现List接口的常用类包括Vector、ArrayList、LinkedList等
- Vector: 线程安全;
扩容机制:如果无参,默认10,满后,按照2倍扩容;如果指定大小则每次直接按2倍扩容; - ArrayList:线程不安全;
- 底层是可变数组,可以加入多个null;
- ArrayList中维护了一个Object类型的数组,elementData
- 当创建对象时,如果使用的是无参构造器,则初始elementData容量为0(jdk7是10)
- 当添加元素时:先判断是否需要扩容,如果需要扩容,则调用grow方法,否则直接添加元素到合适位置
- 如果使用的是无参构造器,如果第一次添加,需要扩容的话,则扩容elementData为10,如果需要再扩容的话,则扩容elementData为1.5倍
- 如果使用的是指定容量capacity的构造器,则初始elementData容量为capacity
- 如果使用的是指定容量capacity的构造器,如果需要扩容,则直接扩容elementData为1.5倍
- LinkedList:线程不安全
- 底层是双向链表
- 增删效率高,改查效率低
- 接口常用方法:
- add()
- addAll()
- get(int index)
- indexOf(Object obj)
- lastIndexOf(Object obj)
- remove(int index)
- set(int index, Object ele)
- subList(int fromIndex, int toIndex)
- Set:无序,不可重复
- HashSet
- 采用Hashmap的key来存储元素;主要特点是无序的
- HashSet底层是HashMap
- 添加第一个元素时,先得到hash值 -> 会转成 -> 索引值,第一次添加时,table数组扩容到16,临界值(threshold)是16*加载因子(loadFactor)是0.75 = 12
- 找到存储数据表table,看到这个索引位置是否已经存放的有元素
- 如果没有,直接加入
- 如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后,如果table数组使用到了临界值12,就会扩容到162=32,新的临界值就是320.75=24,依此类推
- 在Java8中,如果一条链表的元素个数超过了TREEIFY_THRESHOLD(默认是8),并且table的大小>=MIN_TREEIFT_CAPACITY(默认64),就会进行树化(红黑树)
- TreeSet
- 可以进行排序,需要使用带比较器的构造器
- 底层为TreeMap
- 接口常用方法
- add()
- remove()
- contains()
- size()
- isEmpty()
- clear()
- addAll()
- containsAll()
- removeAll()
- 接口遍历元素方式
- 使用Iterator迭代器:注意,如果在循环中直接调用集合的remove()方法,例如,list.remove();循环过成功list.size()的大小变化,就会导致错误。所以如果想在循环语句中删除集合中的某个元素,需要用迭代器iterator的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态
- for循环增强
Map
- Map接口特点
Map存放数据一对k-v是放在一个Node中的,又因为Node实现了Entry接口,有些书上也说是一对k-v就是一个Entry - Map接口常用方法
- put
- remove
- get
- size
- isEmpty
- clear
- containsLey
- HashMap
- 线程不安全
- jdk 1.7 中采用 数组+链表数据结构,头插法插入数据
- jdk 1.8 中采用 数组+链表+红黑树数据结构,尾插法插入数据
- 扩容机制:初始容量16,LoadFactory默认为0.75,扩容时会创建一个空数组重新Hash计算,Hash公式和长度有关
- 初始容量为2的幂次的好处:方便位运算和均匀分布
- 重写equals必须重写HashCode
- Hashtable
- 线程安全
- 键值都不能为null
- 扩容机制:底层数组初始化大小为11,LoadFactory默认是0.75,扩容后大小为2倍加1
- LinkedHashMap
- TreeMap
- Properties
- Hashtable的子类
- 可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改
Collections
- 工具类中提供的均为static方法
- reverse(List)
- shuffle(Lisy):对List集合元素进行随机排序
- sort(List)
- swap(List,int,int)交换元素