java hash表_java学习笔记(6)——哈希表

哈希表

哈希值

一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,模拟出来的地址,不是数据实际存储的物理地址)

Object类中的hashCode()方法可以获取哈希值

hashCode()源码:

public native int hashCode();

native:代表该方法调用的是本地操作系统的方法

toString()的源码:

里面就包括hashCode

public String toString() {

return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

String类也重写了hashCode()方法,如果两个字符串相同时,返回的hash值也相同

String str = new String("ssd2");

String str2 = new String("ssd2");

System.out.println(str.hashCode());

System.out.println(str2.hashCode());

例外:当字符串为 重地 与 通话 时,他们的hashCode返回值相同

System.out.println("重地".hashCode());

System.out.println("通话".hashCode());

哈希表

无序,不允许重复,速度快

HashSet集合存储数据的结构

在jdk1.8之前:哈希表 = 数组 + 链表

在jdk1.8之后:

哈希表 = 数组 + 链表

哈希表 = 数组 + 红黑树(提高查询的速度)

数组结构:把元素进行了分组(相同哈希值的元素是一组)

链表 / 红黑树结构:把相同哈希值的元素连接到一起

由于数组查询速度快,把相同哈希值放入数组中,可以很快找到,这样便可以得到对应哈希值的数据。

1.存储数据到集合中,先计算元素的哈希值

20588feeae841ac57cc3b970ea0cbd41.png

2.如果数组中哈希值对应的链表数据挂载超过八位,链表便会转成红黑树(为了提高查询的速度)

39633f910c1dfaeb6674fd7a895916b9.png

32e83683b1de657f0770c294b768e468.png

前提:存储的元素必须重写hashCode方法和equals方法。

HashSet存储自定义类型元素

LinkedHashSet

HashSet的子类

特点:

底层是一个哈希表(数组 + 链表 / 红黑树) + 链表

多了一条链表(记录元素的存储顺序),保证元素有序

有序,不允许元素重复

LinkedHashSet set1 = new LinkedHashSet<>();

set1.add("abc");

set1.add("aioehw");

set1.add("abc");

set1.add("dhf");

System.out.println(set1);

//[abc, aioehw, dhf]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值