问些String问题

来源:百度知道 编辑:UC知道 时间:2024/05/07 17:15:38
1.一个字符串就是String内的一个匿名对象吧?
如果是那就是说开辟了新的堆内存吧!
2. ==这个应该是比较内存的地址吧?
3.为什么String a="baidu";
String b="baidu";
a和b指向的堆内存应该不同吧?
为什么输出System.out.print(a==b);答案为true?
麻烦各位指点下!

1.准确的说是一个私有的引用..在实例化String对象的时候才确定它指向哪里.

2.是的..

3.字符串常量是存放在常量区的,即a和b指向的同一个字符串常量的,因此a==b是成立的

用 这种方式定义String 的话,会先在堆中找 相同的串,如果有的话,就让栈中的b 指向应经存在的“baidu”。所以a ,b 指向的是同一块内存空间。
但 如果用 new的话 是直接创建一块内存的。

1.想要开辟新的堆内存,就要用new String();
比如像String s="abc";
这不是开辟内存,而是在栈内存中放入一个abc,然后让s指向它.
2.是的.
3.因为a和b引用了同一个在栈内存中的"baidu",所以它们必然相等.
如果你写成这样:
String a=new String("baidu");
String b=new String("baidu");
然后a==b,就是false;

看下常量池你就会懂了!!

1、String 对象的所有 字面量 都是 单例 的。

其原因在于
a、 String 对象的 特殊性: 内容不可改变。
b、 String 字面量 设计成 单例 ,也体现了 java 的优越性:节省内存。
c、 String 对象 的 == 比较 ,在实际开发应用中,根本不会被调用, 因为没有任何实际意义。

2、对于自己 new 出来的 String 对象则需要另外理解。

String c = new String("baidu");
System.out.print(a==c);答案为false

String d = new String("baidu");
System.out.print(d==c);答案为false

原因在于 new 运算符 是用来创建对象的,分配新的地址空间是必须的