# Java 为什么设计成 String 不能用 == 来进行比较

**URL:** <https://www.isharkfly.com/t/java-string/13695>\
**Category:** 程序语言\
**Tags:** java\
**Created:** [August 17, 2021, 2:14am UTC](https://www.isharkfly.com/t/java-string/13695 "2021-08-17T02:14:15Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![honeymoose](https://www.isharkfly.com/user_avatar/www.isharkfly.com/honeymoose/32/20796_2.png) [@honeymoose](https://www.isharkfly.com/u/honeymoose)\
**Post date:** [August 17, 2021, 2:14am UTC](https://www.isharkfly.com/t/java-string/13695/1 "2021-08-17T02:14:15Z")

</div>

这个问题如果展开了说就复杂去了，包括内存怎么存的呀，如何指向的的呀。

给一个小技巧，Java 的基本数据类型就是下面这些，这些数据类型是可以直接用 CPU 进行计算的。

- 整数类型：byte，short，int，long
- 浮点数类型：float，double
- 字符类型：char
- 布尔类型：boolean

如果把这些基本数据类型转换为对象的过程就是我们说的包装了。用得最多的是 String，然后面试的时候很多人都喜欢问下这些类型的转换，其实再正常不过了。

 ![Complete-set-of-Java-DATA-TYPES](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/original/2X/d/dd800ee8f5a012b759a7bd3d85de49261fb2c241.png)

在 Java 编程的过程中很多时候都要涉及到类型的转换了。

`==` 比较的是变量(栈)内存中存放的对象的(堆)内存地址，用来判断两个对象的地址是否相同，即是否是指相同一个对象。因为基本类型都是 CPU 进行计算的，比较地址能获得结果，这个不难理解吧。

在基本类型转换为对象后，使用 == 比较地址毫无意义，因为不同对象使用不同地址，这个也没毛病吧。

## 结论

- 因此结论就是如果是对象不能用 `==` 比较值，只能用 equals。
- Java 基本类型都是小写开头，包装类型都是大写开头，好记吧。
- 在包装类型的比较中，实际编程的时候都不一定直接用 equals 来比较，因为可能有空对象异常，通常都会用 Apache 的 Commons 或者 Guava 来比较。
