.equal()和==的区别
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()和==的区别的更多相关文章
- C#中equal与==的区别
C#中equal与==的区别 来源 https://www.cnblogs.com/dearbeans/p/5351695.html C#中,判断相等有两种方式,一种是传统的==操作,一种是objec ...
- java中==与equal()方法的区别
==比较的是对象的地址,也就是是否是同一个对象: equal比较的是对象的值. Integer r1 = new Integer(900);//定义r1整型对象Integer r2 = new Int ...
- .equal与==的区别
==比较的是对象的地址,也就是是否是同一个对象: equal比较的是对象的值. Integer r1 = new Integer(900);//定义r1整型对象Integer r2 = new Int ...
- 【转】java中equal与==的区别 其中有个缓冲区,需要注意
转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ...
- hashCode()方法和equal()方法的区别
本文参考地址:http://www.cnblogs.com/zgq0/p/9000801.html hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等 ...
- 关于Java中equal 和 == 的区别
在对Java开发还不熟练的时候,往往很多人都喜欢用==去比较两个对象是否相等,有时候就会出现很奇葩的问题. 其实这类问题并不是奇葩问题,只是我们不够细心而已,在Java中“==”比较两个变量本身的值, ...
- ==与equal在java中应用的感悟
今天又算是长见识了.了解了下平时不注意的equal和==的区别. 不管是==又或是equal都是用来比较相同与否.当问题就在这里了,比较什么相同呢? 我的在日常的比较无非也就是两种:1.基本数据类型之 ...
- 对比C#中==与equal方法
C#中equal与==的区别 收藏 对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == ...
- 【Java】 子字符串的比较(substring的==与equal()使用)
public class Test { public static void main(String[] args) { String str1="good"; System.ou ...
随机推荐
- delphi日期GMT格式
function TForm1.DateTimeToGMT(const DateTime: TDateTime): string;const WEEK: array[1..7] of PChar = ...
- Python中eval与exec用法的区别
Python中eval,exec这两个函数有着相似的输入参数类型和执行功能,因此在用法上经常出现混淆,以至经常用错,程序易抛出错误.下面主要通过这两个函数的语法来阐述区别,并用例子来进一步说明. 首先 ...
- python中excel表格的读写
#!usr/bin/env python #-*- coding:utf-8 -*- import xlrd import xlwt from xlutils.copy import copy imp ...
- S7-300数据处理基本知识(结尾以MW8+1 ADD指令实训仿真,并用状态表监控及刷写变量)
数据处理基本知识汇总 STEP7 的数据类型包括什么? 基本数据类型 复杂数据类型 用于FB(功能块)的输入,输出参数类型 用于FC(功能)的输入,输出参数类型 基本数据类型是什么? 先列举12种数据 ...
- http 请求code状态码
状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...
- STL--迭代器设计原则和萃取机制(Traits)
title: C++ STL迭代器设计原则和萃取机制(Traits) date: 2019-12-23 15:21:47 tags: STL C/C++ categories: STL 迭代器 (it ...
- v2??? 重启失败
v2??? 重启失败, 提示 Authorization not available. Check if polkit service is running or see debug message ...
- 08 SSM整合案例(企业权限管理系统):10.权限关联与控制
04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 10.权限关联与控制 1.用户 ...
- HTML5 新增元素梳理
HTML5新增元素如下图: <canvas> 新元素 <canvas> 标签定义图形,比如图表和其他图像,该标签基于javascript的绘图api 新多媒体元素 <au ...
- 从GitLab上拉到本地仓库的项目导入到eclipse中
拉项目 在本地仓库中右键git clone,填写地址 OK, 然后在拉下来的项目上面右键检出创建dev分支. 要将新分支导入到eclipse中, 如果是没有导入过就选第三个,导入过就选第一个. 然后O ...