bilibili视频地址:https://www.bilibili.com/video/BV1zD4y1Q7Fw?p=43.
对应笔记地址:https://lazydog036.gitee.io/2020/10/29/JAVA%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/.
总结:
1 List
特点:有序、有下标、元素可以重复。
方法:
void add(int index,Object o) //在index位置插入对象o。
boolean addAll(index,Collection c) //将一个集合中的元素添加到此集合中的index位置。
Object get(int index) //返回集合中指定位置的元素。
List subList(int fromIndex,int toIndex) //返回fromIndex和toIndex之间的集合元素。
1.1 ArrayList
- 数组结构实现,查询块、增删慢;
- JDK1.2版本,运行效率快、线程不安全。
- 默认容量大小:private static final int DEFAULT_CAPACITY = 10;当没有向集合中添加任何元素时容量是0,添加第一个元素时变为10.
- 存放元素的数组:transient Object[] elementData;
- 实际元素个数:private int size;
- 扩容速度:newCapacity = oldCapacity + (oldCapacity >> 1);变为原来的1.5倍。
1.2 Vector
- 数组结构实现,查询快、增删慢;
- JDK1.0版本,运行效率慢、线程安全。
1.3 LinkedList
- 链表结构实现(双向链表),增删快,查询慢。
2 Set
- 特点:无序、无下标、元素不可重复。
- 方法:全部继承自Collection中的方法。
2.1 HashSet
- 基于HashCode计算元素存放位置。
- 根据hashCode计算保存的位置,如果位置为空,则直接保存,否则执行第二步。
- 执行equals方法,如果方法返回true,则认为是重复,拒绝存储,否则形成链表。
- 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
- 本质为HashMap,将值存进Map的K中。
2.2 TreeSet
- 基于排序顺序实现不重复。
- 实现了SortedSet接口,对集合元素自动排序。
- 元素对象的类型必须实现Comparable接口,指定排序规则。
- 通过CompareTo方法确定是否为重复元素。
- 可以在创建TreeSet时给出排序规则:public TreeSet(Comparator<? super E> comparator)
-
- 本质为TreeMap,将值存进Map的K中。
3Map
- 用于存储任意键值对(Key-Value)。
- 键:无序、无下标、不允许重复(唯一)。
- 值:无序、无下标、允许重复。
- 方法:
V put(K key,V value)//将对象存入到集合中,关联键值。key重复则覆盖原值。
Object get(Object key)//根据键获取相应的值。
Set<K>//返回所有的key
Collection<V> values()//返回包含所有值的Collection集合。
Set<Map.Entry<K,V>>//键值匹配的set集合
3.1 HashMap
- 线程不安全,运行效率快;允许用null作为key或是value。
- 默认初始化容量:static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
- 并不是初始化完就拥有16个空间,当添加第一个元素时变为默认初始化容量
- 数组最大容量:static final int MAXIMUM_CAPACITY = 1 << 30;
- 默认加载因子:static final float DEFAULT_LOAD_FACTOR = 0.75f;
- 就是判断数组是否扩容的一个因子。假如数组容量为100,如果HashMap的存储元素个数超过了100*0.75=75,那么就会进行扩容。
- 扩容速度:每次扩容都是原来大小的两倍
- 链表调整为红黑树的链表长度阈值(JDK1.8):static final int TREEIFY_THRESHOLD = 8;
- 红黑树调整为链表的链表长度阈值(JDK1.8):static final int UNTREEIFY_THRESHOLD = 6;
- 链表调整为红黑树的数组最小阈值(JDK1.8):static final int MIN_TREEIFY_CAPACITY = 64;
- 并不是只要链表长度大于8就可以转换成红黑树,在前者条件成立的情况下,数组的容量必须大于等于64才会进行转换。
- HashMap存储的数组:transient Node<K,V>[] table;
- HashMap存储的元素个数:transient int size;
- Node:
static class Node<K,V> implements Map.Entry<K,V> { final K key; V value; Node<K,V> next; }
3.2 TreeMap
- 实现了SortedMap接口(是Map的子接口),可以对key自动排序。
-
- 元素对象的类型必须实现Comparable接口,指定排序规则。
- 通过CompareTo方法确定是否为重复元素。
- 可以在创建TreeSet时给出排序规则: public TreeMap(Comparator<? super K> comparator)