代码如下:public static void main(String[] args) {
StringBuilder orgin = new StringBuilder("12321");
String sOrgin = orgin.toString();
StringBuilder orgin2 = orgin.reverse();
String sOrgin2 = orgin2.toString();
System.out.println(sOrgin==sOrgin2);
System.out.println(sOrgin.equals(sOrgin2));
}运行结果,第一个是false,第二个是true。现在想问的是,第一个结果为何是false,在执行String sOrgin = orgin.toString();之后,sOrgin是栈上的引用,orgin.toString()还是堆上的空间吗。从结果上看貌似是的,堆上的字段进行运算之后还是分配在堆上是吗 自己不太明白。
StringBuilder orgin = new StringBuilder("12321");
String sOrgin = orgin.toString();
StringBuilder orgin2 = orgin.reverse();
String sOrgin2 = orgin2.toString();
System.out.println(sOrgin==sOrgin2);
System.out.println(sOrgin.equals(sOrgin2));
}运行结果,第一个是false,第二个是true。现在想问的是,第一个结果为何是false,在执行String sOrgin = orgin.toString();之后,sOrgin是栈上的引用,orgin.toString()还是堆上的空间吗。从结果上看貌似是的,堆上的字段进行运算之后还是分配在堆上是吗 自己不太明白。
所有生成的新对象都是在堆内存中。
reverse方法生成了一个新的stringbuilder,也就是在生成的新的堆内存,所以sOrgin2和sOrgin这两个变量指向的地址不一样
因为两次调用tostring时字符串的不相同,所以也就生成了两个地址。。
而sOrgin.equals(sOrgin2)为真,是因为他们还是一个对象,你可以试试sOrgin2 == sOrgin的结果
楼上的解释还是有点问题,String对象直接赋值是给的常量池里的字符串对象地址,但是new操作时,会拷贝常量池里的字符串对象,这个时候拿到的其实是这个新的拷贝对象的地址。
String a = new String("1");
String b = new String("1");
System.out.println(a==b);//这个一样返回false
LZ可以试试如下代码:
StringBuffer sb = new StringBuffer("abc");
String str1 = sb.toString();
String str2 = sb.toString();
System.out.println(str1 == str2);