还是那道JAVA题

来源:百度知道 编辑:UC知道 时间:2024/05/22 16:38:58
String a="a";
String b="b";
String c="ab";
String d="ab";
String e=a+b;

这次只考虑==
c==d为true
c==e为false

==是判断字符在字符池中的地址
c和d都是“ab”,指向同一地址所以为true
而e的结果也是“ab”,却没有指向“ab”的地址
难道e的结果是a的地址+b的地址吗

再回答你一次:

程序中用来存放数据的内存分为四块
1、全局区(静态区)(static)
2、文字常量区 :常量字符串就是放在这块区域,即是我们常说起的常量池。
3、栈区(stack):存放函数的参数值,局部变量的值等。
4、堆区(heap) : 存放对象

当我们定义字符串
String a = "a";
a在栈区,“a”是字符串常量,在常量池中
String b = "b";
b在栈区,“b”在常量池
String c="ab";
c在栈区,“ab”在常量池
String d="ab";
d在栈区,这个时候常量池里已经有"ab",所以直接使用已经有的那个“ab”
所以这个时候c和d都指向的常量池里面的同一个“ab”
String e=a+b;
e在栈区,a+b实际上产生了一个新的String对象,既然是String对象,所以结果“ab”放在堆区中,即e指向的是堆里的“ab”
这样的情况下,c==d为true,c==e为false
////////////////////////////////////
另外,如果定义的是字符串对象
String str1 = new String("ab");
str1在栈区,创建的“ab”字符串对象在堆区
String str2 = new String("ab");
str2在栈区,又创建的一个新的“ab”对象也在堆区,不过和刚才的“ab”不是同一个。
相当于堆区中有两个字符串对象,不过正好内容都是“ab”而已。

所以str1==str2为false

常量池里面放着的常量字符串可以重复使用,但是必须是你直接使用的该字符串,像a+
b这种形式虽然得到的结果是“ab”,但并不是使用的字符串常量“ab”

a+b相当于又创建了一个"ab&q