浅谈equals和==的区别
# 浅谈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)
- 点赞
- 收藏
- 关注作者
评论(0)