String str="aaa";
String str=new String("aaa");到底有什么区别?
为什么有人说 String str=new String("aaa"); 这个产生了两个对象??
有谁能够证明 前者分配的内存在栈上??而第二个在堆上???
能证明这个,小弟佩服死你!!!!
String str=new String("aaa");到底有什么区别?
为什么有人说 String str=new String("aaa"); 这个产生了两个对象??
有谁能够证明 前者分配的内存在栈上??而第二个在堆上???
能证明这个,小弟佩服死你!!!!
解决方案 »
- java应该学习些什么
- 求助IllegalArgumentException异常的解决方法
- [新手提问]java 擦拭法
- java.util.ResourceBundle 和java.util.properties 这两个类有什么区别?
- 我刚买了一本《JAVA编程思想第三版》准备学习JAVA,结果连最基本的问题都不知道怎么解决,请各位大侠指教。。。
- 如何从一个文件中读取内容并写入另外一个文件,最好能有例子!
- import的疑问
- [ODBC SQL Server Driver]连接占线导致另一个 hstmt--------100
- 用jbuilder7编写成功运行正常的程序在用jdk中java命令执行出错,请帮忙!
- Java 8 Stream 之 short-circuiting
- Registry key 'Software\JavaSoft\Java Runtime Environment\CurrentVersion'
- 新手问题。谢谢啊。在线等
在这条语句中的确产生了两个字符串,第一个字符串是字符串常量"aaa",第二个字符串是new String语句产生的字符串,它的内容和"aaa"一样。给你一段程序,就可以看出他们的区别
String s1 = "aaa";
String s2 = "aaa";
String s3 = new String("aaa");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));如果你能把最后的结果想通,那么也就理解了"aaa" 和 new String("aaa")的区别了。
String s2 = "aaa";
String s3 = new String("aaa").intern();
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
看看这段程序和楼上的结果有什么区别?呵呵
String str=new String("aaa");//使用对象 又创建了一个与"aaa"相同内容的字符串,但与常量"aaa"不在同一个地方String s1 = "aaa";
String s2 = "aaa";
String s3 = new String("aaa");
System.out.println(s1 == s2);//true 同样使用的是常量,地址相同
System.out.println(s1 == s3);//false 使用常量与使用对象(new出来的)是不同的
System.out.println(s1.equals(s3));//true 内容相同,都是"aaa"
JDK 版本 1.4.2 (因JDK1.5编译有问题,故使用1.4)。1、反编译java.lang.String类
2、修改value成员和count成员为public。(原为private)
3、编译java\lang\String.java
4、将编译好的类替换jdk1.4下的jre下的lib下的rt.jar中String类
5、用新的jre环境编译下面的t.java。
6、运行类t,得到结果//t.java
public class t
{
public static void main(String arg[])
{
String s = "abcd";
String t = new String(s);
t.value[0]='A';
s.count = 3;
System.out.println(s);
System.out.println(t);
System.out.println(s.value.length);
System.out.println(t.value.length);
System.out.println(s.length());
System.out.println(t.length());
}
}
//运行结果如下
Abc
Abcd
4
4
3
4结论1:s和t确实是两个不同的对象
结论2:s和t共享存储区域
结论3:s和t分别对存储区域(char数组)进行管理(包括计数)未得出的结论1:s和t,谁在堆谁在栈,是系统内部概念,不知道怎么判定
未得出的结论2:s和t在某些情况下并不共享存储,当s中有用不着的空间时,什么时候这样?
你的结论1 的表述有问题, 因为 s和t不是对象,他们在Java中应该称为引用变量(conference variable),引用变量的作用是指向对象, 所以 s == t 是用来判断 s 和 t的值是不是一样,当返回值为true的时候,表示两个变量的值相等,也即表示他们都指向了同一个对象,反之,则表示他们指向了两个不同的对象。所以你的结论1应该改为: "abcd" 和 new String(s) 是两个不同的对象。其次,因为你结论1有错,所以后面的结论都有错。呵呵。
小弟先谢过各位。
看了看 API ,下面是该构造方法的说明:
String(String original) :
Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. 新的string对象是 引数 original 的拷贝,所以说是两个对象。
至于怎么证明在stack,或是heap,留作大家的思考。想出来的记得告诉我哦。
qq:81954716
System.out.println(s1.equals(s2));//return true
由于地址不同故返回flase,可他们的内容相等都是'xxx'故返回true。