Java 如何区分==与.equals()方法

一般来说equals()"=="运算符是用来比较两个对象是否相等,但是这两者之前还是有许多不同:

  1. 最主要的不同是.equals()是方法,==是运算符。
  2. 使用==来进行引用的比较,指的是是否指向同一内存地址。使用.equals()来进行对象内容的比较,比较值。
  3. 如果没有重写.equals就会默认调用最近的父类来重写这个方法。
  4. 示例代码:

// Java program to understand 
// the concept of == operator 
public class Test { 
    public static void main(String[] args) 
    { 
        String s1 = new String("HELLO"); 
        String s2 = new String("HELLO"); 
        System.out.println(s1 == s2); 
        System.out.println(s1.equals(s2)); 
    } 
} 

输出:

false
true

解释: 这里我们创建了两个对象分别命名为s1s2

  • s1s2是指向不同对象的引用。
  • 当我们使用==来比较s1s2时,返回的是false,因为他们所占用的内存空间不一样。
  • 使用.equals()时,因为只比较值,所以结果时true

我们来分别理解一下这两者的具体区别:

等于运算符(==)

我们可以通过==运算符来比较每个原始类型(包括布尔类型),也可以用来比较自定义类型(object types)

// Java program to illustrate 
// == operator for compatible data 
// types 
class Test { 
    public static void main(String[] args) 
    { 
        // integer-type 
        System.out.println(10 == 20); 
  
        // char-type 
        System.out.println('a' == 'b'); 
  
        // char and double type 
        System.out.println('a' == 97.0); 
  
        // boolean type 
        System.out.println(true == true); 
    } 
} 

输出:

false
false
true
true

如果我们使用==来比较自定义类型,需要保证参数类型兼容(compatibility)(要么是子类和父类的关系,要么是相同类型)。否则我们会产生编译错误。

// Java program to illustrate 
// == operator for incompatible data types 
class Test { 
    public static void main(String[] args) 
    { 
        Thread t = new Thread(); 
        Object o = new Object(); 
        String s = new String("GEEKS"); 
  
        System.out.println(t == o); 
        System.out.println(o == s); 
  
       // Uncomment to see error 
       System.out.println(t==s); 
    } 
} 

输出:

false
false
// error: incomparable types: Thread and String

.equals()

在Java中,使用equals()对于String的比较是基于String的数据/内容,也就是值。如果所有的他们的内容相同,并且都是String类型,就会返回true。如果所有的字符不匹配就会返回false

public class Test { 
    public static void main(String[] args) 
    { 
        Thread t1 = new Thread(); 
        Thread t2 = new Thread(); 
        Thread t3 = t1; 
  
        String s1 = new String("GEEKS"); 
        String s2 = new String("GEEKS"); 
  
        System.out.println(t1 == t3); 
        System.out.println(t1 == t2); 
  
        System.out.println(t1.equals(t2)); 
        System.out.println(s1.equals(s2)); 
    } 
} 

输出:

true
false
false
true

解释:这里我们使用.equals方法去检查是否两个对象是否包含相同的值。

  • 在上面的例子中,我们创建来3个线程对象和两个字符串对象。
  • 在第一次比较中,我们比较是否t1==t3,众所周知,返回true的原因是因为t1和t3是指向相同对象的引用。
  • 当我们使用.equals()比较两个String对象时,我们需要确定两个对象是否具有相同的值。
  • String "GEEKS" 对象包含相同的“GEEK”,所以返回true

本文作者:Bishal Kumar Dubey
译者:xiantang
原文地址:Difference between == and .equals() method in Java

全部评论

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
牛仔知道哦:你是我见过最美的牛客女孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务