您的位置:首页 > 编程语言 > Java开发

Java知识点<1> java中==和equals和hashCode的区别

2018-03-09 22:05 288 查看
结论 
java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。 2.引用类型(类、接口、数组)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是对栈中的值进行比较的。equals,默认情况下是使用object的equals方法,即对象的内存地址引用是不是同一个地址(是不是同一个对象)
典型问题:
     String s1 = "111";
    String s2 = "111";
    String s3 = new String("222");

    String s4 = new String("222");
结果:
    System.out.println(s1==s2);  //true
    System.out.println(s1.equals(s2));  //true
    System.out.println(s3==s4); //false
    System.out.println(s3.equals(s4)); //true
个人理解:
s1,s2 常量“111”对应的内存地址(String作为常量,在被创建的时候,会保存在JVM的字符串池中,是共享的,所以S1,S2指向同一个对象),所以 == ,equals 比较的都是同一个对象“111”,都返回true;
而对于s3,s4 ,使用new,强制生成 出来的对象,这两个对象被分配到不同的内存地址,在对象的内存地址里存储的才是“222”。
所以此时,== 比较的是两个对象的地址,因为此时两个对象是不同的,所以 == 返回false;
而equals,比较的是两个对象的内存地址引用,这两个对象引用的都是“222”的内存地址,所以equals返回true。
这和String 对 equals的重写也有关系。重写思路是:
String中equals方法判断相等的步骤是:1.若A==B 即是同一个String对象 返回true2.若对比对象是String类型则继续,否则返回false3.判断A、B长度是否一样,不一样的话返回false4。逐个字符比较,若有不相等字符,返回false对于Hashcode 和 equals。一般使用的时候,都会进行重写。目的是生成自己的比较规则。一般来说:hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。得到的结论是:1:如果对象A==对象B,则h(
4000
A) = h(B)。
2:如果A!=B,则h(A)与h(B)可能得到相同的散列值。-》所以会产生hashcode相同的问题,我们重写hashcode,也是为了避免这种情况出现。

以上是自己想到的一些内容,如果有不准确的地方,还请指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: