【问题标题】:Does intern() ever create a literal in the pool?实习生()是否曾经在池中创建文字?
【发布时间】:2016-08-08 00:34:30
【问题描述】:
String s1=new String("abcd");
s2=s1.intern();

据说intern() 将在池中创建一个字符串文字,如果它不存在的话。

我的问题是这种情况何时会出现字符串对象存在但不存在文字的情况?而 intern() 将不得不实际创建一个新的字面量,然后返回对字面量的引用。

【问题讨论】:

  • 我们不想将每个字符串都放入字符串池中。仅当您稍后要重用此字符串时,将字符串存储在池中才有意义,例如,它适用于您在代码中创建的字符串文字,您可能需要多次使用它,例如for (i..){ System.out.print("write your number:"); array[i]=readNumber();}。但是,如果您从外部源(如文件/控制台/套接字/其他)逐行读取一些文本,您并不真的想让 JVM 记住所有这些行。您可能只想打印一次,然后让 GC 将它们从内存中删除。

标签: java string string-literals string-interning


【解决方案1】:

例如:

String first = "ab";
String second = "cd";
String interned = first.concat(second).intern();

程序中的大多数字符串都是动态创建的:通过连接值、通过套接字接收它们、从文件或数据库读取它们,或者从控制台或 GUI 读取它们。

请注意,您的术语是错误的。 intern() 不会创建字符串文字。它将字符串添加到池中,并且字符串字面量(即在字节码中出现 literally 的字符串,如 "abcd")与显式实习字符串一起存储在池中。

【讨论】:

  • 是否可以控制哪些字符串进入池?我的理解是每个字符串都应该在池中。
  • 字符串字面量在池中。其他字符串不是,除非您实习它们。为什么你要把所有的弦都放进池子里?假设您逐行读取 1GB 文件以提取一些数据并将数据写入另一个文件。然后,您将需要 2GB 的内存来将所有这些行存储在内存中,而没有任何意义:您将永远不会再重复使用这些行。
  • 你不需要 2GB 内存;向池中添加字符串并不意味着创建新实例——这是特定于实现的。您可能会收到相同的实例,现在是池的成员。更重要的是,即使将字符串添加到池中,它们仍然可以被垃圾收集。所以内存消耗不会改变。尽管如此,将这些临时字符串添加到池中会产生开销而没有任何好处,因为实习需要某种查找,例如散列,垃圾收集器可能有额外的工作来清除池的引用。
猜你喜欢
  • 2014-12-20
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多