集合
-
集合的概念 对象的容器,定义了对多个对象进行操作的常用方法,类似数组的功能
-
集合和数组的区别
-
数组长度固定,集合长度不固定
-
数组可以存储基本类型和引用类型,集合只能存储引用类型
-
位置:java.util.*
迭代器
专门用来遍历集合的一种方式
-
hasNext():有下一个元素则返回true,否则返回false;
-
next():获取下一个元素;
-
remove()删除元素;
List集合
-
特点:有序有下标,可重复
-
List实现类:
-
ArrayList:
-
数组结构实现,必须开辟连续空间,查询快、增删慢;
-
JDK1.2版本,运行效率快、线程不安全。 源码分析:
-
DEFAULT_CAPACITY = 10 默认容量; 注意:如果没有向集合中添加任何元素时,容量0;添加一个元素之后容量为10,超出再按1.5倍扩容。
-
elementData 存放元素的数组;
-
size 实际元素个数;
-
add() 添加元素
-
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
-
Vector:
-
数组结构实现,查询快、增删慢;
-
JDK1.0版本,运行效率慢、线程安全。
-
-
LinkedList:
-
链表结构实现,无需开辟连续空间,增删快,查询慢。 源码分析
-
int size:集合的大小
-
Node first:链表的头节点
-
Node last:链表的尾节点
-
void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } 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; } }
Set集合
1.特点:无序、无下标,不可重复 2.Set实现类:
-
HashSet:
-
基于HashCode计算元素存放位置。
-
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。
-
-
TreeSet:
-
基于排列顺序实现元素不重复。
-
实现了SortedSet接口,对集合元素自动排序。
-
元素对象的类型必须实现Comparable接口,指定排序规则。
-
通过CompareTo方法确定是否为重复元素。
-
Map集合
1.特点:
-
用于存储任意键值对(key-value)
-
键:无序、无下标、不允许重复(唯一)
-
值:无序、无下标、允许重复 2.Map实现类:
-
HashMap:
-
JDK1.2版本,线程不安全,运行效率快;允许用null作为key或是value 源码分析 DEFAULT_INITIAL_CAPACITY=1 << 4 默认初始容量大小 16 MAXIMUM_CAPACITY=1 << 30 最大容量大小 DEFAULT_LOAD_FACTOR = 0.75f 默认加载因子 0.75 TREEIFY_THRESHOLD = 8 jdk1.8当链表长度大于8时,调整成红黑树 UNTREEIFY_THRESHOLD = 6 jdk1.8当链表长度小于6时,调整成链表 MIN_TREEIFY_CAPACITY = 64 jdk1.8当链表长度大于8时,并且集合元素个数大于等于64时,调整成红黑树 transient Node<K,V>[] table;哈希表中的数组 size 元素个数 1) HashMap刚创建时,table是null,为了节省空间,当添加第一个元素时,table容量调整为16 2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍,目的是减少调整元素的个数 3)jdk1.8当每个链表长度大于8,并且元素个数大于等于64时,会调整为红黑树,目的提高执行效率 4)jdk1.8当链表长度小于6时,调整成链表 5)jdk1.8以前,链表是头插入,jdk1.8以后是尾插入
-
-
Hashtable:
-
JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value
-
-
Properties:
-
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。
-
-
TreeMap:
-
实现了SortedMap接口(是Map的子接口),可以对key自动排序
-
Collections:
-
集合工具类,定义了除了存取以外的集合常用方法。