关于Java字符串池的问题

关于Java字符串池的问题

考虑以下代码:

String first = "abc"; String second = new String("abc");

当使用new关键字,Java将创建abc String又来了对吧?是存储在常规堆中,还是存储在String泳池?多少Strings将以String泳池?


慕容3067478
浏览 365回答 3
3回答

神不在的星期二

如果您使用new关键字,一个新的String对象将被创建。注意,对象总是在堆上-字符串池不是独立于堆的单独内存区域。字符串池类似于缓存。如果你这样做:String s = "abc";String p = "abc";那么Java编译器就足够聪明,只生成一个String对象,以及s和p都将引用同一个字符串对象。如果你这样做:String s = new String("abc");那就会有一个String对象,即表示文本的对象。"abc",将会有一个单独的String对象,而不是在池中,该对象包含池对象内容的副本。自String在Java中是不可变的,您不能通过这样做获得任何东西;new String("literal")在Java中永远不会有意义,而且效率也是不必要的。请注意,您可以调用intern()在.上String对象。这会把String对象,并返回对池字符串的引用。(如果它已经在池中,它只返回对已经存在的对象的引用)。有关该方法的更多信息,请参见API文档。另见串实习(维基百科)

偶然的你

在……里面字节码,第一项任务是:  Code:    0:   ldc     #2; //String abc    2:   astore_1而第二个问题是:   3:   new     #3; //class java/lang/String    6:   dup    7:   ldc     #2; //String abc    9:   invokespecial   #4; //Method java/lang/String."":(Ljava/lang/String;)V因此,第一个在池中(位置#2),而第二个将存储在堆中。编辑因为CONSTANT_String_info 将索引存储为U2(16位,未签名)池最多可以包含2**16 = 65535参考资料。如果你在乎的话这里,JVM的更多限制.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java