hashSet基础认识
Posted wxgshareblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashSet基础认识相关的知识,希望对你有一定的参考价值。
/*
* 哈希值:是一个十进制的整数,由系统随机给出(这个地址值,就是一个逻辑地址)
* object:有一个hashCode()获取对象的哈希值
* int hashCode()返回该对象的哈希码值
* object中的源码:
* public native int hashCode();
* native:native代表调用的是本地操作系统的方法,(或许是调用Jvm的方法,jvm再去调用操作系统函数)
*
* */
public class DemoHash extends Object{
public static void main(String[] args) {
Dog dog = new Dog();
int i = dog.hashCode();
System.out.println(dog);//十六进制的地址值practice.demo17.Dog@4554617c
System.out.println(i);//十进制的地址1163157884
//两个地址其实是相同的,只是进制的不同
//toString的源码,把hashCode()转成了16进制
// public String toString() {
// return getClass().getName() + "@" + Integer.toHexString(hashCode());
// }
/*hashSet集合的存储数据的结构(哈希表)
jdk1.8之前是 数组+链表
jdk1.8之后有两种1.数组加链表
2.数组+红黑树
区分在于数组中同一个字段下的数据大于8时,会将链表改为红黑树,从而提高速度
哈希表的特点是:速度快
会创建一个长度为16的数组;(初始容量是16)
数组结构:将元素进行了分组(相同哈希值的元素是一组),通过链表/红黑树结构把相同哈希值的元素连到一起
存储数据时:
1.先计算元素的哈希值
2.把相同的哈希值的元素存放在一起,通过链表或者红黑树链接起来
*/
HashSet<String> set = new HashSet<>();
String a = new String("重地");
String b = new String("通话");
String c = new String("abc");
System.out.println(a.hashCode());//哈希值1179395
System.out.println(b.hashCode());//哈希值1179395
set.add("abc");
set.add(a);
set.add(b);
set.add(c);
System.out.println(set);
/*
set集合存放元素不重复的原因
1.通过hashcode()方法获取到对象的哈希值;
2.在数组中查找有没有这个的哈希值
3.第一种:没有找到这个哈希值,那就把这个对象存储进集合中
第二种:找到这个哈希值,产生了哈希冲突(相同的哈希值就会产生哈希冲突)
那么就会调用equals()方法 去跟哈希值下的链表/黑红树下的元素意义比较
返回true:则认为元素重复,就不会把元素放入集合
返回false:则认为元素不重复,就会把元素放入集合
*/
/*
存储自定义的数据类型的时候,需要重写hashCode()方法和equals()方法
因为:在对象中存储的是十六进制的地址,它的地址值是唯一的,相同于他们的哈希值永远是不同的
并且equals比较的是地址值,所以调用equals时 返回都会是false,认为元素不重复,将元素存入集合
* */
HashSet<Dog> hashSet = new HashSet<>();
Dog dog1 = new Dog();
Dog dog2 = new Dog();
hashSet.add(dog1);//practice.demo17.Dog@74a14482
hashSet.add(dog2);//practice.demo17.Dog@1540e19d
System.out.println(dog1.hashCode());
System.out.println(dog2.hashCode());
System.out.println(hashSet);
}
}
以上是关于hashSet基础认识的主要内容,如果未能解决你的问题,请参考以下文章