【问题标题】:how many number of objects and references are created?创建了多少个对象和引用?
【发布时间】:2021-08-28 02:07:15
【问题描述】:

我在 sn-p 下面厌倦了这个,得到了 3 个对象和 3 个引用的答案。 但在答案键中说它是 4 个对象和 3 个引用。如果我错了或答案键,我会感到困惑。请有人帮忙。

String str1=new String("Java"); //line 1
String str2=new String("GFT");  //line 2
String str3=str1;               //line 3 
str1=str1.concat(str2);         //line 4
str3=str2.toUpperCase();        //line 5

我的答案的解释:

参考:str1,str2,str3。所以引用数=3。

对象:最初创建的对象 count=0。

  • 第 1 行创建具有值“Java”和引用“str1”的新对象。对象创建计数=1。
  • 第 2 行创建具有值“GFT”和引用“str2”的新对象。对象创建 count=2。
  • 第 3 行创建新引用“str3”,它不创建新对象,它指向第 1 行 (str1) 中创建的对象。
  • 第 4 行创建了值为“JavaGFT”的新对象,str1 现在指向该对象。对象创建计数=3。
  • 第 5 行有一个值“GFT”,因为它已经存在 str3 现在指向由 str2 创建的对象,因为 str2 是使用 new 运算符创建的。(我验证了 str2==str3 是否返回 true) 所以最终对象创建了 count=3,引用 count=3。

是这样吗?

【问题讨论】:

    标签: java string object heap-memory


    【解决方案1】:

    由于只有三个唯一的变量名,并且每个变量名都是一个引用,所以你是对的,有三个引用。

    然而,在 Java(和许多其他语言)中,字符串是不可变的,这意味着对字符串的任何操作都会返回一个全新的字符串。

    您的误解似乎与String.toUpperCase() 有关。如果字符串已经完全大写,那么这将返回一个与原始字符串相等的新字符串。你可以测试一下:

    String strA = "ABC";
    String strB = strA.toUpperCase();
    // two objects that are technically different, though they look and act the same as each other
    
    print(strA == strB);       // false - they are not the same string 
    print(strA.equals(strB));  // true  - however, they are equal to each other
    

    在 Java 中,这对于 任何对象* 都成立 - == 检查将比较两个引用的内存位置,如果它们都指向内存中的相同位置,则返回 true .同时,.equals() 可以为对象自定义行为。如果没有被覆盖,这将回退到== 检查,但 String 会覆盖该行为并在字符串相同时返回 true

    因此,总共创建了四个对象:

    • new String("Java")
    • new String("GFT")
    • str1.concat(str2)
    • str2.toUpperCase() // 与 str2 相同,但技术上不是同一个对象

    *注意:这不适用于 intdouble 等原语,它们没有 .equals() 方法,因为它们不是对象。

    【讨论】:

    • 在我的测试中,如果toUpperCase() 已经是大写字母,它实际上会返回this。至少在 OpenJDK 16 上。换句话说,strA == strA.toUpperCase() 正在为我返回 true
    • 另外,new String("Java") 应该,假设 "Java" 尚未被实习,导致创建两个对象。这意味着 可能 OP 的示例代码正在创建 6 个对象。
    • 但是 str2 不是使用 = 运算符创建的。它是使用 new 运算符创建的。因此,当我在执行 toUpperCase() 后运行它时,str2==str3 返回 true。这意味着它们是相同的对象,对吧?
    • @Slaw Nitpicking about new String("Java"):表示"Java" 文字的(实习)字符串在执行列出的语句时不会创建,但事先,很可能在类加载/初始化时间附近。
    猜你喜欢
    • 2014-08-01
    • 2020-06-06
    • 2012-05-13
    • 2014-11-26
    • 1970-01-01
    • 2018-04-28
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多