Java中一个关于String对象的小笔记

Posted on 2011-07-21 10:24 ChunPIG 阅读(177) 评论(0)  编辑  收藏
    今天在iteye看到一个关于常量池与new 对象的问题。于是便有了这篇小笔记。
    请看代码:
   
public class StrTest {
    public static void main(String[] args) {
        String str1 = new String("test");
        String str2 = "test";
        String str3 = "test";
        
        System.out.println("str1 == str2 : " + (str1 == str2));
        System.out.println("str1.equals(str2):" + str1.equals(str2));
        System.out.println("str2== str3 : " + (str2 == st3));
    }
}
输出结果如下:
str == str1 : false
str.equals(str1):true
str1 == str2 : true
起初,咋一看觉得很诧异。后来多看了一眼便明白了。这起始是涉及到New关键与”=“赋值的区别,以及equals关键与比较符=的区别。
首先,就new与=,谈点个人的认识。通过new出来的对象,通常是存在堆里面。而通过=赋值的对象通常存在常量池中。
    由此可以证明:上面代码str1==str2的结果为false,而str2==str3结果是true。
    str1与str2的值虽然一样,但是存放在位置不一样,所以对象所指的地址也就不一样。
然后=在比较的时候,一般情况下都是比较地址。
从而也就引出了下一个问题:
比较符==与equals的区别。
==对于两个变量则是比较值,对于引用类型变量则是两个变量在堆中存储的地址是否相同。
而equals则是对两个变量是否是对同一个对象的引用,也就是在堆中的内容是否相同。
    由此也可证明:str1.equals(str2)的结果是true。

这是本人作为Java菜鸟的一点点看法。欢迎各位老鸟拍砖。

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 1, comments - 0, trackbacks - 0, articles - 0

Copyright © ChunPIG