1 对于基本数据类型来说,“==”是进行数值的比较
int a = 1;
int b = 1;
System.out.println(a == b);// true,a和b存的都是数值1,数值相同
2 对于引用数据类型来说,“==”是进行地址值的比较
int[] c = new int[]{1, 2, 3, 4};
int[] d = new int[]{1, 2, 3, 4};
System.out.println(c == d);// false,c和d分别存两个不同数组对象的地址值,地址值不同
3 “==”与常量池
通过双引号(字面量)的方式创建(直接创建)的字符串对象存储在常量池中。
String str1 = "abc"; // 通过字面量的方式创建字符串对象
String str2 = "abc";// 通过字面量的方式创建字符串对象
char[] charArray = {'a', 'b', 'c'};
String str3 = new String(charArray);// 通过构造函数的方式创建字符串对象
System.out.println(str1 == str2);// true
System.out.println(str1 == str3);// false
System.out.println(str2 == str3);// false
解释:
字面量方式会创建0或1个对象:
- 如果String Pool 中没有 “abc” 字符串对象,编译期会在String Pool中创建一个“abc”字符串对象,运行期返回String Pool 中该“abc”字符串对象的引用;
- 如果String Pool 中已经有一个 “abc” 字符串对象,则编译期不创建新的"abc" 字符串对象,运行期直接返回String Pool 中该 “abc” 字符串对象的引用;
new方式会创建1或2个字符串对象:
- 如果String Pool 中没有 “abc” 字符串对象,编译期会在String Pool中创建一个"abc"字符串对象;如果String Pool 中已经有一个 “abc” 字符串对象,则编译期不创建新的"abc" 字符串对象;
- 运行期使用 new 的方式在堆中创建另外一个"abc"字符串对象 ,并返回该字符串对象的引用;
如图所示:

本文详细解析了Java中'=='运算符的工作原理,包括其在基本数据类型和引用数据类型之间的区别,以及与字符串常量池的关系。通过具体示例说明了'=='如何比较数值、地址值和字符串引用。

907

被折叠的 条评论
为什么被折叠?



