[关闭]
@MRsunhuimin 2021-10-22T17:25:59.000000Z 字数 3370 阅读 174

集合框架和泛型总结

总结

0. Collection接口


Collection接口: List接口 + Set接口
(Collection 接口存储一组不唯一,无序的对象)

List接口:ArrayList集合 + LinkedList集合
(List 接口存储一组不唯一,有序(插入顺序)的对象)

Set接口:HashSet集合 + TreeSet集合
(Set 接口存储一组唯一,无序的对象) 

Map接口:HashMap集合 + TreeMap集合
(Map接口存储一组键值对象,提供key到value的映射) 

1. List接口

1.List的长度可变。 

2.List集合像一个数组,是有序的。保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

3.可以插入多个null元素

4.ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高

5.LinkedList采用链表存储方式,插入、删除元素时效率比较高

6.List可以通过index知道元素的位置,它允许元素的重复。ArrayList, LinkedList,  Vector可以实现List接口。

2. Set接口

1.无序容器,你无法保证每个元素的存储顺序

2.TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。

3.只允许一个 null 元素

4.Set集合是无序的,元素不允许重复。HashSet, LinkedHashSet,TreeSet 可以实现Set接口。

如何遍历Set集合?

方法1:通过迭代器Iterator实现遍历 
获取Iterator :Collection 接口的iterator()方法
Iterator的方法
boolean hasNext(): 判断是否存在另一个可访问的元素 
Object next(): 返回要访问的下一个元素

方法2:增强型for循环

3. Map接口

建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作

1. Map不是collection的子接口或者实现类。Map是一个接口。

2. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。

3. Map(interface): 使用键值对(key-value),                                 值(value)可以重复,键(key)不可以重复。HashMap, LinkedHashMap, Hashtale, TreeMap可以实现Map接口。

4. HashMap对象的key、value值均可为null。

5. (HahTable对象的key、value值均不可为null。
且两者的的key值均不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。)

6.HashMap和HashTable的区别和联系
    6.1 HashMap是非线性安全,HashTable是线性安全的
    6.2 HashMap的键和值都允许为null,HashTable则不行
    6.3 因为线程安全问题,HashMap的效率较高
    6.4 HashMap不是同步的,HashTable是同步的。因此,HashMap更适合于单线程环境,HashTable更适合于多线程环境。
    6.5 一般现在不建议用HashTable,一是HashTable是遗留类,内部实现很多没优化和冗余,二是即使在多线程环境下,现在也有ConcurrentHashMap替代。

遍历Map集合方法

方法1:通过迭代器Iterator实现遍历 
方法2:增强型for循环
方法3:键值对

4. 泛型

什么是泛型?

    泛型:「把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型」

泛型擦除是什么?

    因为泛型其实只是在编译器中实现的而虚拟机并不认识泛型类项,所以要在虚拟机中将泛型类型进行擦除。也就是说,「在编译阶段使用泛型,运行阶段取消泛型,即擦除」。擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。

如何解决以下强制类型转换时容易出现的异常问题

1.List的get(int index)方法获取元素
2.Map的get(Object key)方法获取元素
3.Iterator的next()方法获取元素

通过泛型

JDK5.0使用泛型改写了集合框架中的所有接口和类

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性。

泛型的本质是参数化类型。

泛型集合可以约束集合内的元素类型 

典型泛型集合ArrayList<E>、HashMap<K,V>                             <E>、<K,V>表示该泛型集合中的元素类型

泛型集合中的数据不再转换为Object

除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样

5. Collections算法类

Java集合框架将针对不同数据结构算法的实现都保存在工具类中

Collections类定义了一系列用于操作集合的静态方法

Collections类常用方法

Collections和Collection不同,前者是集合的操作类,后者是集合接口

Collections提供的常用静态方法
    sort():排序
    binarySearch():查找
    max()\min():查找最大\最小值

Collections排序

Collections类可以对集合进行排序、查找和替换操作

实现一个类的对象之间比较大小,该类要实现Comparable接口

重写compareTo()方法

6. 总结

1.Collection 、List 、Set 、Map接口的联系和区别

Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。Map接口并不是Collection接口的子接口,但是它仍然被看作是Collection框架的一部分

list,map,set的区别

list,map,set的区别 (首先假定小猪都是同一个细胞克隆出来的) 
    List = 排成一长队的小猪
    Set = 一群小猪贴上号,然后赶到一个猪圈里
    Map = 放在一个个,有房间号的屋子里面的一群小猪 


Hashset 它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。 
LinkedHashSet定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代。

7. hashMap 1.7 和 hashMap 1.8 的区别?

    不同点 hashMap 1.7 hashMap 1.8
    数据结构    数组+链表   数组+链表+红黑树
    插入数据的方式 头插法 尾插法
    hash 值计算方式  9次扰动处理(4次位运算+5次异或)  2次扰动处理(1次位运算+1次异或)
    扩容策略    插入前扩容   插入后扩容

8. hashMap 线程不安全体现在哪里?

    在 「hashMap1.7 中扩容」的时候,因为采用的是头插法,所以会可能会有循环链表产生,导致数据有问题,在 1.8 版本已修复,改为了尾插法

    在任意版本的 hashMap 中,如果在「插入数据时多个线程命中了同一个槽」,可能会有数据覆盖的情况发生,导致线程不安全。

9. 那么 hashMap 线程不安全怎么解决?

    一.给 hashMap 「直接加锁」,来保证线程安全

    二.使用 「hashTable」,比方法一效率高,其实就是在其方法上加了 synchronized 锁

    三.使用 「concurrentHashMap」 , 不管是其 1.7 还是 1.8 版本,本质都是「减小了锁的粒度,减少线程竞争」来保证高效.

10. concurrentHashMap 1.7 和 1.8 有什么区别

    不同点 concurrentHashMap 1.7   concurrentHashMap 1.8
    锁粒度 基于segment   基于entry节点
    锁   reentrantLock   synchronized
    底层结构    Segment + HashEntry + Unsafe    Synchronized + CAS + Node + Unsafe

11. HashSet 是「基于 HashMap 实现」的,底层「采用 HashMap 来保存元素」

    元素的哈希值是通过元素的 hashcode 方法 来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注