写点什么

精通 Java 集合?看到 Github 点赞破万的笔记,2 年码农的我太菜了

发布于: 2021 年 05 月 21 日
精通Java集合?看到Github点赞破万的笔记,2年码农的我太菜了

今日分享开始啦,请大家多多指教~

1 set 接口

1.1 概述

  1. Set 是一个不包含重复数据的 Collection

  2. Set 集合中的数据是无序的(因为 Set 集合没有下标)

  3. Set 集合中的元素不可以重复 – 常用来给数据去重

1.2 Set 集合的特点

  1. 数据无序且数据不允许重复

  2. HashSet : 底层是哈希表,包装了 HashMap,相当于向 HashSet 中存入数据时,会把数据作为 K,存入内部的 HashMap 中。当然 K 仍然不许重复。

  3. TreeSet : 底层是 TreeMap,也是红黑树的形式,便于查找数据

1.3 常用方法

学习 Collection 接口中的方法即可

1.4 练习: Set 接口测试

创建包: cn.tedu.collection 创建类: TestSet.java




2 HashSet

2.1 概述

底层是哈希表,包装了 HashMap,相当于向 HashSet 中存入数据时,会把数据作为 K 存入内部的 HashMap 中,其中 K 不允许重复,允许使用 null.


2.2 练习: HashSet 测试

创建包: cn.tedu.collection 创建类: TestHashSet2.java


3 Map 接口

3.1 概述

Java.util 接口 Map<K,V>类型参数 : K - 表示此映射所维护的键 V – 表示此映射所维护的对应的值也叫做哈希表、散列表. 常用于键值对结构的数据.其中键不能重复,值可以重复

3.2 特点

  1. Map 可以根据键来提取对应的值

  2. Map 的键不允许重复,如果重复,对应的值会被覆盖

  3. Map 存放的都是无序的数据

  4. Map 的初始容量是 16,默认的加载因子是 0.75

TIPS:源码摘抄:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

初始容量 1<<4,相当于 1*(2^4),也就是 16

static final float DEFAULT_LOAD_FACTOR = 0.75f;

默认的加载因子是 0.75f,也就是存到 75%开始扩容,按照 2 的次幂进行扩容

3.3 继承结构

3.4 常用方法

学习 Collection 接口中的方法即可

void clear() 从此映射中移除所有映射关系(可选操作) boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true

boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true

Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图

boolean equals(Object o) 比较指定的对象与此映射是否相等

V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null

int hashCode() 返回此映射的哈希码值

boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true

Set keySet() 返回此映射中包含的键的 Set 视图

V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)

void putAll(Map<? extends K,? extends V> m)从指定映射中将所有映射关系复制到此映射中(可选操作)

V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)

int size() 返回此映射中的键-值映射关系数

Collection values() 返回此映射中包含的值的 Collection 视图

3.5 练习:Map 常用方法测试

创建包: cn.tedu.collection 创建类: TestMap.java



3.6 练习:Map 集合迭代测试

创建包: cn.tedu.collection 创建类: TestMap.java



4 HashMap

4.1 前言

HashMap 的键要同时重写 hashCode()和 equlas()

hashCode()用来判定二者的 hash 值是否相同,重写后根据属性生成

equlas()用来判断属性的值是否相同,重写后,根据属性判断

–equlas()判断数据如果相等,hashCode()必须相同

–equlas()判断数据如果不等,hashCode()尽量不同

4.2 概述

HashMap 底层是一个 Entry[ ]数组,当存放数据时,会根据 hash 算法来计算数据的存放位置

算法:hash(key)%n , n 就是数组的长度,其实也就是集合的容量

当计算的位置没有数据的时候,会直接存放数据

当计算的位置,有数据时,会发生 hash 冲突/hash 碰撞,解决的办法就是采用链表的结构,在对应的数据位置存放链表的头节点,对于这个链表来说,每次新加的节点会从头部位置开始加入,也就是说,数组中的永远是新节点.

4.3 练习:获取 HashMap 的数据

创建包: cn.tedu.collection 创建类: TestHashMap.java

4.4 练习:字符串中字符统计

创建包: cn.tedu.collection 创建类: TestMap2.java


5 拓展

HashMap 扩容

成长因子:

static final float DEFAULT_LOAD_FACTOR = 0.75f;

前面的讲述已经发现,当你空间只有仅仅为 10 的时候是很容易造成 2 个对象的 hashcode 所对应的地址是一个位置的情况。这样就造成 2 个 对象会形成散列桶(链表)。

这时就有一个加载因子的参数,值默认为 0.75 ,如果你 hashmap 的 空间有 100 那么当你插入了 75 个元素的时候 hashmap 就需要扩容了,不然的话会形成很长的散列桶结构,对于查询和插入都会增加时间,因为它要一个一个的 equals 比较。但又不能让加载因子很小,如 0.01,这样显然是不合适的,频繁扩容会大大消耗你的内存。

这时就存在着一个平衡,jdk 中默认是 0.75,当然负载因子可以根据自己的实际情况进行调整。


今日份分享已结束,请大家多多包涵和指点!

用户头像

还未添加个人签名 2021.04.20 加入

Java工具与相关资料获取等WX: pfx950924(备注来源)

评论

发布
暂无评论
精通Java集合?看到Github点赞破万的笔记,2年码农的我太菜了