目录标题
集合
1、ArrayList
1.1初始化(new)
- 在指定长度(有参构造器)时在创建对象时会创建对应的数组
- 没有指定长度(空参构造器)时在创建对象时,不创建数组
- 当第一次调用add()方法时,会默认创建容量为10的集合
//指定数组大小容量
ArrayList list = new ArrayList(7);
//-------------源码
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//不指定
ArrayList list1 = new ArrayList();
//-----------------源码
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
1.2、扩容
- 扩容为原来的1.5倍
注意:当使用空参构造器创建ArrayList时,一开始时没有给List创建存储数组的,在第一次调用add()方法时创建
1.3、特点
- 不是线程安全的
- 查询、修改效率高(根据下标查询indexOf();根据下标修改add(index,value))
2、Vector
Vector实现上与ArrayList相似,只是Vector是线程安全的,因为Vector中许多方法都被synchronized修饰,因此这些方法变成了同步方法
特点:
1、Vector 线程安全
2、效率比较低
3、LinkedList
1、LinkedList使用节点进行存储数据
2、节点中存在数据域和指针域
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
3.1、初始化
初始化时不创建第一个节点,当调用第一次add()方法时才创建表头。
3.2、特点
- 容量理论上是没有限制的
- 通过节点的指针可以快速获取临近节点
- 添加和删除效率高、遍历(查询)效率低
- 不是线程安全的
4、HashSet
HashSet 底层使用HashMap实现的(甚至可以说两者共用代码)。
HashSet是利用HashMap中的key进行存储。
4.1、特点
- 无序性(不是随机性)
- 不可重复
- 线程不安全
4.2、初始化
- jdk1.7前在new时创建初始容量为16的Node<K,V>[ ]数组
- jdk1.8以后是在第一次put()时创建长度为16的Node<K,V>[ ]数组
4.3、扩容——原来的2倍
- HashSet里面有几个重要的常量:
- DEFAULT_LOAD_FACTOR 默认的加载因子:0.75(这个加载因子决定了数组什么时候扩容)
- DEFAULT_INITIAL_CAPACITY HashMap(HashSet就是用HashMap实现的)的初始容量:16
- threshold 扩容临界值:threshold = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR
当 Node<K,V>[ ]数组的长度大于等于扩容临界值(threshold)时, Node<K,V>[ ]数组会扩容为原来的两倍。为什么不是等到容量到达最大容量时扩容呢?因为节点插入的位置是根据 i = (n - 1) & hash 计算出来的。因此不一定能恰好将数组所有的位置填满。
4.4、如何确保加入的元素是唯一的
注意:如果添加的元素是自定义类的对象需要重写hashCode()和equals()方法,否者HashSet无法判断两个对象是否相等。因为hash值是通过hashCode()计算出来的。像String 的 equals()是重写过的。
5、LinkedHashSet
LinkedHashSet与HashSet实现原理相似,只是LinkedHashSet的节点添加了before节点和after节点,这两个节点用来记录此节点的前节点和后节点的地址(引用)
5、TreeSet
TreeSet多用于排序,TreeSet是一颗树。
规定左节点比根节点小,右节点比根节点大
6、HashMap
HashMap的实现原理于HashSet一致。
先判断key是否(存在)添加过。不存在直接将key、value以node节点的方式存储到数值中,如果key存在,就将value的值替换。
6.1、扩容
- jdk7 :底层结构是数组+链表
- jdk8:底层是数组+链表+红黑树
- 何时将链表转换为红黑树:当链表的长度大于8且整个数组的长度大于64时,将链表转换为红黑树(为了加快搜索速度,链表过长不利于遍历)
7、HashTable
特点:
1、线程安全
2、kay和value都不能为null
8、HashTable的子类——Properties
特点:用于读取.Properties文件,结合io流使用
FileInputStream fileInputStream = new FileInputStream("src/classreflex/jdbc.properties");
Properties properties = new Properties();
properties.load(fileInputStream);
String user = properties.getProperty("user");
System.out.println(user);
String password = properties.getProperty("password");
System.out.println(password);