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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-8-29 17:57  /  2213 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜佳瑞 于 2012-8-29 18:04 编辑


创建对象时,在内存分配空间的问题一直没弄明白。今天在网上查资料看到这样一个结论,希望有人能帮忙解释下
用new String(“java”)方式实例化 String 对象时,实际上是开辟了两个内存空间,所以一般在开发上都采用直接赋值的方式,即:String str1 = "java" 。  

还有String str1 = "java" ,有的解释是先看字符串池里面有没有,如果有的话就不会创建新的对象了,如果没有会在堆内存创建一个这样的对象吗?

7 个回复

正序浏览
黑马_许芸 发表于 2012-8-29 18:28
String s = "aaa";(采取字面值方式赋值)
1)查找String Pool中是否存在"aaa"这个对象,如果不存在,则在Stri ...

很详细,明白了。非常感谢
问题解决了
回复 使用道具 举报
电脑卡 发了两条 不好意思 道个歉哈!
回复 使用道具 举报
String str1 = new String("java");

我的理解是: 这个题目可以看成 是两个String str1 = new String;
                                                    String str1 ="java";
第一个是New一个String类型的对象名叫str1;
在将这个对象str1赋值为"java";
在内存中分布的话
  第一个创建的对象是在堆内存当中,而第二个是在常量池的。

楼主信我的没错。信老毕有肉吃哈哈 至理名言 毕老师有讲过这题的。仔细琢磨下 你一定可以懂哈哈 加油!!
回复 使用道具 举报
String str1 = new String("java");

我的理解是: 这个题目可以看成 是两个String str1 = new String;
                                                    String str1 ="java";
第一个是New一个String类型的对象名叫str1;
在将这个对象str1赋值为"java";
在内存中分布的话
  第一个创建的对象是在堆内存当中,而第二个是在常量池的。

楼主信我的没错。信老毕有肉吃哈哈 至理名言 毕老师有讲过这题的。仔细琢磨下 你一定可以懂哈哈 加油!!
回复 使用道具 举报

这些可以对楼主有所启发
        String s="abc";
        String s1=new Strng("abc");是否相同?
        前者"abc"是一个对象。后者是两个对象,new string()代表一个对象,"abc"也代表一个对象。
        Sop(s1==s2);==比较的是数据。false
        Sop(s1.equals(s2));比较的是内存的地址值,equals覆写了Object类中的equals方法。
        True
       
        面试题2:
        String a="abcd";//在缓冲池创建了一个abcd的字符串。
        String a1="ab";//a1和a2都是变量,无法确定。
        String a2="cd";
        String b=a1+a2;//b是要重新进行分配的。
        String c="ab"+"cd";//两个都是常量值,用连接符连接在一起还是字符创。abcd
        System.out.println("a==b:"+(a==b));//false
        System.out.println("a==c:"+(a==c));//true
回复 使用道具 举报
String s = "aaa";(采取字面值方式赋值)
1)查找String Pool中是否存在"aaa"这个对象,如果不存在,则在String Pool中创建一个"aaa"对象,然后将String Pool中的这个"aaa"对象的地址返回来,赋给引用变量s,这样s会指向String Pool中的这个"aaa"字符串对象。
2)如果存在,则不创建任何对象,直接将String Pool中的这个"aaa"对象地址返回来,赋给s引用。


String s = new String("aaa");
1)首先在String Pool中查找有没有"aaa"这个字符串对象,如果有,则不在String Pool中再去创建"aaa"这个对象了,直接在堆中(heap)中创建一个"aaa"字符串对象,然后将堆中的这个"aaa"对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个"aaa"字符串对象。
2)如果没有,则首先在String Pool中创建一个"aaa"对象,然后再在堆中(heap)创建一个"aaa"对象,然后将堆中的这个"aaa"对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个"aaa"对象。
回复 使用道具 举报


毕老师当初讲到字符串时确实讲过这两者的区别
s2中 new就是一个对象  "123"又是一个对象
s1是直接从常量池中查找字符

s1一旦初始化就不可以改变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马