Java 中哈希码的说明

简介: Java 中哈希码的说明

概念


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


例如下面代码对象


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


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


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
         */
    }
}


运行结果如下:


相关文章
|
7月前
|
存储 Java
【JAVA】处理哈希冲突的常见方法
【JAVA】处理哈希冲突的常见方法
|
2月前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
35 6
|
4月前
|
Java
【Java集合类面试十四】、HashMap是如何解决哈希冲突的?
HashMap解决哈希冲突的方法是通过链表和红黑树:当链表长度超过一定阈值时,转换为红黑树以提高性能;当链表长度缩小到另一个阈值时,再转换回链表。
|
6月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
67 1
|
6月前
|
NoSQL Java Redis
【Redis】 Java操作客户端命令——列表操作与哈希操作
【Redis】 Java操作客户端命令——列表操作与哈希操作
|
6月前
|
算法 安全 Java
Java数据结构与算法:哈希函数
Java数据结构与算法:哈希函数
|
存储 Java 索引
【零基础学Java】—哈希值(四十一)
【零基础学Java】—哈希值(四十一)
|
7月前
|
存储 算法 Java
java查找算法:二分查找、哈希查找等
java查找算法:二分查找、哈希查找等
49 1
|
存储 Java
解决 Java 中的哈希冲突:深入了解哈希冲突及其解决方案
在 Java 编程中,哈希表(Hash Table)是一种常用的数据结构,用于存储键值对,并提供快速的数据访问。然而,当不同的键被映射到相同的哈希桶时,就会产生哈希冲突。本文将深入探讨哈希冲突的原因、解决方案以及在 Java 中如何应对哈希冲突的问题。
|
Java 程序员
Java面向对象8——接口(内含IDEA中有关创建接口的创建说明)
上一次我们说了抽象方法的存在是因为父类可以抽取子类中的共性方法,但是共性方法内实现方法不同所以要将共性方法写成抽象方法,那么如果子类中有一个“另类”不需要这个方法的话,我们就无法使用抽象方法了,而是要使用接口,哪个子类需要用,就继承该接口
390 0
Java面向对象8——接口(内含IDEA中有关创建接口的创建说明)