集合
-
集合用来解决数组长度不可变的问题;
-
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集合?
-
先用map.keySet()获取Map中的key的set集合,通过遍历key集合map.getKey(),获取value值.
-
先用map.entrySet()获取entry集合,遍历entrySet集合,分别获取key value.
HashMap的实现原理
JDK8之前HashMap是数组和链表结构的键值对集合
当存放key和value时,会先计算存储的key的hash值,根据hash值计算存放到数组中。如果数组中此下标已经存在元素(hash碰撞),则通过equals方法比较key值是否一致,若一致则覆盖,不一致则将该键值对存放到表头
JDK8之后HashMap如果链表长度超过临界值(8),就把链表转化成红黑树,如果链表长度低于临界值(6),就转回链表。这样就增强了HashMap在链表太长之后的查询效率。

浙公网安备 33010602011771号