首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 中哈希码的说明

Java 中哈希码的说明

作者头像
全栈程序员站长
发布2022-11-17 17:32:48
发布2022-11-17 17:32:48
70300
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录

概念

在Java中,哈希码代表对象的特征。

例如下面代码对象

代码语言:javascript
代码运行次数:0
运行
复制
String str1 = “aa”, str1.hashCode= 3104
String str2 = “bb”, str2.hashCode= 3106
String str3 = “aa”, str3.hashCode= 3104

根据HashCode由此可得出str1!=str2,str1==str3

哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。

常用的哈希码的算法

1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。

3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

Object对象默认的toString()中的哈希码

假如.直接输出一个实例对象,出现一串字符串,代表什么?

运行如下:

直接输出一个类的对象的时候,会调用这个类的toString()方法,这个方法有些类是覆盖了的,比如String,Integer。你自己写的类没有覆盖这个方法的话就是继承Object类的这个方法,Object中toString()方法的实输出格式是这样的getClass().getName() + “@” + Integer.toHexString(hashCode()) 后面跟的是这个类的哈希码,如果你希望这个类打印出来输出你希望的格式,你就要覆盖这个、toString方法。

测试案例

哈希码比较探究1

代码语言:javascript
代码运行次数:0
运行
复制
public static void main(String[] args) { 

String str1 = "aa"; // str1.hashCode = 3106;
System.out.println(str1);
System.out.println(str1.hashCode());
String str2 = "bb"; // str2.hashCode = 3106;
String str3 = "aa"; // str3.hashCode = 3104;
System.out.println(str1==str2);
System.out.println(str1.hashCode()==str2.hashCode());
System.out.println(str1==str3);
System.out.println(str1.hashCode()==str3.hashCode());
System.out.println("==========");
String str4 = "重地";
String str5 = "通话";
System.out.println(str4.hashCode()==str5.hashCode());
}

运行结果如下:

哈希码比较探究2

代码语言:javascript
代码运行次数:0
运行
复制
public class HashCodeTest { 

class Person
{ 

public String name;
public Person(String n)
{ 

this.name=n;
}
public Person(){ 
}
}
public static void change(Person a)//改变对象a的name值
{ 

a.name="haha";
}
public static void main(String[] args) { 

HashCodeTest t=new HashCodeTest();
Person p=t.new Person("zhangsan"); //实例一个对象p
Person a=t.new Person();//又实例一个对象a
System.out.println("未赋值前,两者的哈希码是不相同的:");
System.out.println("a.hashCode="+a.hashCode()+" "+"p.hashCode="+p.hashCode());
System.out.println("a.toString()="+a.toString());
System.out.println("p.toString()="+p.toString());
/* 未赋值前,两者的哈希码是不相同的: a.hashCode=366712642 p.hashCode=1829164700 a.toString()=new_start1.Test1$Person@15db9742 p.toString()=new_start1.Test1$Person@6d06d69c */
a=p;
System.out.println("赋值后,两者的哈希码相同:");
System.out.println("a.hashCode="+a.hashCode()+" "+"p.hashCode="+p.hashCode());
System.out.println("a.toString()="+a.toString());
System.out.println("p.toString()="+p.toString());
/* 赋值后,两者的哈希码相同: a.hashCode=1829164700 p.hashCode=1829164700 a.toString()=new_start1.Test1$Person@6d06d69c p.toString()=new_start1.Test1$Person@6d06d69c */
}
}

运行结果如下:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/213432.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 概念
    • 常用的哈希码的算法
  • Object对象默认的toString()中的哈希码
  • 测试案例
    • 哈希码比较探究1
    • 哈希码比较探究2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档