浅谈equals和==的区别

举报
愫暮 发表于 2020/07/29 10:38:13 2020/07/29
【摘要】 # 浅谈equals和==的区别## 一.**基本数据类型** 对于byte,short,int,long,float,double,char,boolean这八种基本数据,是指存放在**栈**中的简单数据段,数据大小确定,内存空间大小可以分配,**它们是直接按值存放的,所以可以直接**按值访问。他们之间的比较直接选择==,这里直接比较的是他们的值## 二.**引用数据类型**1. ==比较...

# 浅谈equals和==的区别


## 一.**基本数据类型**


对于byte,short,int,long,float,double,char,boolean这八种基本数据,是指存放在**栈**中的简单数据段,数据大小确定,内存空间大小可以分配,**它们是直接按值存放的,所以可以直接**按值访问。他们之间的比较直接选择==,这里直接比较的是他们的值


## 二.**引用数据类型**


1. ==比较两个对象在内存里是不是同一个对象,就是说在内存里的**存储位置**一致。 两个String对象存储的值是一样的,但有可能在内存里存储在不同的地方.


2. **==比较的是引用而equals方法比较的是内容。**


    public boolean equals(Object obj)这个方法是由Object对象提供的,可以由子类进行重写。默认的实现只有当对象和自身进行比较时才会返回true,这个时候和==是等价的。**String, BitSet, Date,和File**都对equals方法进行了重写,对两个String对象而言,**值**相等意味着它们包含同样的字符序列。对于基本类型的包装类说,值相等意味着对应的基本类型的值一样。


## 三.字符串缓冲池


```java

String s1 = "hello";

String s2 = "hello";


System.out.println(s1 == s2);//true

System.out.println(s1.equals(s2));//true

```


```java

String s1 = "hello";

String s2 = new String("hello");


System.out.println(s1==s2);//false

System.out.println(s1.equals(s2));//true

```


原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "hello" 这样的表达是创建字符串的时候,程序首先会在这个**String缓冲池**中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将s2引用s1所引用的对象"hello";然而 第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"hello"Sting对象被创建在内存中。他们的值相同,但是位置不同,由此他们的地址值发生了改变!


![image-20200715165429998](https://i.loli.net/2020/07/15/L8D2NPe7SJgCE9p.png)


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。