1.数组数据类型
ArraysList底层是容量为10的数组,有索引
数组存满了会扩容,增长到原容量的1.5倍,扩容效率低,建议使用构造方法的时候指定容量
可以通过索引来增删查改元素
因为是数组结构,所以查询效率高,随机增删效率低,因为增删元素会变动整个数组
末尾增删元素效率不受影响
存元素的原理:
使用add()方法会把元素添加到ArraysList集合的末尾
可以存放重复的元素
取元素的原理:
因为ArraysList集合有索引,可以通过get()方法获取指定索引的元素
遍历ArraysList集合(显示的元素顺序和存入的顺序一样):
有索引,可以通过for循环
可以使用迭代器迭代
可以使用增强for
LinkList集合底层是默认没有容量的链表数据结构,有索引,但是检索,查找效率较低
随机增删效率高,因为增删元素的时候不会有大量元素位移
存元素的原理:
使用add()方法会把元素存入头节点,后续存入的元素会一一存入后面的节点
每个节点存2部分信息,一个是存上一个节点的地址,一个是存元素
可以存放重复的元素
取元素的原理:
因为LinkList集合有索引,可以通过get()方法获取指定索引的元素
遍历LinkList集合:
有索引,可以通过for循环
可以使用迭代器迭代
可以使用增强for
Vetor集合底层是一个初始容量为10的数组,扩容是原容量的2倍
Voctor中所有的方法都是线程同步的,都带有synchronized关键字
是线程安全的,但是效率比较低,使用较少
2.哈希表数据类型
HashMap和HashSet集合
HashMap集合的默认初始化容量是16(必须是2的倍数,为了达到散列分布均匀),
默认加载因子是0.75
底层是哈希表/散列表的数据结构,是一个数组和单向链表的结合体
重复发挥了数组查询效率高的优点和链表随机增删效率高的优点
HashMap底层是一个存放Node<K,V>类型的一维数组
HashMap.Node是HashMap类中的静态内部类,包含了哈希值,键,值,和下一个节点的内存地址
放在HashMap集合key部分的元素其实就是放到HashSet集合中了
HashMap集合的key部分特点
1.存入的元素无序,因为存入的元素的时候,会先计算元素的哈希值,再通过哈希算法转换成
数组的下标,所以不一定挂到那个数组的单项链表上
2.存入的元素不可重复,[存入的元素的类型的类需要重写hashCode方法+equals方法]
如果发现重复的元素会被覆盖
[重点:放在HashMap集合中key部分的元素,以及放在HashSet集合中的元素,
需要同时重写hashCode和equals方法]
HashMap存元素的原理:
调用map.put(k,v)方法
1.先把k,v封装到Node对象当中
2.底层会调用k的hashCode方法得出hash值
3.然后通过哈希算法,将hash值转换成数组下标
4.如果下标对应的位置有链表,此时会拿着k和链表上的每一个节点中的k进行equals
5.如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾
6.如果其中一个节点返回了true,那么这个节点的value将会被覆盖
HashMap取元素的原理
1.先调用hashCode方法得出哈希值
2.通过哈希算法转换成数组的下标,通过下标快速定位到某个上
3.如果这个位置上什么也没有,返回null
4.如果这个位置上有链表,那么会拿着参数k和单项链表上的每个节点中的k进行equals
5.如果所有equals方法返回false,那么get方法返回null
6.只要其中有一个节点的k和参数k equals时候返回true,
那么此时这个节点的value就是我们要找的value,get方法最终返回这个要找的value
遍历Map集合
方法一:可以获取Map集合中的所有key,通过遍历key,来遍历value
因为HashMap的key部分是HashSet集合,
最后迭代或循环:每遍历到Set集合的元素(key),取获取对应的值(value)
Set<Integer> keys = map.keySet();
方法二:把Map集合转换成Set集合
转换后的Set集合元素都是Map.Entry类型
同时也是node类型
key和value都是直接从node对象中获取的属性值
最后迭代或循环:遍历Set集合,每遍历到一个Node,获取对应的key和value
Set<Map.Entry<Integer,String>> set = map.entrySet();
jdk8对HashMap的改进:
如果哈希表单项链表中的元素超过8个
单项链表这种数据结构会变成红黑树数据结构
当红黑树上的节点数量小于6个的时候
会重新把红黑树变成单项链表数据结构
这是为了提高检索效率
(而成的检索会再次缩小扫描范围)
3.二叉树数据类型
TreeMap和TreeSet集合
TreeMap和TreeSet集合的底层是自平衡得到二叉树数据结构,存放顺序是左小右大
TreeMap和TreeSet集合采用的是中序遍历:左根右
存取元素的特点:
存储时顺序和取出的顺序不同
不可重复
存取的顺序会有一定规律
存放Integer类型,会升序方式存放
存放String,按照字典顺序,中文无法正常排序
存放没有实现Comparable接口的自定义类型,会出现类型转换异常
TreeSet集合存自定义类型的元素:
方法一:自定义类型继承Comparable接口,然后重写compareTo方法
方法二:自定义一个实现Comparator接口的比较器类,然后重写compareTo方法
最后创建TreeSet集合对象的时候传入比较器对象