【问题标题】:How to access the object of String pool如何访问字符串池的对象
【发布时间】:2013-10-24 14:42:09
【问题描述】:

我们可以访问没有任何引用的字符串池中的对象吗? 这是代码:

String str ="abc";
str.toUpperCase();
System.out.println(str); // System.out.println(str.toUpperCase());

Output : abc

我在这里对str 执行toUpperCase() 操作。在字符串池中,将为此str.toUpperCase(); 创建一个对象。我们可以访问这个对象吗?如果是怎么办?

【问题讨论】:

  • 什么语言?在Java中你必须使用返回值str=str.toUpperCase();这与字符串池无关。
  • 嗨 holger,非常感谢.. 甚至这一行 'System.out.println(str.toUpperCase());'代码将给出预期的结果。但我的问题是内存'str.toUpperCase();//它包含结果“ABC”'中的这一行发生了什么......我们能否在不分配任何变量且不使用system.out的情况下访问此结果。 println() 语句。
  • 如果您不使用返回值,该对象将变为无法访问。垃圾收集器将在下一个 gc 循环中释放其内存。

标签: java string


【解决方案1】:

这是使用 java 文档的地方 .... 参考 http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#toUpperCase()

str.toUpperCase() 返回一个转换为大写的字符串,你必须将它分配给另一个字符串变量或进行自赋值,以便以后访问它。

【讨论】:

  • @Basilevs 这个问题与实习无关。
  • @Holger,您认为它还有哪些其他字符串池?堆?
  • @Basilevs 的问题是关于“访问具有“大写字符串”的对象。该链接包含他需要的信息。
  • @Basilevs 提问者根本不知道如何使用toUppercase 的返回值。否则他的问题没有任何意义。如果您不同意,请随时提供更好的答案。我还没有看到你的答案。
【解决方案2】:
String str ="abc";       // 1
str.toUpperCase();       // 2
System.out.println(str); // 3

在上面的代码中

第一行将创建String 的新对象,其值为“abc”,并将其分配给引用变量str

第二行将创建String 的新对象,因为String 类是不可变的,所以原始对象str 不会改变。但是这里我们没有分配在第 2 行创建的新对象,所以它会在堆区域的某个地方丢失。

这就是为什么在第 3 行打印值是“abc”。

如果您想使用str.toUpperCase() 创建的新对象,则必须将其分配到新的引用变量中。 或者 替代选项是像这样更新原始String 对象

str = str.toUpperCase();

但是在上面的操作中,包含值“abc”的原始Object str会在Heap区丢失!!!!!!

您可以找到有关working with String by example here 的详细信息。

【讨论】:

  • @ Krishn: 非常感谢......你的意思是我们不能访问'str.toUpperCase()'的结果而不分配给相同/其他字符串变量。
  • 是的,完全正确...我们必须将它分配给任何引用变量才能使用它...否则它将成为堆区域某处的丢失对象...!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2016-08-16
  • 2013-07-03
  • 1970-01-01
  • 2020-02-02
  • 2023-03-05
相关资源
最近更新 更多