参考了String的不变性以后,写了以下验证:public class strConcat{
public static void main(String[] args){
String str2=new String("ABC");
String str1="ABC";
String str0="ABC";
//str1=str1+"2_3_";
System.out.println("str1:"+str1);
System.out.println("str0:"+str0);
System.out.println("str2:"+str2);
System.out.println("str1==str0:"+str1==str0);
System.out.println("str1==str0:"+String.valueOf(str1==str0));
System.out.println("str1==str2:"+String.valueOf(str1==str2));
System.out.println("str1 equals str0:"+str1.equals(str0));
System.out.println("str1 equals str0:"+str1.equals(str0));
}
}提问在楼下:
public static void main(String[] args){
String str2=new String("ABC");
String str1="ABC";
String str0="ABC";
//str1=str1+"2_3_";
System.out.println("str1:"+str1);
System.out.println("str0:"+str0);
System.out.println("str2:"+str2);
System.out.println("str1==str0:"+str1==str0);
System.out.println("str1==str0:"+String.valueOf(str1==str0));
System.out.println("str1==str2:"+String.valueOf(str1==str2));
System.out.println("str1 equals str0:"+str1.equals(str0));
System.out.println("str1 equals str0:"+str1.equals(str0));
}
}提问在楼下:
解决方案 »
- 工厂设计模式在JDK API中的哪些类中用到过?
- Swing做得界面中在程序更新数据库大量数据时会出现界面不动,独立线程也卡着不动
- 如何在页面跳转的同时,弹出提示框?
- 一道Java的算法题
- 打开多窗口程序的时候,怎么在打开另一个的时候隐藏前一个?
- intellij
- 请问如何利用数组名字中的数字操纵数组,例子如下,看起来挺有意思的哦!!!在线等待。。。。。。
- 通过jdbc连接SQLServer2000报错
- java小冬冬令我头疼--javax.swing.*; JLabel.setIcon()无法显示图片,,求教哦!~
- java api有没有相关的判断字符串为字母,数字,或者下划线组合的方法??
- 环境变量问题 请高手指点
- 事务提交前CURSOR不会关闭?
System.out.println("str1==str0:"+String.valueOf(str1==str0));//我调试了很久,同上如果不加String.valueOf也是直接false,怎么回事?
2.堆
"ABC"是在堆里
=号的作用是把"ABC"的引用给str2
str1="ABC";
str2="ABC";
如果不用new创建String
str2的时候就会先在pool里找有没有"ABC"这里引用str1指向了"ABC"所以就把str1的引用给了str2.即:str2=str1;
所以两个引用指的是同一个地方
我想知道如果用new创建以后对象是在堆还是栈
因为计算运算符比比较运算符优先级高 所以先计算"str1==str0:"+str1 然后才用==和str0比较 当然就是false了 应改为System.out.println("str1==str0:"+(str1==str0));加上括号就不受优先级影响了
新的对象会创建在 堆 中,对象的引用存储在 栈 中当String str2 = new String("ABC");
会在常量池中存在一个 ABC的字符串 ,在堆中创建一个String的对象,在栈中存储 这个对象的引用str2;常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量,Java会确保一个字符串常量只有一个拷贝
所以str1==str0是正确的2.String.valueOf();是String的静态方法,在这里应该是首先计算 str1==str0 返回true后
由String.valueOf()将其转换为String在赋予+操作
这下不知道怎么补偿大家的辛苦了
特别感谢redduke1202,该不是去查阅了资料了吧?,谢谢
我也要去查阅一翻