java基础之 “==”与“equals”区别详解

对于初学java的人来说,在面对数值比较的时候,我们大多数会采用 “==”的方式来进行比较,但是java中给我们提供了equals()方法,这时候很多人就会忽略这两种方式的区别,在学习中产生了很多错误,本文将详细区分equals和 == 两种方式的区别。

“==” 解读

对于基本类型和引用类型,==的作用效果是不同的,对于 基本类型 来说,比较的是值是否相同,对于 引用类型 来说,比较的是引用是否相同。

代码示例:

public static void main(String[] args) {

  String x = "hello";
  String y = "hello";
  String z = new String("hello");

  System.out.println(x.equals(y)); //true
  System.out.println(x.equals(z)); //true
  System.out.println(x == y); //true
  System.out.println(x == z); //flase

}

因为x,y指向的是同一个引用,所以== 和equals都是true,而new String()又开辟了一个新的空间,所以 ==为false,但是equals始终比较的是值,所以为true。

equals解读

在本质上,equals就是==,只是String和Integer等重写了equals方法,使得equals只用于值比较。

public class Demo1 {
  private String name;
  public Demo1(String name) {
    this.name = name;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public static void main(String[] args) {
    Demo1 demo1 = new Demo1("张三");
    Demo1 demo2 = new Demo1("张三");
    String s = new String("李四");
    String s2 = new String("李四");
    System.out.println(demo1.equals(demo2));//false
    System.out.println(s.equals(s2)); //true

  }
}

可以看到demo1和demo2的值一样,但是输出结果却是false,而s和s2的值一样却输出结果为true, 怎么回事?

equals代码

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

可以看到,原始的equals方法本质上就是==

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重写了Object的equals的方法,把引用比较改成了值的比较。

本文主要介绍了java基础开发中“==”与“equals”区别如果想了解更多关于java基础开发相关信息请查看下面的相关链接

(0)

相关推荐

  • Java中比较运算符compareTo()、equals()与==的区别及应用总结

    前言 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常用的比较运算符如下表所示: 本文主要给大家介绍了关于Java比较运算符compareTo().equals()与==区别及应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1.== 和 equals的区别: ==主要是两个变量值的比较,返回值为true 或者是false.对于普通变量,如:int a=10; int  b= 10; a==b,返回为 tr

  • Java中==与equals的区别小结

    public class Compare { /** * == 与 equals()区别 */ public static void main(String[] args) { String s1 = new String("Hello,World!"); //创建两个String型对象引用; String s2 = new String("Hello,World!"); String s3 = s1; //将s1对象引用赋予s3 System.out.printl

  • java equals和=,==的区别详细介绍

    Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,在Ob

  • Java中==符号与equals()的使用详解(测试两个变量是否相等)

    Java 程序中测试两个变量是否相等有两种方式:一种是利用 == 运算符,另一种是利用equals()方法. 当使用 == 来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true. 但是对于两个引用类型变量,只有它们指向同一个对象时, == 判断才会返回true. == 不可用于比较类型上没有父子关系的两个对象. 很多书上说equals()方法是判断两个对象的值相等.这种说法不准确.实际上equals()方法是O

  • java中"==" 与equals方法的使用

    复制代码 代码如下: public class equalsDemo {     public static void main(String[] args){ /*使用==来判断两个变量是否相等时,如果两个变量时基本数据类型的          变量时,且都是数值类型是,则只要两个变量的值相等,使用==判断就返回true*/ int i=65;         float f=65.0f;         System.out.println(i==f);//true         char

  • java equals和==的区别详解

    大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量).如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较.而自动变量既不是类的实例也不是类的引用所以不能用equals()方法. 2.boolean tem

  • 基于Java字符串 "==" 与 "equals" 的深入理解

    虽然关于Java字符串"=="和"equals"的问题是Java学习中的最基础的一个问题,但是仍然有不少刚刚学习Java的同学搞不清楚里面的原理,最近和朋友讨论到这个问题,所以写篇文章给大家分享一下我自己的理解.首先让我们看一个例子: 复制代码 代码如下: public class TestStringEquals { public static void main(String[] args) { String a = "test";     

  • java String 类的一些理解 关于==、equals、null

    1.String 的==与equal() 在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同.大多数时候==跟equal()的结果都是相同的.这是因为String对象是不变模式的,如果你不是明确地new一个String对象,Java对于String对象的保存默认的是会把新生成的String 对象放到一个缓冲区,然后每次判断缓冲区中是否已经有了这个对象,如果有了,那么后建立的同样字符值的String对象也会指向最初建立是该字符值对象的地址.也就是说字符值相同的时候

  • Java中equals与==的用法和区别

    背景介绍 == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断. java中的数据类型可以分为两类: 基本数据类型 byte,short,char,int,l

  • java中equals和等号(==)的区别浅谈

    java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个eq

随机推荐