A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© SelonLiao 中级黑马   /  2014-10-12 16:01  /  1361 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        我知道,字符串是一个比较特殊的引用类型,特殊到有个地方我理解不了
        就下面这个例子,不明白为什么会得出这样的结果,麻烦各位大神给我一个清淅的解释

        public static void main(String[] args) {
               
                //创建一个字符串对象, 并将字符串传递进构造函数中
                String str = new String("Hello");
               
                //创建一个字符串
                String str2 = "Hello";
               
                //两者进行比较,得出的结果是 false,  这个我可以理解,这两个变量的地址是不一样的,所以得出的结果是 false
                System.out.println(str == str2);
               
               
                //可以这里我也是创建了一个新的字符串对象
                String str3 = new String();
                str3 = "Hello";   //然后给这个字符串对象赋值
               
                //打印出来后,结果却为  true , 这个我就不明白了,为什么会相等呢?
                System.out.println(str2 == str3);
        }

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

3 个回复

正序浏览
字符串一旦被初始化就不能被改变,str3和str2是指向了同一个对象。

评分

参与人数 1黑马币 +10 收起 理由
九零零 + 10 斑竹,我来舔你了

查看全部评分

回复 使用道具 举报
String str2 = "Hello";内存中把存储的'H','e','l','l','o'放到一个内存空间中存起来,而new是重新开了一个空间存储。str3 = "Hello";内存不会开辟新空间, 而是把str3指向了str2指向的的地址,所以str2==str3

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 舔回来

查看全部评分

回复 使用道具 举报 1 0
这个你脑子中清楚内存中的存储概念 就不用想都可以明白  堆内存中会有一个常量池
String str = "a" ;这句话意思是 str变量指向常量池中一个字符串类的对象 “a”
String str1 = new String("a");相当于两句话 str指向一个字符串对象String这个字符串对象的值是“a”
同上面的区别就是 str直接指向常量池中的“a”;而str1 指向对象String  当内存new出一个String对象时,它首先要在堆内存为这个对象(string)开辟一个空间,然后String指向常量池中一个字符串类的对象 “a”
简单讲 当引用str时返回的是“a”的地址值,引用str1时返回的是新建对象String的地址值
String str3 = new String();这句话是内存中new出一个String对象 当引用str3时,返回对象String的地址值
str3 = “a”;这句话是 变量str3 现在不指向对象String了,而是指向常量池中的“a”了,引用str3时,返回的是“a”的地址值
其实第三句话你可以参照 b= 3,b=4,第一次b指向3的地址,第二次b指向4的地址,而不能说4就是3,同理你不能说“a”就是new出的那个String。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马