因为此文章用于博主的复习,所以就不介绍集合是什么,什么时候用到以及为什么要用。
直接进入干又硬的知识点
List(列表)是有序的集合,它允许重复的元素。
1.LinkedList:基于链表实现,链表内存是散列的,增删快,查找慢;
2.ArrayList:基于数组实现,非线程安全,效率高,增删慢,查找快;
3.Vector:基于数组实现,线程安全,效率低,增删慢,查找慢;
ArrayList | LinkedList | Vector | |
---|---|---|---|
底层实现 | 数组 | 双向链表 | 数组 |
同步性及效率 | 不同步,非线程安全,效率高,支持随机访问 | 不同步,非线程安全,效率高 | 同步,线程安全,效率低 |
特点 | 查询快,增删慢 | 查询慢,增删快 | 查询快,增删慢 |
默认容量 | 10 | / | 10 |
扩容机制 | int newCapacity = oldCapacity + (oldCapacity >> 1);//1.5 倍 | / | 2 倍 |
1.HashMap:基于哈希表的实现,是使用频率最高的用于键值对处理的数据类型。它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,特点是访问速度快,遍历顺序不确定,线程不安全,最多允许一个key为null,允许多个value为null。
2.HashTable:线程安全,低效,不支持 null 值和 null 键;
3.LinkedHashMap: LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。
4.TreeMap:能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
HashMap | HashTable | TreeMap | |
---|---|---|---|
底层实现 | 哈希表(数组+链表) | 哈希表(数组+链表) | 红黑树 |
同步性 | 线程不同步 | 同步 | 线程不同步 |
null值 | 允许 key 和 Vale 是 null,但是只允许一个 key 为 null,且这个元素存放在哈希表 0 角标位置 | 不允许key、value 是 null | value允许为null。 当未实现 Comparator 接口时,key 不可以为null 当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。如果针对null情况实现了,可以存入,但是却不能正常使用get()访问,只能通过遍历去访问。 |
hash | 使用hash(Object key)扰动函数对 key 的 hashCode 进行扰动后作为 hash 值 | 直接使用 key 的 hashCode() 返回值作为 hash 值 | |
容量 | 容量为 2^4 且容量一定是 2^n | 默认容量是11,不一定是 2^n | |
扩容 | 两倍,且哈希桶的下标使用 &运算代替了取模 | 2倍+1,取哈希桶下标是直接用模运算 |
1.HashSet:底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
2.LinkedHashSet: 底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。
3.TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序,唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
HashSet | TreeSet | LinkedHashSet | |
---|---|---|---|
底层实现 | HashMap | 红黑树 | LinkedHashMap |
重复性 | 不允许重复 | 不允许重复 | 不允许重复 |
有无序 | 无序 | 有序,支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。 | 有序,以元素插入的顺序来维护集合的链接表 |
时间复杂度 | add(),remove(),contains()方法的时间复杂度是O(1) | add(),remove(),contains()方法的时间复杂度是O(logn) | LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet,时间复杂度是 O(1)。 |
同步性 | 不同步,线程不安全 | 不同步,线程不安全 | 不同步,线程不安全 |
null值 | 允许null值 | 不支持null值,会抛出 java.lang.NullPointerException 异常。因为TreeSet应用 compareTo() 方法于各个元素来比较他们,当比较null值时会抛出 NullPointerException异常。 | 允许null值 |
比较 | equals() | compareTo() | equals() |
- public class CollectionExample {
- public static void main(String[] args) {
- // 创建一个 ArrayList
- ArrayList
fruits = new ArrayList<>(); -
- // 添加元素
- fruits.add("苹果");
- fruits.add("香蕉");
- fruits.add("橙子");
-
- // 删除元素
- fruits.remove("香蕉");
-
- // 遍历元素
- for (String fruit : fruits) {
- System.out.println(fruit);
- }
- }
- }
Iterator接口,用于遍历集合元素的接口。
- public static void main(String[] args) {
- List
list1 = new ArrayList<>(); - list1.add("abc0");
- list1.add("abc1");
- list1.add("abc2");
-
- // while循环方式遍历
- Iterator it1 = list1.iterator();
- while (it1.hasNext()) {
- System.out.println(it1.next());
- }
-
- // for循环方式遍历
- for (Iterator it2 = list1.iterator(); it2.hasNext(); ) {
- System.out.println(it2.next());
Collections:集合工具类,方便对集合的操作。这个类不需要创建对象,内部提供的都是静态方法。
- Collections.sort(list);//list集合进行元素的自然顺序排序。
- Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。
- class ComparatorByLen implements Comparator
{ - public int compare(String s1,String s2){
- int temp = s1.length()-s2.length();
- return temp==0?s1.compareTo(s2):temp;
- }
- }
- Collections.max(list);//返回list中字典顺序最大的元素。
- int index = Collections.binarySearch(list,"zz");//二分查找,返回角标。
- Collections.reverseOrder();//逆向反转排序。
- Collections.shuffle(list);//随机对list中的元素进行位置的置换。
-
- //将非同步集合转成同步集合的方法:Collections中的 XXX synchronizedXXX(XXX);
- //原理:定义一个类,将集合所有的方法加同一把锁后返回。
- List synchronizedList(list);
- Map synchronizedMap(map);