为了账号安全,请及时绑定邮箱和手机立即绑定

关于Java字符串池的问题

关于Java字符串池的问题

慕容3067478 2019-06-15 13:38:17
关于Java字符串池的问题考虑以下代码:String first = "abc"; String second = new String("abc");当使用new关键字,Java将创建abc String又来了对吧?是存储在常规堆中,还是存储在String泳池?多少Strings将以String泳池?
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

如果您使用new关键字,一个新的String对象将被创建。注意,对象总是在堆上-字符串池不是独立于堆的单独内存区域。

字符串池类似于缓存。如果你这样做:

String s = "abc";String p = "abc";

那么Java编译器就足够聪明,只生成一个String对象,以及sp都将引用同一个字符串对象。如果你这样做:

String s = new String("abc");

那就会有一个String对象,即表示文本的对象。"abc",将会有一个单独的String对象,而不是在池中,该对象包含池对象内容的副本。自String在Java中是不可变的,您不能通过这样做获得任何东西;new String("literal")在Java中永远不会有意义,而且效率也是不必要的。

请注意,您可以调用intern()在.上String对象。这会把String对象,并返回对池字符串的引用。(如果它已经在池中,它只返回对已经存在的对象的引用)。有关该方法的更多信息,请参见API文档。

另见串实习(维基百科)


查看完整回答
反对 回复 2019-06-15
?
偶然的你

TA贡献1841条经验 获得超3个赞

在……里面字节码,第一项任务是:

  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的更多限制.


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 364 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信