Java中的==和equals的区别详解
1.基础知识
(1)String x = "hello";
(2)String x = new String ("hello");
第1种方式的工作机制是,首先看内存中有没有存放值为"hello"的地址,如果有则将x指向这块内存地址;如果没有则在内存中重新开辟一块地址存放值"hello",并将x指向这块内存地址。
String x = "hello"; String y = "hello";
所以上面的x,y都指向同一块内存地址。
第2种方式的工作机制是,不管内存中有没有存放值为"hello"的地址,都会重新开辟一块地址来存放值"hello"。
String x = new String("hello");
String y = new String("hello");
所以上面的x,y分别指向不同的地址。
2.==的详解
==对于基本类型和引用类型的作用效果是不一样的:
- 基本类型(byte,char,boolean,short,int,float,long,double)比较的是值是否相等。
- 引用类型比较的是引用是否相同。
String x = "hello";
String y = "hello";
String z = new String("hello");
System.out.println(x==y); //结果是:true
System.out.println(y==z); //结果是:false
3.equals的详解
equals是基类object中定义的方法,jdk中源代码如下:

所以equals的本质就是==,即判断两个引用是否相同。
public class Person
{
private String name;
public Person(String name)
{
this.name=name;
}
public static void main(String[] args)
{
Person x=new Person("小明");
Person y=new Person("小明");
System.out.print(x.equals(y)); //结果:false
}
}
上面的代码很容易理解,虽然x,y对象的name值都是"小明",但是它们本来就是两个不同的对象,所以equals的值为false。
注意:!!!
在String类中,equals被重写了,功能变成了比较值是否相同,源代码如下:

String x = "hello";
String y = "hello";
String z = new String("hello");
String m = new String("hello");
System.out.println(x==y); //结果是:true
System.out.println(y==z); //结果是:false
System.out.println(y.equals(z));//结果是:true
System.out.println(z.equals(m));//结果是:true
4.总结
==是比较引用是否相同。
equals本质就是==,但对于某些类(String)来说比较的是值。
Java中的==和equals的区别详解的更多相关文章
- java中a++和++a的区别详解
java中的++操作无论在前还是在后,都是在变量自身的值加1,接下来将具体描述两者的区别 int a =5; int b =a++; System.out.println(b); 1.通俗易懂的理解是 ...
- 基于python中staticmethod和classmethod的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
- java中List的用法和实例详解
java中List的用法和实例详解 List的用法List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提供 ...
- Java中堆内存和栈内存详解2
Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...
- DOS批处理中%cd%与%~dp0的区别详解
转载:https://www.jb51.net/article/105325.htm DOS批处理中%cd%与%~dp0的区别详解 Windows下批处理中%cd%和%~dp0都能用来表示当前 ...
- java中的==和equals的区别
关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...
- Java中Object.equals和String.equals的区别详解
前言 Java中的堆和常量池的区别是什么呢?Object.equals与String.equals的区别呢?下面让我们通过一个小示例让你明白它- 1.基础知识 Java的存储空间:寄存器.栈.堆.静态 ...
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- java中的String类常量池详解
test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[ ...
随机推荐
- Request a certificate from a certificate vendor
Request a certificate from a certificate vendor Now, with your CSR in hand, visit the Web site of yo ...
- 牛客假日团队赛2 D.亲和数对
链接: https://ac.nowcoder.com/acm/contest/924/D 题意: 求在给定区间[start,end]内所有的亲和数对. 亲和数的定义:对于数对(A,B),如果A的除了 ...
- HDU 5883 F - The Best Path 欧拉通路 & 欧拉回路
给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为 ...
- 对jvm虚拟机 内存溢出的思考
java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间
- canvas、svg、canvas与svg的区别
一.canvas canvas 画布,位图 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形 注意:不要在style中给canvas设置宽高,会有位移差 can ...
- React日常注意点
1.在定义组件的时候,名字首字母一定要大写 最近刚学,我会持续把自己学习过程中的的注意点在这里逐个列出,敬请等待!
- Hive的HQL(2)
Hive基础(1) Hive的HQL(2) 1. HQL的数据定义,HQL是一种SQL方言,支持绝大部分SQL-92标准.但是和SQL的差异为:不支持行级别的操作,不支持事务等.HQL的语法接近于My ...
- MFC CDialog/CDialogEx DoModal ALT
Questions: I'm using MFC CDialog/CDialogEx to show a modal dialog with DoModal.usually it works with ...
- CentOS 7安装Docker服务详细过程
---恢复内容开始--- Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟 ...
- github上fork原项目,如何将本地仓库代码更新到最新版本?
场景: 在github上fork原项目,项目组成员发起pull request提交了代码,这时自己在本地仓库该如何更新到最新代码? 操作方法如下: 方法一.从github上进行操作然后更新 登录自己的 ...