java中 == 和equals的使用与区别

java 的数据类型分为“基本数据类型” 和“引用数据类型”:
   ---》在基本数据类型的比较中,== 比的就是基本数据类型变量中所保存的值。

---》在引用数据类型的比较中,== 才比较的是变量所指向的对象的地址。

hashCode()返回该对象的哈希码值,该值通常是一个由该对象的内部地址转换而来的整数,它的实现主要是为了提高哈希表。

我们以引用数据类型为例,因为基本类型比较的是值,简单无须多言。

封装好的String 类型为例:

(注意:ObjectL中有方法equals, hashcode() ,所有其他类都会继承这两个方法)。

public class hei {

    public static void main(String[] args) {

        String n1 = "sd";  //常量池字符串sd
        String n2 = "sd";   //常量池字符串sd
        String n3 = new String("sd");   //新对象sd
        String n4 = new String("sd");   //另一个对象sd
        System.out.println(n1.hashCode());
        System.out.println(n2.hashCode());
        System.out.println(n3.hashCode());
        System.out.print("n1与N2 是否相==");
        System.out.println(n1 == n2);
        System.out.print("N1 N2 EQUALS 比较: ");
        System.out.println(n1.equals(n2));
        System.out.print("n2与N3 是否相==");
        System.out.println(n2 == n3);
        System.out.print("N2 N3 EQUALS比较");
        System.out.println(n2.equals(n3));
        System.out.print("N3 N4 EQUALS比较");
        System.out.println(n3.equals(n4));

        /*
         * ==操作比较的是两个变量的值是否相等, 对于引用型变量表示的是两个变量在堆中存储的地址是否相同, 即栈中的内容是否相同。
         * equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
         */
    }

}

这个测试例子中,有N1到N4 4个字符串:

(1)首先看N1与N2 这两个都是直接量,也就是N1放入“sd”在常量池中,常量池中有了一个对象"sd",

当 String n2 = "sd"; 执行的时候, 系统会查找常量池,找到了"sd",就把N2指向常量池的对象“sd”中,实际上N1 N2指向的是同一个对象。(所以地址相同,对象也相同,当然内容也相同了)。

(2) N3 N4是通过NEW创建的对象,所以不会在常量池中,而是新建一个对象。所以N3 N4 指向的地址不同,这里必须知道的是,     N3 N4 存放于内存的栈中,N3 N4 的内容分别是堆中对象的地址,是不同的。    所以N3 == N4  是false ,因为== 比较的是内存地址    同理 N2 == N3 也是false。    N3.equals(N4)   是true ,因为String重写了equals()方法,如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

  从中我们可以看出,String 类重写了equals方法使其比较了字符串内容。  而Object中的equals方法比较的是地址。

如下:  Oject中的equals()

public boolean equals(Object obj) {
return (this == obj);
}

至于hashcode() ,这个整型值是用在集合框架中的,目的就是快速搜索。  --摘自网络

  由于集合set要求元素不重复,所以每次插入的时候需要进行确认有没有重复,如果元素有1万个,需要1万次的equals那么效率很慢很慢。

  hashCode方法实 际上返回的就是与对象内存地址有关的一个数值。
  这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以 直接存储在这个位置  上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解    决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
  所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
  上面说的对象相同指的是用eqauls方法比较。


java中 == 和equals的使用与区别

时间: 2024-10-09 01:26:47

java中 == 和equals的使用与区别的相关文章

Java 中的 ==, equals 与 hashCode 的区别与联系

一.概述 1.概念 == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二.关系操作符 == 1.操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byt

【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址

Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等.特别指出利用equals比较八大包装对象(如int,float等)和String类(因为该

java中==和equals和hashcode的区别详解

一.相同点 都是用来进行值或对象的比较. 二.不同点 对于“==”而言,对于基本类型(char,byte,short,int,long,float,double,boolean),对比的是值,所以是相等的,对于引用对象,对比的是引用的对象的堆地址,例如: public class Main { public static void main(String[] args) throws InterruptedException { Object obj1 = new Object(); Objec

【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 System.out.println(str1==str2); 4 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一

【转】彻底弄懂Java中的equals()方法以及与"=="的区别

彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差.所以,我决定花费时间把equals()和“==”的功能彻底弄懂,前事不忘后事之师嘛,分享给大家,希望对大家理解equals()和“==”的功能有所帮助. 二.分析探索解决问题的方法:1.Object 中的equals()方法: (1)通过查找API,说明如下: equalspublic boolean equ

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

java中的hashcode和euqals的区别和联系

一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象). 2 .要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等. 没有覆盖equals方法代码如下: [java] view plaincopy //学生类 public class S

java 中的equals()小结

转载自http://www.cnblogs.com/jackyrong/archive/2006/08/20/481994.html Java中的equals是十分重要的,和= =要区别开来,最近在看孙卫琴的JAVA面向对象编程一书,觉得对其阐述写的不错,所以现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习1.声明格式public boolean equals(Object obj)其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回