Collections类
* 类的特点
* 针对Collection集合的工具类
* 类的位置
* java.util
* 类的构造器
* 构造器私有化
* 类的方法
* public static <T> boolean addAll(Collection<? super T> c,T... elements)
* 将所有指定元素添加到指定 collection 中。
* public static void reverse(List<?> list)
* 反转指定列表中元素的顺序。
* public static void shuffle(List<?> list)
* 使用默认随机源对指定列表进行置换。
* public static <T extends Comparable<? super T>> void sort(List<T> list)
* 根据元素的自然顺序 对指定列表按升序进行排序。
* public static <T> void sort(List<T> list,Comparator<? super T> c)
* 根据指定比较器产生的顺序对指定列表进行排序
Vector类
* 类的特点
* 1.Vector集合底层数据结构是数组结构
* 2.Vector集合可以存储null元素,在使用Vector集合元素之前,先针对元素进行非空校验,防止空指针异常
* 3.Vector集合是线程安全的集合,只适用于多线程程序,如果在单线程中进行使用,执行效率低
* 4.Vector集合是有序的集合
* 有序集合:存储元素的顺序和获取元素的顺序是一致的
* 5.Vector集合是含有索引集合
* 6.Vector集合可以存储重复元素
* 7.Vector集合适用于List集合的6种遍历方式
* 类的位置
* java.util
* 类的构造器
* public Vector()
* 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
* 类的方法
* 详见Collection接口和List接口常用方法
ArrayList集合和Vector集合的区别
* 1.线程安全性:
* ArrayList集合:ArrayList集合是线程不安全的集合,只适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
* Vector集合:Vector集合是线程安全的集合,只适用于多线程程序,如果在单线程中进行使用,执行效率低
* 2.无参构造器底层的初始容量
* ArrayList集合:
* JDK6.0(包含)以前:
* 初始容量:10
* JDK7.0(包含)以后:
* 初始容量:0
* Vector集合:
* 初始容量:10
* 3.底层数组影响扩容的因素不同
* ArrayList集合:是否为第一次扩容
* Vector集合:增量参数是否大于0
* 4.底层数组的扩容规则不同
* ArrayList集合:
* JDK6.0(包含)以前:
* 扩容原理:(原来数组长度 * 3)/2 + 1;
* JDK7.0(包含)以后:
* 扩容原理:
* 第一次添加元素时:
* 扩容原理:10
* 后续添加元素时:
* 原来数组长度 + (原来数组长度 >> 1);
* Vector集合:
* 当增量参数 > 0:
* 扩容原理:
* 原来数组长度 + 增量参数;
* 当增量参数 <= 0;
* 扩容原理:
* 原来数组长度 + 原来数组长度;
LinkedList类
* 类的特点
* 1.LinkedList集合底层的数据结构为"链接列表结构",并且是一个"双向链接列表结构"
* 2.LinkedList集合可以存储null元素,在使用集合中元素之前需要进行非空校验,防止空指针异常
* 3.LinkedList集合不是线程安全的,适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
* 4.LinkedList集合是有序的集合
* 有序集合:存储元素的顺序和获取元素的顺序是一致的
* 5.LinkedList集合是含有索引集合
* 6.LinkedList集合可以存储重复元素
* 7.LinkedList集合适用于List集合的6种遍历方式
* 类的位置
* java.util
* 类的构造器
* public LinkedList()
* 构造一个空列表。
* 类的方法
* public void addFirst(E e)
* 将指定元素插入此列表的开头。
* public void addLast(E e)
* 将指定元素添加到此列表的结尾。
* public E getFirst()
* 返回此列表的第一个元素。
* public E getLast()
* 返回此列表的最后一个元素。
* public E removeFirst()
* 移除并返回此列表的第一个元素。
* public E removeLast()
* 移除并返回此列表的最后一个元素。
Set接口
* 接口的特点
* 1.Set接口下所有集合不可以存储重复元素
* 2.Set接口下所有集合既有有序的集合,也有无序的集合
* 3.Set接口下所有集合没有索引
* 4.Set即可下所有集合只有4种遍历方式
* 详见Collection集合的遍历方式
* 接口的位置
* java.util
* 接口的方法
* 详见Collection接口的常用方法
HashSet类
* 类的特点
* 1.HashSet集合底层封装一个HashMap实例
* HashMap集合底层的数据结构:哈希表
* JDK7.0(包含)以前:
* 存储链接列表对象的数组
* JDK8.0(包含)以后
* 存储链接列表对象或红黑树对象的数组
* 2.HashSet集合是无序的集合
* 3.HashSet集合无法保证元素在集合中的顺序永远不会改变
* 原因:元素的存储顺序和底层数组的长度有关,一旦数组发生扩容或缩减元素的位置有可能发生变化
* 4.HashSet集合可以存储null元素,使用集合元素时,需要进行非空校验,防止空指针异常
* 5.HashSet集合是线程不安全的,适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
* 类的位置
* java.util
* 类的构造器
* public HashSet()
* 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
* 类的方法
* 详见Collection接口的常用方法
HashSet集合如何过滤重复元素
* 1.HashSet集合过滤重复元素和地址值无关
* 2.HashSet集合过程重复元素和hashCode()有关,重写Object类的hashCode()
* 3.HashSet集合过程重复元素和equals()有关,重写Object类的equals()
* 重写hashCode()时重要参数为什么是31?
* 1.为了减少hashCode值的重复概率,这个数必须是质数
* 2.这个数不宜过小(原因:过小增大重复概率)
* 3.这个数不宜过大(原因:过大会有可能超出int范围,造成数据的精度的损失,增大重复概率)
* 4.通过"泊松分布"计算出数字29和31是较为合适的数字
* 5.通过数学科学计数法的改写,29可以写成2^5-3,31可以写成2^5-1,31的格式和整数取值范围相似或者二进制满位原因,最终选择31
LinkedHashSet类
* 类的特点
* 1.LinkedHashSet集合是有序的集合
* 2.LinkedHashSet集合底层的数据结构是"哈希表 + 链表"
* 链表:维护着LinkedHashSet集合有序
* 3.LinkedHashSet集合可以存储null元素,使用集合元素时,需要进行非空校验,防止空指针异常
* 4.LinkedHashSet集合是线程不安全的,适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
* 类的位置
* java.util
* 类的构造器
* public LinkedHashSet()
* 构造一个带默认初始容量 (16) 和加载因子 (0.75) 的新空链接哈希 set。
* 类的方法
* 详见Collection接口的常用方法
红黑树数据结构:
* 含义:
* 带有红结点和黑结点的二叉树结构,其实也是程序中比较特殊的类
* 特点:
* 1.查询效率高,增删效率高
* 2.结点对象可以根据int数据进行大小排序
* 设计:
* 当前元素(泛型)
* 父结点对象(结点对象类型)
* 子左结点对象(结点对象类型)
* 子右结点对象(结点对象类型)
* 颜色属性(boolean)
* 注意:
* 红黑树数据结构适用于数据量较多时候,不适合少量数据
* 红黑树数据结构中的每个结点比较数据必须落实在"int类型"
TreeSet类
* 类的特点
* 1.TreeSet集合底层的数据结构"红黑树"
* 2.使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序
* 3.TreeSet集合是无序的集合,存储元素顺序和获取顺序不一致
* 4.TreeSet集合不可以存储null元素,添加元素时需要针对每个待添加元素进行非空校验,防止空指针异常
* 5.TreeSet集合是线程不安全的集合,适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
* 类的位置
* java.util
* 类的构造器
* public TreeSet()
* 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
* public TreeSet(Comparator<? super E> comparator)
* 构造一个新的空 TreeSet,它根据指定比较器进行排序。
* 类的方法
* 详见Collection集合的常用方法
* 注意事项:
* 针对TreeSet中元素类型必须定义比较器(手动编写比较规则)
* 自然顺序比较器
* 实现Comparable<T>接口,重写compareTo(T o)
* 定制顺序比较器
* 实现Comparator<T>接口,重写int compare(T o1,T o2)
自然顺序比较器
* 实现Comparable<T>接口,重写compareTo(T o)
*
* 步骤:
* 1.TreeSet集合元素的类型实现Comparable<T>接口
* 2.TreeSet集合元素的类型中重写Comparable<T>接口的compareTo(T o),指定比较规则