【问题标题】:Object created while using String methods in java [closed]在java中使用String方法时创建的对象[关闭]
【发布时间】:2015-12-23 04:33:39
【问题描述】:
   public class StringDemo
   {  
     public static void main(String [] args)
      {  
        String s = "Sachin"; 
        s.concat(" Tendulkar"); 
        s.toLowerCase();  
        System.out.print(s);  
     } 
  }

这个例子给出的输出是:Sachin

那么创建了多少对象?

【问题讨论】:

  • 每个返回修改后字符串的字符串方法都会创建至少一个新对象。
  • "这个例子给出的输出为:Java" ...真的吗?
  • Java 字符串是不可变的。所以它应该打印 Sachin 而不是 Java。并且在您的程序中创建了 3 个 String 对象

标签: java string object


【解决方案1】:

答案是:一个不确定的数字。

  • 表面上看,s 上的两个操作都创建了一个 String 对象,
  • 在加载时会创建另外两个 String 对象来表示文字,
  • 可以在调用 print 时创建对象:在 System.out PrintWriter 及其包装的流堆栈内部,
  • 每个 String 对象可能(也可能没有)内部有一个独特的 char[] 对象,
  • s 上的操作可能会被优化掉,因为它们实际上对程序的输出没有影响 (!!),
  • 当应用程序被调用时,它将被传递一个 String[] 参数,可能会填充多个 String,并且(最终),
  • 在 JVM 引导和类加载期间将创建任意数量的对象...在应用程序启动之前。

因此,根据您计数的对象、计数方式以及您所做的其他假设,答案可能是从零到大量对象的某个数字。

注意:正常的 quiz 答案是“创建了 2 个字符串”,但正如您所见,答案比这复杂得多。

注意 2:concat 和 toLowerCase 方法不会在字符串池中创建字符串。实际上,将字符串放入池中的唯一 String 操作是 intern。 (很容易通过实验验证这一点,或者通过阅读 Java 类库源代码。)

【讨论】:

    【解决方案2】:

    String在java中是不可变类型。

     s.concat(" Tendulkar"); 
     s.toLowerCase();  
    

    这两行返回 2 个不同的字符串,不会影响原始字符串。

    【讨论】:

    • 所以它只创建一个对象吧?
    • @Ramanlfc 我们不要忘记文字 " Tendulkar" 本身就是一个对象:P。
    • @AvinashJadhav 正如 Tom 引起我的注意,你实际上有 4 个字符串对象
    • 每个 String 对象实际上可以包含 2 个单独的对象;即每个字符串都有一个内部char[]。然后是when对象被创建的问题...
    【解决方案3】:

    在 java 中 String 被认为是不可变的,这意味着它一旦创建就不能更改,所以如果你计算你有多少,在第一行你声明了第一行,当你创建 s.concat("SE 6")一个新对象,最后s.toLowerCase() 创建了第三个对象,因此创建了 3 个字符串对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多