【J2SE快速进阶】——Java中的equals和==的区别

简介: 我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型。equals和==都是用来比较数据与数据是否“相等”。

      我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型。equals和==都是用来比较数据与数据是否“相等”。


      基本数据类型的比较


      基本数据类型之间的比较用“==”,用来判断它们的值是否相等。


      示例代码:        


public class Test{
  public static void main(String[] args){
    int i1=9;
    int i2=9;
    boolean b1=true;
    boolean b2=true;  
    char c1='c';
    char c2='c';
    System.out.println(i1==i2);    //输出为true
    System.out.println(b1==b2);    //输出为true
    System.out.println(c1==c2);    //输出为true
  }
}


       基本数据类型之间的比较不用equals。        

       引用数据类型的比较


       引用类型之间既可用“==”来比较,又可以用equals来比较。


       用“==”来比较引用对象


       用“==”来比较引用对象的时候,比较的是他们的地址,即在栈中存放的变量值。


public class Test{
        public static void main(String[] args){
                Person p1=new Person("Danny",24);
                Person p2=p1;
                Person p3=new Person("Danny",24);
                System.out.println(p1==p2);    //输出为true
                System.out.println(p1==p3);    //输出为false
        }
}
class Person{
        public String name;
        public int age;
        public Person(String name,int age){
        this.name=name;
        this.age=age;
        }
}


 

  这时的内存图为:

74.png


         p1和p2都指向同一个对象,所以p1和p2中存放的地址是一样的,而“==”比较的正是他们在栈中存放的值,所以p1==p2的值为True; p3和p1指向的对象虽然一模一样,但是不是同一个对象,所以p1!=p3(或者p1==p3==false)。


        特殊情况,

        对于String和Integer来说,创建对象的方式不同,用“==”比较的结果是不同的,比如:    


public class Test{
  public static void main(String[] args){
    String a1="hello";
    String a2="hello";
    String a3=new String("world");
    String a4=new String("world");
    System.out.println(a1==a2);    //输出为true
    System.out.println(a3==a4);    //输出为false
  }
}


        用equals来比较引用类型


        在基类Object中定义了equals方法,这个方法比较的也是对象的内存地址,即上例中如果把“p1==p2”换成p1.equals(p2),结果也是一样的。


        特殊情况,


        如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是比较两个变量指向的对象是否是同一个对象,这时候使用equals和使用==会得到同样的结果。


        但有些类重写了Object类中的方法,这时它比较的是所指对象的内容是否相同。比如:  

public class Test{
  public static void main(String[] args){
    String a1="hello";
    String a2="hello";
    String a3=new String("hello");
    String a4=new String("hello");
    System.out.println(a1==a2);    //输出为true
    System.out.println(a3==a4);    //输出为false
    System.out.println(a1.equals(a4));    //输出为true   
  }
}
class Person{
  public String name;
  public int age;
  public Person(String name,int age){
    this.name=name;
    this.age=age;
  }
}


        上面的a1和a4显然不是指向同一个对象,但它们所指对象中的内容相同,所以a1.equals(a4)的值为true。

相关文章
|
4天前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
28 4
|
12天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
36 14
|
8天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
13 1
|
18天前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
39 8
|
1月前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
2月前
|
存储 Java C++
java中“==”和equals,究竟比的是什么
java中“==”和equals,究竟比的是什么
44 3
java中“==”和equals,究竟比的是什么
|
3月前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
50 3
java基础(4)public class 和class的区别及注意事项
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
32 1
|
2月前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
47 2