话说一篇“String问题IBM面试”激起千层浪先后出现“一场IBM面试题引发的讨论:创建String对象过程中【内存分配】的终极权威详尽解释”“【向ZangXT等大侠提问】关于创建String新对象问题的8种情况”等等。我又搜索了下发现很久之前的帖子“(原创)深入研究java对String字符串对象的创建以及管理”其中主要的问题归纳起来是(后面引用时用数字代替)1.String a = "ab";//争论是1个还是2个2.String a = "a" + "b";//争论1个 2个 还是3个3.String a = new String("ab");//这个基本都认为是2个这三种情况个创立了几个对象(我这里只讨论String对象)我们先说说1与3的区别查阅了一下《Java程序设计与数据结构导论》里面说:虽然字符串不是基本数据类型,但是它非常基础,也经常使用,正因为如此,Java用一对双引号来定义字符串常量。这是一直简便的表达法。出现字符串常量时,系统自动创建一个String对象。也就是说,对String对象,不必非得明确使用new来调用其构造方法。大多数情况下,可以使用这种简化语法。我们看到上面红字的地方 大多数情况下效果是一样的 区别就在与使用new就要调用其构造方法那么是不是说1和3就是一样的呢?话说尽信书不如不读书。那我们再来看看最权威的API(1.6版)找到String类 
 
Code
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
例如: 
     String str = "abc";
 
等效于: 
     char data[] = {'a', 'b', 'c'};
     String str = new String(data); 
我们看到 String对象实际上就是char 数组 说明1和3都是创建了两个String对象 而1比3多创建了一个char数组 那我们再来看看2由于API的解释 2等效于:char data[] = {'a'};char data1[] = {'b'};String str = new String(data + data1);这说明2也只创建了2个String对象 (之前创建了2个char数组) 慢慢想来 在下说的有所遗漏 权当抛砖引玉 大家见笑了
 (由于发帖后不能修改,我会在我的博客上保持更新) 

解决方案 »

  1.   

    lz,api中是这么写的
    Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example:      String str = "abc";
     
    is equivalent to:      char data[] = {'a', 'b', 'c'};
         String str = new String(data);
    它是说这种写法可以理解为(等效于)先定义一个字符数组,再用它来初始化一个String。但是这并不是说在程序运行中第一种写法是这么执行的。写得很清楚,lz理解错了。
      

  2.   

    能推测是个好的习惯,但是推测了最好能找东西证明自己的想法.
    这个问题不想多说了,建议有兴趣的话自己去看jvm规范,说的比较明白了.
    还有一个建议,看书要学思路,学解决问题的手段和方式,而不是记忆结论.比如很多人看到String的+ 操作就说从Thinking In Java上看到的,+是用StringBuilder连接的,记住结论了,却没有分析结论适应的条件,完全不看作者是怎么分析的,估计Bruce Eckel会很遗憾.
    有精力做点有意义的事情吧,远离这种空谈.
      

  3.   

    “abc”应该是不创建对象,直接从常量对象池里拿到
      

  4.   

    珍爱生命,远离String
    嘿嘿
      

  5.   

    觉得比较有道理
    就是当初开发java的那些牛人,理解的和我们估计都不一样。
    要不咋出现这么多的书呢。只要道理一样就行了。
      

  6.   

      楼主的说法有点悬,支持一下5楼。《Effective Java》曾建议never use this: String str=new String("a");而应该用String str="a";
    照楼主的分析似乎与之正好相反,难道真是“尽信书不如无书”?
      

  7.   

    2.String a = "a" + "b";//争论1个 2个 还是3个 可以看看老紫竹的博客上面有说明
    答案是创建了一个对象