1.首先,equal和==最根本的区别在于equal是一个方法,而==是一个运算符。

  2.一般来说,==运算符比较的是在内存中的物理地址,.equal()比较的是哈希算法值是否相等(即hashcode),且基本数据类型只能用==来进行比较。如果比较的双方没有哈希值,那么此时==和equal()比较的都是物理地址,可以互相替换(事实上在object类中equal()方法就是用==实现的,只是在有的需要比较哈希值的类中equal()方法被重写了)。

  3.equal()可以重写,在set集合中,jvm就是根据hashcode(),和equal()这两个方法来判断元素是否重复,如果要重写,建议两个方法一起重写,否则可能会出现安全性问题。

  PS:下面讲个有趣的东西,也是面试常考的,==比较字符串。众所周知,字符串是被存在字符串池中的,那么什么情况下String a=String b呢?下面贴代码。

package compareString;

public class CompareString {
public static void main(String [] args){
String a="Ye";
String b="Tian";
String c="YeTian";
String d=new String("YeTian");
String e=a+b;
String f="a"+"b";
String g="Ye"+"Tian";
System.out.println(c==d);
System.out.println(c==e);
System.out.println(c==e.intern());
System.out.println(c==f.intern());
System.out.println(c==g);
}
}

输出结果如下:

false
false
true
false
true

  我们来一一说一下为什么,首先String c(YeTian)和String d,因为c是在字符串池创建的,保存在常量池里,d是new创建的对象,保存在堆上,所以内存地址肯定不同。然后String c和String e,这个很常见,运行时结果相等,但编译时虚拟机并不能确定结果是否相等,所以为e开辟了新的内存空间,故结果不等。再是c和e.intern(),intern()这个方法很有趣,为了节省内存空间,我们一般是在StringBuffer里操作字符串,但intern()这个方法同样实现了StringBuffer的某些功能,intern()方法的功能是,比较该String对象是否存在于字符串池内,如果存在,则返回池内的该值,如果不存在,则创建此字符串。因此,intern()方法一样可以实现内存优化的作用,但一般还是建议使用StringBuffer。再然后是c和f,这个理由和之前一样,编译期间不能确定结果。最后是c和g,因为String类使用+运算符的本质是创建StringBuilder对象并运行append()方法,得到的值再运行toString()方法,而toString()方法会检查字符串池内是否存在当前字符串,故c==g。

.equal()和==的区别的更多相关文章

  1. C#中equal与==的区别

    C#中equal与==的区别 来源 https://www.cnblogs.com/dearbeans/p/5351695.html C#中,判断相等有两种方式,一种是传统的==操作,一种是objec ...

  2. java中==与equal()方法的区别

    ==比较的是对象的地址,也就是是否是同一个对象: equal比较的是对象的值. Integer r1 = new Integer(900);//定义r1整型对象Integer r2 = new Int ...

  3. .equal与==的区别

    ==比较的是对象的地址,也就是是否是同一个对象: equal比较的是对象的值. Integer r1 = new Integer(900);//定义r1整型对象Integer r2 = new Int ...

  4. 【转】java中equal与==的区别 其中有个缓冲区,需要注意

    转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ...

  5. hashCode()方法和equal()方法的区别

    本文参考地址:http://www.cnblogs.com/zgq0/p/9000801.html hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等 ...

  6. 关于Java中equal 和 == 的区别

    在对Java开发还不熟练的时候,往往很多人都喜欢用==去比较两个对象是否相等,有时候就会出现很奇葩的问题. 其实这类问题并不是奇葩问题,只是我们不够细心而已,在Java中“==”比较两个变量本身的值, ...

  7. ==与equal在java中应用的感悟

    今天又算是长见识了.了解了下平时不注意的equal和==的区别. 不管是==又或是equal都是用来比较相同与否.当问题就在这里了,比较什么相同呢? 我的在日常的比较无非也就是两种:1.基本数据类型之 ...

  8. 对比C#中==与equal方法

    C#中equal与==的区别 收藏 对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == ...

  9. 【Java】 子字符串的比较(substring的==与equal()使用)

    public class Test { public static void main(String[] args) { String str1="good"; System.ou ...

随机推荐

  1. 018、MySQL取满足日期在两个日期之间的所有数据

    #查询 SELECT GZJK_CREATEDATE FROM abc_table WHERE ( ( GZJK_CREATEDATE >= UNIX_TIMESTAMP( '2019-08-0 ...

  2. maven启动报错No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    [INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building th ...

  3. 英语 - take的短语

    take care of  照顾 take place  发生 take action  行动 take over  接管 take in   欺骗(某人) take up   拿起 take awa ...

  4. 【LeetCode】课程表 II

    [问题]现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程.例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及 ...

  5. word中替换内容

    参考了一篇文章 然后做了如下修改  用python的win32com模块替换word中的文字搞定批量打印奖状 python 操作 office python操作word # -*- coding: u ...

  6. plsql调用执行存储过程

    参考 https://www.cnblogs.com/enjoyjava/p/9131169.html ------------------------------------------------ ...

  7. Oracle SQL存储过程结构、异常处理示例

    -- 存储过程结结构. -- EXCeption不是存储过程必须部分,可以用作本存储过程的异常处理,但如果没有异常处理,出了异常将会终止程序 CREATE PROCEDURE procedure_na ...

  8. [LeetCode] 928. Minimize Malware Spread II 最大程度上减少恶意软件的传播之二

    (This problem is the same as Minimize Malware Spread, with the differences bolded.) In a network of ...

  9. C# 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

    今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系". ...

  10. ProxyPass与ProxyPassReverse及ProxyPassMatch的概述

    转载自:https://blog.csdn.net/xiaokui_wingfly/article/details/51481653 apache中的mod_proxy模块主要作用就是进行url的转发 ...