1/20笔记

1 散列表

1.1 概述

散列表结构 可以理解为 数组中保存的是链表首节点,用来保存k和v键值对操作

hash算法:是一种安全的加密机制 可以把不定长的数据转换为定长数据,并且不能保证唯一性,又叫哈希冲突

在java中,指的就是hashCode方法

对一个对象生成多次hash值,值一定相同_多个对象也可能生成相同的hash值,叫哈希冲突_

k不可重复,v可重复

添加过程:

1)根据要添加的key,调用他的hashCode方法,生成hash值

2)通过一定的算法,根据hash值生成数组的下标

3)判断该下标中是否有数据,如果没数据就把该键值对映射关系保存到数组中

4)如果该下标中有数据,则调用key的equals方法 和对应的所有数据进行比较,如果不相等,则添加到链表尾部即可

5)如果对应的链表中通过equals方法比较的时候,发现了相同的数据,那么key不再添加,但是value值会替换原来的value值

通过添加过程得知,会自动调用hashCode和equals,所以在保存自定义类型的时候,需要注意方法覆写

在1.8中,为了提高查询效率引入了红黑树和扩容的优化                                                                    因为链表在查询功能上较差,所以每个数组中的链表个数如果大于等于7,则会把该链表转换为    红黑树。                                                                                                                                          数组默认初始化容量为16

1.2 HashSet

当我们使用HashSet的时候,其实就等于是在使用HashMap

添加数据的时候,虽然调用的是HashSet的add方法,但是本质还是调用map的put方法

Ps : 在map中,put是添加操作

而 map中 需要保存的是k和v映射关系,所以在set中有一个变量保存了value的值

所以我们再进行set添加的时候,只操作了map中的key,value值我们不再关心

3 Map

3.1 概述

Map是无序的,并且保存的是k-v键值对,其中k不能重复,v可以重复

HashMap:底层是散列表

TreeMap:底层是红黑树,元素必须按照一定规则进行排序

映射关系:比如 商品 和 购买数量,或者数据统计

        "sadjaksldjlajsld"统计每个字符出现的次数,使用HashMap进行存储,字符做K,次数做V

3.2 HashMap

System.out.println(map.size());个数

System.out.println(map.get(key));根据key获取value的值

System.out.println(map.containsKey(key));判断是否包含某个key

System.out.println(map.containsValue(value));判断是否包含某个value

map.remove(key);根据key删除 该映射关系,返回对应的value值

获取所有的value,并放到集合中返回

Collection values = map.values();

for (Object object : values) {

System.out.println(object);

}

keySet : 获取所有的key,封装到set对象中并返回

Set keys = map.keySet();

for (Object object : keys) {

System.out.println(object +":"+map.get(object));

}

把map转换为set

Entry类中,保存了K和V两个变量,把map中的k和v转换为entry类的对象进行存储

所以我们只需要保存entry对象,就等于保存了k和v

Set set  = map.entrySet();

for (Object object : set) {

System.out.println(object);

}

3.3 TreeMap

TreeMap 保存的元素会按照一定的规则进行排序,底层是红黑树

4 泛型

4.1 概述

泛型:在编译过程中检测数据类型是否匹配

泛型 必须使用引用型类型 不能使用基本类型 想要保存基本类型的话,要编写对应的包装类类型

优点:统一了数据类型,减少了类型转换,不会出现类型转换异常

缺点:只能保存同一种类型

定义泛型,使用大写字母A-Z表示,写什么都一样,都只是占位符而已,只不过 某些字符也有一些特殊含义

定义泛型,使用大写字母A-Z表示,写什么都一样,都只是占位符而已,只不过 某些字符也有一些特殊的含义
E : Element 一般代表元素,而集合中的数据 我们叫元素,所以在集合中出现的泛型一般使用E表示
K : Key 表示键
V : value 表示值 K和V一般在散列表中出现(Map)
T : Type 表示一个java类型
N : 表示Number
? : 表示不确定的类型
如果规定了泛型,但是使用的地方没有指定泛型,则默认为Object类型

Map以Value进行排序
Map是没有办法按照value排序的,因为源码中写死了 是用key进行比较
所以 只能保存到List中进行排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值