Posted on 2006-03-02 20:56
killvin 阅读(914)
评论(0) 编辑 收藏 所属分类:
java
原文: http://forum.javaeye.com/viewtopic.php?t=17912
搂主的问题问的含含糊糊:flyjie给出了非常详细的解释,
不过就是没有解释String实例化的特殊方面以及Intern()方法的含义
-------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
java代码:
String str ;
这样声明str它只支是一个对象的reference,不会产生实际的对象。如果没有初始化str,编译时便会发生错误。
java代码:
String str1=new String("test");
String str2 = "test";
str1是一个新的对象。new关键字的意思就是创建某个新的对象。而str2是一个对象的引用。 它们的内容相同,但内存地址是不一样的。 java中对象的引用存在Stack(栈)中,而对象由Heap(堆)分配空间。
3、引用==变量? 不一定
java代码:
public class TestString {
public static void main(String[] args) {
String s1 = "test";
String s2 = new String("test");
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
if (s1.equals(s2))
System.out.println("s1 equals s2");
else System.out.println("s1 not equals s2");
}
}
我们将 s2 用 new 操作符创建程序输出:s1 != s2 s1 equals s2.
java代码:
s2 = s2.intern();
在你加上这句话后,上面的程序输入:s1 == s2 s1 equals s2
而String a = "test" ; String b = "test" ; a == b 会返回true; 这里a="test"时创建一个在栈中的reference, b=test时jvm发现栈中已存在名为"test"的字符串,直接引用。结论:String 是个对象,要对比两个不同的String对象的值是否相同明显的要用到 equals() 这个方法. 而== 比较的是内存地址的值。
4、private final String a = "test", 这个a属于常量,存放在常量存储空间(CS)中。
5、建议你看看<<深入浅出java虚拟机>>一书。
-------
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
总结
1. 在学习JAVA的时候就知道==比较的是内存地址.而equals比较的是内存地址对应的值!(可是还是有很多的人问来问去的,真不知道他们JAVA的基础课程是怎么学的?!)
2. JAVA所有的对象都是存放在堆中的!你获取的"对象"仅仅只是对象的引用而已
3. String是比较特殊的对象,特殊在
3.1 > String a = new String("test") -此时你是在堆中实例化了一个字符串对象
3.2 > String b = "test"-此时JVM会先去堆中寻找这样的对象;如果有就返回此对象的引用;如果没有就重新实例化一个这样的对象!基于这样的一个过程所以JAVA要求String不可以更改值的。
3.3 >intern()方法就是试图完成这样的一个寻找过程
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
这里有一份详细的参考资料:
关于Java栈与堆的思考 http://www.javafan.net/article/20051123115654293.html