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[ ...
随机推荐
- PJzhang:kali linux安装网易云音乐、Visual Studio Code、skype
猫宁!!! 参考链接:https://blog.csdn.net/cloudatlasm/article/details/79183583 https://code.visualstudio.com/ ...
- EOS帐户交易的构建命令
EOS版本:4.0 系统:Ubuntu 16.04 LTS 1.创建两对密匙 cleos create key Private key:5JeTwSwKfpVRHGLqysakTXfk ...
- git clone 指定新建本地库位置
- 黑马SSM练习中 Oracle SQL代码
-- 10张表 product member orders traveller order_traveller users role permission users_role role_permis ...
- Python web前端 08 字符串 数组 json
Python web前端 08 字符串 数组 json 一.string #string 字符串 #索引 下标 偏移量 ---从0开始 str[index]; #通过索引取字符串 可读不可写 str. ...
- Hive进阶_开发Hive的自定义函数
Hive中的自定义函数简介 (1) 在类中创建自定义函数.自定义UDF需要继承'org.apache.hadoop.hive.ql.exec.UDF',实现evaluate函数,evaluate函数支 ...
- Netty-promise
public class TimeEncoder extends ChannelOutboundHandlerAdapter { @Override public void write(Channel ...
- MYSQL查询~ 存在一个表而不在另一个表中的数据
A.B两表,找出ID字段中,存在A表,但是不存在B表的数据.A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引. 方法一 使用 not in ,容易理解,效率低 ~执 ...
- 几种常用排序算法代码实现和基本优化(持续更新ing..)
插入排序(InsertSort): 插入排序的基本思想:元素逐个遍历,在每次遍历的循环中,都要跟之前的元素做比较并“交换”元素,直到放在“合适的位置上”. 插入排序的特点:时间复杂度是随着待排数组的有 ...
- new() 与new
一般写的时候,new对象都要加()