集合

  • 集合用来解决数组长度不可变的问题;

  • Java中集合主要分为两种:单列的Collection和双列基于key-value的Map;

  • Collection有两个子接口:List和Set.其中List是有序可重复的集合,Set是无序不可重复的接口;

  • List常用的实现有ArrayList、LinkedList、Vector;

  • Set常用实现有HashSet、TreeSet;

  • Map主要实现有HashMap和HashTable;

 

Set集合

遍历方式:Foreach;迭代器

HashSet: 无序,去重,可为空,hashset的底层就是通过hashmap实现的,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。 HashSet采用散列算法快速对集合进行增删改查

TreeSet: 插入无序内部有序,基于TreeMap实现

 

 

List集合

ArrayList: 数组实现,查询快,增删慢

LinkedList: 链表实现 查询慢,增删快,基本不用,大部分是查询

Vector: 数组实现 线程安全 效率低 基本不用

 

Map集合

HashMap:

线程不安全的键值对集合 允许null值,key和value都可以,效率高

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。

 

hashmap共有4个构造函数:

// 默认构造函数。 HashMap()

// 指定“容量大小”的构造函数  HashMap(int capacity)

// 指定“容量大小”和“加载因子”的构造函数  HashMap(int capacity, float loadFactor)

// 包含“子Map”的构造函数  HashMap(Map<? extends K, ? extends V> map)

 

HashTable: 线程安全的键值对集合 不允许null值,key和value都不可以

TreeMap: 能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器(基本不用)

 

如何遍历Map集合?

  1. 先用map.keySet()获取Map中的key的set集合,通过遍历key集合map.getKey(),获取value值.

  2. 先用map.entrySet()获取entry集合,遍历entrySet集合,分别获取key value.

 

 

HashMap的实现原理

JDK8之前HashMap是数组和链表结构的键值对集合

当存放key和value时,会先计算存储的key的hash值,根据hash值计算存放到数组中。如果数组中此下标已经存在元素(hash碰撞),则通过equals方法比较key值是否一致,若一致则覆盖,不一致则将该键值对存放到表头

JDK8之后HashMap如果链表长度超过临界值(8),就把链表转化成红黑树,如果链表长度低于临界值(6),就转回链表。这样就增强了HashMap在链表太长之后的查询效率。

 

posted @ 2021-03-02 16:50  zh_niu  阅读(99)  评论(0)    收藏  举报