数组的特征:
数组是(相同类型的数据)的(有序)(集合);
数组会在内存中开辟一块连续的空间,每个空间相当于一个变量,称为数组的元素element;
数组元素的表示 数组名[索引号];
索引从0开始,依次累加;
每个元素都有默认值 int 0、double 0.0、boolean false;
数组是有序的、索引是有顺序的;
数组只能存放一种类型的数据;
数组的长度用 length表示;
数组的长度是固定的,一旦确定,无法修改;
集合的特征:
可扩容、集合可以放不同类型的数据。
List集合特点: 有序、元素可重复
ArrayList 底层是动态数组、查询快、增删慢、线程不安全、效率高
LinkedList 底层是链表、查询慢、增删快、线程不安全、效率高
Vector 底层是数组、查询快、增删慢、线程安全、效率低
Set集合特点:无序、元素不可重复
HashSet 底层是哈希表
哈希表唯一依赖两个方法:hashCode(),equals();
向HashSet集合中放入新元素的执行顺序:
1、调用Hashcode()函数,看是否已经有相同的哈希值
2、如果没有则放入该新元素,如果有则调用equals()函数逐个比对,如果没有,则放入,如果有,则不执行添加元素操作
LinkedHashSet 底层是:哈希表(元素不可重复)+链表
(有序,因为链表记录每个元素都记录后一个元素的地址)
TreeSet 底层是红黑树,自然平衡二叉树,因为是二叉树结构所以集合内元素自动按升序排列(升序是其最大特征)、元素不可重复
Map集合特点:key-value形式(键+值成对存储).
Map不是collection的子接口或者实现类,Map是一个接口。
Map可能会持有相同的值对象但其对应的键对象必须是唯一的。
TreeMap通过Comparator或者Comparable维护了一个排序顺序。即有序、线程不安全。
HashMap 非同步的(no synchronize)、可以接受null的键值和值、由数组+链表组成、无序、线程不安全。‘
HashMap:根据键的hashCode值存储数据,有很快的访问速度,但是遍历顺序是不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。
HashMap线程不安全。
HashMap是数组+链表+红黑树(jdk1.8增加了红黑树部分)实现的,
链表长度大于8时转换为红黑树。
Node[]table哈希桶数组的初始长度length 默认值是16
Load factor 为负载因子 默认值为0.75
threshold所能容纳的最大数据量的Node(键值对)的个数
threshold=length*Load factor
超过这个threshold容量就要进行扩容resize
扩容后的HashMap容量是之前容量两倍。
负载因子尽量不要改变,根据需求也可以适当改变,负载因子的值可以大于1
size实际存在的键值对数量
modCount字段主要记录HashMap内部结构发生变化的次数。
HashMap,哈希数组table的长度length的大小必须是2的n次方(一定是合数)
防止链表过长影响HashMap性能,jdk1.8引入了红黑树
利用红黑树快速增删改查的特点。
取key的hashCode值、高位运算、取模运算。