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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 愿㊡╃數曐曐メ 中级黑马   /  2013-5-29 23:15  /  2667 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class test
{
public static void main(String [] args)
  {
   String s1="abc";
    String s2=s1;
    String s3="abc";
    }
}
请问一下能创建多少个字符对象呢?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

23 个回复

倒序浏览
不太明白你说的什么意思,能说清楚点吗
回复 使用道具 举报
n+1         
回复 使用道具 举报
本帖最后由 张林敏 于 2013-5-30 13:12 编辑

其实这3个 s1 s2 s3 指向的是同一个字符串常量
回复 使用道具 举报
我也不懂你说的意思,你可以说清楚一点。
回复 使用道具 举报
张林敏 发表于 2013-5-30 13:08
其实这3个 s1 s2 s3 指向的是同一个字符串常量

敏敏有卖萌了,说清楚点呀。
回复 使用道具 举报
string 类只是引用类型而已,可以自己添几句 system.out.print(s1==s2);  system.out.print(s1==s3); 多试试就明白了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
我个人理解:

我看着好像就一个对象。因为"abc"是在常量池中,无论多少个变量指向他,他都是一个对象。
然后又让s2指向了"abc",根本就是多个变量在操作同一个对象。

欢迎反驳
回复 使用道具 举报
只针对这段代码的话,应该是一个对象,s1、s2、s3指向同一个对象"abc",s1,s2,s3是三个String类型的常量

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
看上去好像都是指向的同一个引用对吧?因为他们都没new对象,都只是引用“abc”的那个内存地址
那到底是不是呢?记住用eclipse实验哈子,因为软件运行结果不会骗人
public static void main(String[] args) {
                String s1="abc";
            String s2=s1;
            String s3="abc";
            System.out.println(s1==s2);
            System.out.println(s1==s3);
            }
        }
结果:
true
true
实际上最准确的比较方法还是比较字节码
        public static void main(String[] args) {
                String s1="abc";
            String s2=s1;
            String s3="abc";
            Class cl1 = s1.getClass();
            Class cl2 = s2.getClass();
            Class cl3 = s3.getClass();
           System.out.println(cl1==cl2);
            System.out.println(cl1==cl3);
            }
结果:
true
true

结果显示指向同一个地址,也就是他们都是指向的是同一个内存地址!

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
袁梦希 发表于 2013-5-30 17:03
我个人理解:

我看着好像就一个对象。因为"abc"是在常量池中,无论多少个变量指向他,他都是一个对象。

呵呵,团长
回复 使用道具 举报
执行过程应该是这样的:java虚拟机首先会看它的栈中是不是有“abc”这个字符串常量,如果有 内存中就有一个引用s1指向它,如果没有 java虚拟机就先生成一个“abc”放在它的栈里面,然后让s1指向它。然后s2是s1的一个引用。因为栈中的数据是可以共享的,所以s3也是指向栈中的这个“abc”。所以 s1 s2 s3其实都指向的栈中的统一字符串。
如果 s1=new String("abc");就是生成的一个对象了 ,这个对象会放在堆里面 。
这也是java堆好栈的区别
个人意见。。。。。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 Sofoul 于 2013-5-30 23:22 编辑

可以创建很多个,只要你愿意,不过没啥意义,字符串操作非常耗费内存。

无标题234234.png (25.84 KB, 下载次数: 0)

无标题234234.png

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 赞一个!

查看全部评分

回复 使用道具 举报
可以创建很多,知道内存撑不下来的时候,你定义一个对象引用,就固定在的内存中开辟一个内存空间,对象类型都一样的话,那么每个的容量就确定了,用内存的总容量除以你定义的对象引用的容量,就可以算出来能定义多少个。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
在内存中开辟了一个空间,存放“abc”,,s1=”abc“于是得到了他的地址,然后s1==s2,所以s2也得到了“abc”地址,然后s3=”abc“也是同一个abc,所以得到的也是abc的地址啊。。。是不是呢?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
Lobon 中级黑马 2013-5-31 00:02:18
16#
1个!!!
回复 使用道具 举报
      你如果问的是你上面的代码创建了几个字符串对象,那肯定是创建了一个字符串对象"abc"。
String s1,String s2,String s3 只是定义了三个String类类型的引用变量,他们三个都引用"abc"这个字符串对象。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1

查看全部评分

回复 使用道具 举报
肯定只创建了一个对象,就是只创建了一个“abc”对象,它存在于常量池中,s1,s2,s3这三个引用指向的是同一个“abc对象”。
回复 使用道具 举报
本帖最后由 苑永志 于 2013-6-15 00:22 编辑
Changer_s 发表于 2013-5-30 21:22
看上去好像都是指向的同一个引用对吧?因为他们都没new对象,都只是引用“abc”的那个内存地址
那到底是不 ...

你的理解好像有点问题呀,你说
”实际上最准确的比较方法还是比较字节码“
所有String对象在内存中都只对应一个Class实例(class字节码),也就是任意一个String对象str.getClass()返回的结果都是相等的,跟字符串是否指向同一个对象是毫无关系的
回复 使用道具 举报
苑永志 发表于 2013-6-15 00:21
你的理解好像有点问题呀,你说
”实际上最准确的比较方法还是比较字节码“
所有String对象在内存中都只对 ...

后面的确有点问题,现在还是对字节码产生了疑惑,为什么比较的时候要用:== 来比较。就像你的一样,那如果是同一种类型的比较,他们的字节码永远都一样,那张孝祥老师说的==比较是什么意思呢?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马