概述
List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口
Set下有HashSet,LinkedHashSet,TreeSet
List下有ArrayList,Vector,LinkedList
Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
集合的概念:
对象的容器,和数组类似,定义了对多个对象进行操作的常用方法。
List 有序、有下标、元素可以重复
- ArrayList
底层数据结构是数组,查询快,增删慢,线程不安全,效率高 - LinkedList
底层数据结构是链表,查询慢,增删快,线程不安全,效率高 - Vector
底层数据结构是数组,查询快,增删慢,线程安全,效率低
Set 无序、无下标、元素不可重复
- HashSet (无序,唯一)
存储结构:哈希表(数组+链表+红黑树),通过hashCode和equals来保证元素唯一
特点
基于HashCode计算元素存放位置利用31这个质数,减少散列冲突31提高执行效率 31 * i = (i << 5) - i 转为移位操作当存入元素的哈希码相同时,会调用equals进行确认,如果结果为true,则拒绝后者存入 - TreeSet
存储结构:红黑树
特点
基于排列顺序实现元素不重复实现SortedSet接口,对集合元素自动排序,元素对象的类型必须实现Comparable接口,指定排序规则通过CompareTo方法确定是否为重复元素
Map 存储一对数据,无序、无下标,键不可重复,值可重复
1.HashMap
JDK1. 2版本,线程不安全,运行效率快;允许用null作为key或是value。
原码分析总结:
-
HashMap刚创建时,table是null,节省空间,当添加第一个元素时,table容量调整为16
-
当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后的大小为原来的两倍,目的是减少调整元素的个数
-
jdk1.8 当每个链表长度 大于8 ,并且数组元素个数大于等于64时,会调整成红黑树,目的是提高效率
-
jdk1.8 当链表长度 小于6 时 调整成链表
-
jdk1.8 以前,链表时头插入,之后为尾插入
-
Hashtable
JDK1.0版本,线程安全,运行效率慢;不允许null作为key或是value。 -
Properties
Hashtable的子类,要求key 和value都是String。通常用于配置文件的读取。 -
TreeMap
实现了SortedMap接口(是Map的子接口),可以对key自动排序。泛型
-
本质是参数化类型,把类型作为参数传递
-
常见形式有泛型类、泛型接口、泛型方法
-
语法 T成为类型占位符,表示一种引用类型,可以写多个逗号隔开
-
好处 1. 提高代码重用性 2. 防止类型转换异常,提高代码安全性
泛型集合
概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致
特点:
- 编译时即可检查,而非运行时抛出异常
- 访问时,不必类型转换(拆箱)
- 不同泛型之间应用不能相互赋值,泛型不存在多态
Collections 集合工具类,定义了除了存取以外的集合常用方法
copy复制、reverse反转、shuffle打乱
// list转成数组
Integer[] arr = list.toArray(new Integer[10]);
sout(arr.length);
sout(Array.toString(arr));
// 数组转成集合
// 此时为受限集合,不能 添加和删除!
String[] name = {"张三","李四","王五"};
List<String> list2 = Arrays.asList(names);
// 把基本类型数组转为集合时,需要修改为包装类
Integer[] nums = {100, 200, 300, 400, 500};
List<Integer> list3 = Arrays.asList(nums);