hashcode 订阅
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。 展开全文
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
信息
外文名
HashCode
包    括
equals和HashCode
类    别
一种算法
中文名
哈希码
应    用
java编程
应用代码类别
Object类,String类,Integer类
哈希码简介
在Java中,哈希码代表对象的特征。例如对象 String str1 = “aa”, str1.hashCode= 3104String str2 = “bb”, str2.hashCode= 3106String str3 = “aa”, str3.hashCode= 3104根据HashCode由此可得出str1!=str2,str1==str3下面给出几个常用的哈希码的算法。1、Object类的hashCode.返回对象的 [1]  内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。2、String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
收起全文
精华内容
下载资源
问答
  • equals和hashcode总结

    万次阅读 多人点赞 2019-07-31 18:37:06
    equals和hashcode总结: 1.equals方法没有重写的话,用于判断对象的内存地址引用是否是用一个地址。重写之后一般用来比较对象的内容是否相等(比如student对象,里面有姓名和年龄,我们重写 equals方法来判断只要...

    equals和hashcode总结:

    1.equals方法没有重写的话,用于判断对象的内存地址引用是否是用一个地址。重写之后一般用来比较对象的内容是否相等(比如student对象,里面有姓名和年龄,我们重写

    equals方法来判断只要姓名和年龄相同就认为是用一个学生)。

    2.hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,当然你也可以重写它,hashcode方法只有在集合中用到。

    3.对象放入集合中时,先判断hashcode是否相等,再判断equals是否相等,都相等就算是同一个对象,list则可以放入,set因为不允许重复所以不会放入。

    4.例如:

    public class Student {

            private int age;

            private String name;

            

            public Student(int age ,String name){

                this.age = age;

                this.name = name;

            }

            

            public int getAge() {

                return age;

            }

            public void setAge(int age) {

                this.age = age;

            }

            public String getName() {

                return name;

            }

            public void setName(String name) {

                this.name = name;

            }

            //重写equals方法,判断姓名和年龄相同就是相等的

            public boolean equals(Object o){

                if(o == null){

                    return false;

                }

                if(this.getClass() != o.getClass()){

                 return false;   

                }

                Student student = (Student)o;

                if(name == null){

                    return false;

                }

                if(age==student.getAge()&&name.equals(student.getName())){

                    return true;

                }

                return false;

            }

            

        public static void main(String[] args) {

            Student studentOne = new Student(1,"yjc");

            Student studentTwo = new Student(1,new String("yjc"));

            System.out.println(studentOne.equals(studentTwo));

            System.out.println("1: "+studentOne.getName().hashCode());

            System.out.println("2: "+studentTwo.getName().hashCode());

        }

        //输出结果:true

                    1: 119666

                    2: 119666

     

    }

    以上可以看出,两个String都叫"yjc",无论是直接"yjc"还是new String("yjc"),他们的hashcode都相同。所以在重写hashcode方法时可以运用这一点。

    比如你希望如果姓名和年龄相同,不仅equals相同,他们的hashcode也要相同,可以这样重写hashcode:

    public int hashcode(){

    final int prime = 31;

    int result = 1;

    result = prime*result + age;

    result = prime*result + (name == null? 0 : name.hashcode());

    return result;//直接写age+(name == null? 0 : name.hashcode())也行就是感觉太简单了0.0

    }

    这样一来两个姓名和年龄相同的Student对象就是同一个对象了,放入set中会被认为是同一个,无论放几个这样的对象,set.size()都是等于1。

    同样,HashMap因为key也是唯一的,HashMap对象是根据其Key的hashCode来定位存储位置,并使用equals(key)获取对应的Value,所以在put时判断key是否重复用到了hashcode和equals,若重复了则会覆盖。

    展开全文
  • HashCode

    千次阅读 2020-12-16 18:00:32
    HashCode 1.最底层的实现方法为:在Object .java中 public native int hashCode(); 2.在HashMap.java中的hashcode方法: public final int hashCode() { return Objects.hashCode(key) ^ Objects.hashCode(value); ...

    HashCode

    1.最底层的实现方法为:在Object .java中
    public native int hashCode();
    2.在HashMap.java中的hashcode方法:

    public final int hashCode() {
         return Objects.hashCode(key) ^ Objects.hashCode(value);
    }
    

    3.在Objects中的hashcode方法:

    public static int hashCode(Object o) {
            return o != null ? o.hashCode() : 0;
        }
    

    4.Object 中实现方法:
    public native int hashCode();
    到此位置该方法在java中就结束了。
    该方法的注释:

    /**
         * Returns a hash code value for the object. This method is
         * supported for the benefit of hash tables such as those provided by
         * {@link java.util.HashMap}.
         * <p>
         * The general contract of {@code hashCode} is:
         * <ul>
         * <li>Whenever it is invoked on the same object more than once during
         *     an execution of a Java application, the {@code hashCode} method
         *     must consistently return the same integer, provided no information
         *     used in {@code equals} comparisons on the object is modified.
         *     This integer need not remain consistent from one execution of an
         *     application to another execution of the same application.
         * <li>If two objects are equal according to the {@code equals(Object)}
         *     method, then calling the {@code hashCode} method on each of
         *     the two objects must produce the same integer result.
         * <li>It is <em>not</em> required that if two objects are unequal
         *     according to the {@link java.lang.Object#equals(java.lang.Object)}
         *     method, then calling the {@code hashCode} method on each of the
         *     two objects must produce distinct integer results.  However, the
         *     programmer should be aware that producing distinct integer results
         *     for unequal objects may improve the performance of hash tables.
         * </ul>
         * <p>
         * As much as is reasonably practical, the hashCode method defined by
         * class {@code Object} does return distinct integers for distinct
         * objects. (This is typically implemented by converting the internal
         * address of the object into an integer, but this implementation
         * technique is not required by the
         * Java&trade; programming language.)
         *
         * @return  a hash code value for this object.
         * @see     java.lang.Object#equals(java.lang.Object)
         * @see     java.lang.System#identityHashCode
         */
    

    从最后一句可以看出,该方法的底层不是由java来实现的
    but this implementation technique is not required by the Java™ programming language。

    Native
    native关键字表示的就是使用本机的方法,而不是由java实现的;
    先了解一下JNI:Java Native Interface(Java本机接口)
    JNI是一个本地编程接口。它允许java虚拟机(VM)内运行的java代码与应用C++、C++和汇编等其他编程语言编写的应用程序和库进行互操作。
    JNI最重要的好处是它对底层java虚拟机(VM)的实现没有任何限制。因此,java虚拟机(VM)供应商可以添加对JNI的支持,而不会影响VM的其他部分。程序员可以编写一个本机应用程序或库的一个版本,并期望它与支持JNI的所有java虚拟机(VM)一起工作。

    那为什么java要结合其他语言来工作呢?

    • 标准Java类库不支持应用程序所需的依赖于平台的特性。
    • 对自己已有的一个用另一种语言编写的库,并希望通过JNI使Java代码可以访问它。
    • 希望用较低级别的语言(如assembly)实现一小部分时间关键型代码。

    通过使用JNI之后,可以实现的一些内容有:

    • 创建、检查和更新Java对象(包括数组和字符串)。
    • 调用Java方法。
    • 捕捉并抛出异常。
    • 加载类并获取类信息。
    • 执行运行时类型检查。

    还可以将JNI与调用API一起使用,以使任意本机应用程序能够嵌入java vm。这可以轻松地使现有的应用程序支持Java,而不必与VM源代码连接。

    JRI:Java Runtime Interface (Java运行时接口)
    Netscape提出了Java运行时接口(JRI),它是Java虚拟机中提供的服务的通用接口。JRI的设计考虑到了可移植性,它对底层javavm中的实现细节几乎没有任何假设。JRI解决了广泛的问题,包括本机方法、调试、反射、嵌入(调用)等。

    用C编写native方法
    步骤如下:

    • 编写带有 native 声明的方法的java类,生成.java文件;(注意这里出现了 native 声明的方法关键字)
    • 使 用 javac 命令编译所编写的java类,生成.class文件;
    • 使用 javah -jni java类名 生成扩展名为 h 的头文件,也即生成.h文件;
    • 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法;
    • 将C/C++编写的文件生成动态连接库,生成dll文件;
    展开全文
  • hashcode

    2021-03-06 00:05:52
    hashcode hashcode的作用就是获取哈希码,是一个int整数,是确定这个对象在哈希表中的位置 hashcode是一个对象都有的方法,是一个native方法 对象是分配在堆中的 hashset 放对象加入到hashset 的时候,会...

    hashcode

    • hashcode的作用就是获取哈希码,是一个int整数,是确定这个对象在哈希表中的位置

    • hashcode是一个对象都有的方法,是一个native方法

    • 对象是分配在堆中的

    hashset

    • 放对象加入到hashset 的时候,会先计算hashcode判断所在的位置

    • 如果为空,就直接加进去

    • 如果有数值,则hash冲突,此时调用equals方法来检查两个对象是否相等

      • 如果相等,就不会加入
      • 如果不相等,那么就重新散列
    • 如果两个对象相等,那么hashcode相等

    • 两个对象相等,则使用equals也必须是相等的

    • 两个对象的hashcode相等,也不一定是相等的

    • 如果equals 被覆盖,则hashcode的方法也必须被覆盖

    展开全文
  • hashCode

    2020-12-03 18:22:30
    Object类中的原始hashCode方法如下: public native int hashCode(); 该方法返回的是对象的内存地址经过处理后的结构。能够做到不同对象的hash值尽量不同,但是有相同的几率。 所以在HashSet去重的时候必须重写...

    Object类中的原始hashCode方法如下:

    public native int hashCode();
    

    该方法返回的是对象的内存地址经过处理后的结构。能够做到不同对象的hash值尽量不同,但是有相同的几率。

    所以在HashSet去重的时候必须重写hashCode方法,否则调用的就是Object类的默认hashCode方法。会导致内容相同的对象,得到的hashCode不同,进而直接存放进Set中,出现重复的情况。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,990
精华内容 13,196
热门标签
关键字:

hashcode