String str=new String("abc")到底创建了几个对象

这句代码到底创建了几个对象?研究了好一阵,现在才能说清楚。
package com.sun.test;

public class Test<T> {
	T a;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str=new String("abc");
	}
}
我们来看下这段简单代码的字节码:
<pre name="code" class="java">Classfile /D:/Workspaces/MyEclipse10/JavaTools/bin/com/sun/test/Test.class
  Last modified 2014-5-21; size 677 bytes
  MD5 checksum 65b161d88c06818975226b4792c9fe1b
  Compiled from "Test.java"
public class com.sun.test.Test<T extends java.lang.Object> extends java.lang.Object
  SourceFile: "Test.java"
  Signature: #35                          // <T:Ljava/lang/Object;>Ljava/lang/Object;
  minor version: 0
  major version: 50
  flags: ACC_PUBLIC, ACC_SUPER

Constant pool:
   #1 = Class              #2             //  com/sun/test/Test
   #2 = Utf8               com/sun/test/Test
   #3 = Class              #4             //  java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               a
   #6 = Utf8               Ljava/lang/Object;
   #7 = Utf8               Signature
   #8 = Utf8               TT;
   #9 = Utf8               <init>
  #10 = Utf8               ()V
  #11 = Utf8               Code
  #12 = Methodref          #3.#13         //  java/lang/Object."<init>":()V
  #13 = NameAndType        #9:#10         //  "<init>":()V
  #14 = Utf8               LineNumberTable
  #15 = Utf8               LocalVariableTable
  #16 = Utf8               this
  #17 = Utf8               Lcom/sun/test/Test;
  #18 = Utf8               LocalVariableTypeTable
  #19 = Utf8               Lcom/sun/test/Test<TT;>;
  #20 = Utf8               main
  #21 = Utf8               ([Ljava/lang/String;)V
  #22 = Class              #23            //  java/lang/String
  #23 = Utf8               java/lang/String
  #24 = String             #25            //  abc
  #25 = Utf8               abc
  #26 = Methodref          #22.#27        //  java/lang/String."<init>":(Ljava/lang/String;)V
  #27 = NameAndType        #9:#28         //  "<init>":(Ljava/lang/String;)V
  #28 = Utf8               (Ljava/lang/String;)V
  #29 = Utf8               args
  #30 = Utf8               [Ljava/lang/String;
  #31 = Utf8               str
  #32 = Utf8               Ljava/lang/String;
  #33 = Utf8               SourceFile
  #34 = Utf8               Test.java
  #35 = Utf8               <T:Ljava/lang/Object;>Ljava/lang/Object;
{
  T a;
    flags: 

    Signature: #8                           // TT;

  public com.sun.test.Test();
    flags: ACC_PUBLIC

    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #12                 // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 4: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   Lcom/sun/test/Test;
      LocalVariableTypeTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/sun/test/Test<TT;>;

  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC

    Code:
      stack=3, locals=2, args_size=1
         0: new           #22                 // class java/lang/String
         3: dup
         4: ldc           #24                 // String abc
         6: invokespecial #26                 // Method java/lang/String."<init>":(Ljava/lang/String;)V
         9: astore_1
        10: return
      LineNumberTable:
        line 10: 0
        line 11: 10
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      11     0  args   [Ljava/lang/String;
              10       1     1   str   Ljava/lang/String;
}

类文件中包括了abc这个字面量,当这个类运行的时候,类加载器首先会加载本类,类文件中的constant pool(比如那个abc)会被加载进运行时常量池,并以String对象保存在运行时常量池中。然后运行main方法,这个时候String pool中已经包含了abc的Sting 对象,所以这个时候只有创建了一个对象,也就是new String(),在堆中的那个对象。然后在讨论String中的intetrn方法:
Open Declaration String java.lang.String.intern()

Returns a canonical representation for the string object. 

A pool of strings, initially empty, is maintained privately by the class String. 

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. 

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. 

All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification

Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
也就是说如果 String pool中包含了内容相同的字符串,便会把这个对象的引用赋到需要这个对象的创建方法中。
package com.sun.test;

public class Test<T> {
	T a;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str=new String("abc");
		str.intern();
	}
}
这样的话,在JDK 1.6和1.7没有区别都是创建一个对象。因为String pool已经有了abc。

String str=new String("abc")到底创建了几个对象,布布扣,bubuko.com

时间: 2024-07-30 13:49:16

String str=new String("abc")到底创建了几个对象的相关文章

【转】String str = new String(&quot;abc&quot;)创建了多少个对象?

原帖地址:http://www.cnblogs.com/dolphin0520/p/3778589.html 这个问题在很多书籍上都有说到比如<Java程序员面试宝典>,包括很多国内大公司笔试面试题都会遇到,大部分网上流传的以及一些面试书籍上都说是2个对象,这种说法是片面的. 如果有不懂得地方可以参考这篇帖子: http://rednaxelafx.iteye.com/blog/774673/ 首先必须弄清楚创建对象的含义,创建是什么时候创建的?这段代码在运行期间会创建2个对象么?毫无疑问不可

String,你到底创建了几个对象????

Java代码   String str=new String("aaa"); 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个.由于 new String("aaa")相当于"aaa"与一个就是创建出来的放在堆时原实例对象,而另一个就是放在常量池中的 "aaa" 对象,当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象. 常量池(constant pool)指的是在编译期被确定,并被保存在已

String str = new String(&quot;abc&quot;),这段代码一共生成了几个String对象?为什么?

String str = new String("abc")创建了俩个对象,首先为创建一个String对象"abc",然后在调用String类的构造方法时 1 public String(String original) { 2 //other code ... 3 } 再次创建了一个对象original,并把"abc"这个对象传给original,进而赋值给str. 所以一共创建了2个对象.

经典String str = new String(&quot;abc&quot;)内存分配问题

出自:http://blog.csdn.net/ycwload/article/details/2650059 今天要找和存储管理相关的一些知识,网上搜了半天也没有找到完善的(30%的程度都不到),没办法,下载了曾经大学里的一本pdf格式的教学书,看了整整一天才算是搞明白存储管理中的一部分知识.曾几何时,我曾写过大学无用的一些小论题,觉得大学里教的东西不切合实际,理论化偏严重,总认为用理论教出来的人,总是说着牛逼,做事掉渣的人.所以,在大学里,我的学习只能说是应付考试,太多的东西都没有去深入了解

关于String str =new String(&quot;abc&quot;)和 String str = &quot;abc&quot;的比较

String是一个非常常用的类,应该深入的去了解String 如: String str =new String("abc") String str1 = "abc" System.out.println(str == str1) System.out.println(str.equal(str1)) 结果: false true 原因解析: Java运行环境有一个字符串池,由String类维护,执行语句String str="abc"时 1.

String str=&quot;abc&quot; 与 String str = new String(&quot;abc&quot;)

1.java运行环境有一个字符串池,由String类维护,执行语句String str="abc"时: 1.首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在  字 符串池中新建一个字符串"abc",然后再将其赋给str. 2.执行语句String str = new String("abc");时.不管字符串池中是否存在字符串"abc",

【Java】String str = new String(&quot;abc&quot;);问题

String str = new String("abc"); 构造方法说明:java.lang.String.String(String original) 解释:Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a cop

String str 与 String str=new String(&quot;&quot;) 区别

1.当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用.若不存在则创建. 2.当使用String str=new String("abc");时,不管事先是否存在"abc",每次都会创建其新的对象. 测试一下: String s1="abc";           String s2="abc";         

Java中String直接赋字符串和new String的区别 如String str=new String(&quot;a&quot;)和String str = &quot;a&quot;有什么区别?

百度的面试官问 String A="ABC"; String B=new String("ABC"); 这两个值,A,B 是否相等,如果都往HashSet里面放,能放下吗? 答:A==B 不等,但是A.equals(B)相等:因为相等,所以都往HashSet里面放不下,只能放一个 这个问题涉及到常量池的概念, 问:String str=new String("a")和String str = "a"有什么区别? 答: ==与e