内存中连续的,大小固定的内存空间,可以用来包村相同类型的多个元素
复制数组的一个系统函数 System.arraycopy native修饰的,c/c++ 实现,纯内存赋值,效率很高
数组工具类Arrays
asList 返回一个受指定数组支持的固定大写哦的列表 sort 使用快排实现 binarySearch 二分查找 CopyOf 赋值数组,截取或者用(false,0,null)填充 copyOfRange 将指定数字范围赋值到一个新的数组 toString 转成字符串 equals 判断是否相等 fill 将指定的值分配给每个元素 hascode 返回哈希码集合
集合的层次结构
集合 Collection接口 List接口 ArrayList类 linkedList类 Vector类 Stack类 AttributeList类 set接口 HashSet类 linkedHashSet类 TreeSet类 Queue接口 队列 Deque接口 双向队列 Map接口 HashMap类 linkedHashMap类 HashTree类 TreeMap类 ConcurrentHashMap类 Attribute Properties
各个实现类
底层实现 如何扩容 是否允许空值(和空键) 是否有序 是否线程同步collection接口
public interface Collection extends Iterable 代表泛型,只能是类,不能是基本数据类型
Collection是一个根接口,实现Iterable接口,所以它下面的都可以使用迭代器进行遍历
JDK不提供此接口的任何直接实现,只是对集合的同意规定
List接口
元素是有序的,可以用index访问,允许元素重复,允许null
方法
add addAll clear contains(Object o) 判断是否包含该元素 equals hashCode isEmpty 判断是否为空 iterator 返回迭代器 get(index) 返回元素下标 indexOf/lastIndexOf 查找元素的下标 remove 删除某位置的元素,如果有相同的情况,则删除第一个 set 用指定元素替换指定为值的的元素 subList(int fromIndex,int toIndex) 返回从fromIndex(包括)到toIndex(包括)之间的部分 size 返回元素数量 toArray() 转化为数组
实现类以及实现类的特点
ArrayList 实现可变数组,底层使用数组保存,访问效率高,插入和删除效率低 是线程不同步的 初始长度为0 ,长度不足时,使用System.arrayCpy来扩容 可以使用trimToSize将容量调节为当前列表大小 linkedList 底层使链表保存,访问效率低,插入删除效率高 双向链表,实现了Queue接口和Deque接口 Vector 底层使用数组保存 是线程同步的 Stack 栈
遍历
循环生成下标增强for循环使用迭代器
迭代器的使用
- 通过iterator方法来获取集合的迭代器通过iterator的hasnext()判断是否可以取出元素next取出元素remove删除当前被迭代的元素
Set接口
元素不一定有序,不一定允许空值(都要看具体的实现类),不允许重复
方法
add addAll clear contains(Object o) 判断是否包含该元素 equals hashCode isEmpty 判断是否为空 iterator 返回迭代器 remove(Object o) 删除指定元素 size 返回元素数量 toArray() 转化为数组
实现类
HashSet 底层使用HashMap实现 不保证set的迭代顺序,特别是它不保证顺序恒久不限,是一个无序的集合 添加顺序于迭代顺序无关 允许null(最多只能一个) 默认初始容量为16,加载因子为0.75 add时,如果要插入的已经存在,不更改set,返回false,不存在则添加指定元素,返回true linkedHashSet 元素的迭代顺序是元素的添加顺序 与HashSet不同的是,它维护着一个运行于所有条目的链表 TreeSet 底层是一个MapTree 自然顺序 数值型 char要转成相应的int再比较 引用型 可以定义对象Comparator方法也可以实现Comparator接口 迭代顺序按照自然顺序
遍历
使用增强for循环使用迭代器 Map接口
Map
特点:键不可以重复,每个键最多只能映射一个值
Map.Entry 代表一组映射冠词,Map集合也可以看作是Entry的集合
实现类
HashMap 初始容量为16,加载因子为0.75 加载因子是用来指定扩容的时机,当超过当前容量的0.75,则扩容为当前容量*2,StringBuilder是*2+2 底层基于Hash表的,允许空值和空键的存在,是无序的,非线程同步的 linkedHasMap 底层采用Hash表和双向链表 双向链表负责维护键的顺序,按照插入键的顺序 HashTable 扩容时,当前容量*2+1 基于Hash表,不允许空值和空,无序的,线程同步的(全局锁) TreeMap 基于红黑树的实现 按照键的自然顺序排序 ConcurrentHashMap 与HashTable一样,但是currentHashTable是分段锁,所以效率更高一点
解决冲突的方式 链地址法
HashMap 的底层实现
数组/位桶,初始表,初始容量就是数组的长度链表,解决哈希冲突,当元素发生冲突的时候,就被存放在链表中红黑树
当链表长度达到8时,转化为红黑树,提高元素再链表中的查找效率
红黑树结点减少到6个时,红黑树转化为链表
在较低的开销下,实现较快的查找O(logn)
遍历
使用Entry 使用键 使用值(但是无法操作键)



