解决方案 »

  1.   

    放入字符串池是在编译期(任何字面量值的字符串都是在编译期放入字符串常量池中的). 第一句话以后池里面就已经有abc. 编译的class会记录这个池中的引用, 等到运行期new String 的时候根据这个引用找到池中的值复制一份到堆上. 把堆内存地址给str1. 所以它们只是值相同, 没其它关系
      

  2.   

    String s1 = "abc";              1
    String s2 = "abc"; 2
    String s3 = new String("abc");  3
    java内存中有一个专门存储字符串的字符池(常量池)。当 1 执行时,字符池了新建“abc”
    的字符串。s1指向它。 当 2 执行时,因为字符池里已经有“abc”字符串,所以
    不会创建新的字符,将s2指向已有的“abc”。所以s1 == s2为true。s2 == "abc"为true。
    当第 3 执行时,创建了两个对象。第一个s3的引用,位于栈内存,第二个new String();
    位于堆内存,s3指向堆内存。
      

  3.   

    问题:s3 的堆内存存的是什么?堆内存中的存放的对象和字符串常量池中的abc 有什么关系?
      

  4.   

    在第一种方式中常量池中"abc"对象会被当做普通参数传递给构造函数的.
      

  5.   

    正解,我记得java编程思想里有解释
      

  6.   

    恩  四楼答的这些我是知道的。
    我想问问s3 引用的堆中的"abc" 和 字符串常量池中已经存在的"abc" 是什么个关系?
      

  7.   

    恩  四楼答的这些我是知道的。
    我想问问s3 引用的堆中的"abc" 和 字符串常量池中已经存在的"abc" 是什么个关系?
    存的地方都不一样,没有关系,值一样而已
      

  8.   

    问题:s3 的堆内存存的是什么?堆内存中的存放的对象和字符串常量池中的abc 有什么关系?
    个人理解应该是将字符串常量中的“abc”复制一份到堆内存中。
      

  9.   

    恩  四楼答的这些我是知道的。
    我想问问s3 引用的堆中的"abc" 和 字符串常量池中已经存在的"abc" 是什么个关系?这个问题问得好。对于你给的这个特定的具体的例子,我明确适之你,s3引用的堆中的那个“abc”(一个字符序列的空间) 与 字符串常量池中已经存在的"abc"(已化为一个字符序列),是同一个!即:(对于你这个特定的例子)s3引用的堆中的那个字符数组与 字符串常量池中已经存在的"abc"中的字符数组,是同一个!