【问题标题】:Java final String, C++ equivalent. Is my understanding correct?Java final String,C++ 等价物。我的理解正确吗?
【发布时间】:2014-09-19 13:22:48
【问题描述】:

所以我偶然发现了以下一段 Java 代码:

final String osName = System.getProperty("os.name");

我在其他几个 StackOverFlow 问题中读到 String 类实际上是不可变的。于是我问自己下面的问题,为什么String声明为final?

我不太擅长 C++,但为了了解幕后发生的事情(在 Java 中),我决定看看 C++ 中的等价物。

如果我的理解是正确的,使 Java 中的 String final 等同于使 C++ 中的指针成为 const,那就是指针变量指向的内容无法更改。 Java 的限制是您只能更改指向该字符串的指针的常量,但指针指向的内存卡盘是不可变的。

所以我的问题是我是正确的还是我遗漏了其他东西?

【问题讨论】:

标签: java c++ string


【解决方案1】:

当我们说 Java String(s) 是不可变的时,这是因为 String 对象一旦创建就不能被修改。相反,当您想要修改字符串引用时,必须创建(并分配引用)新字符串。当您将 String 变量标记为 final 时,您还使引用不可变。

【讨论】:

  • 使引用不可变意味着什么?
  • @Ogen 您也不能将新的 String 对象分配给 String 引用(当它是 final 时)。就是这样。
【解决方案2】:

你的假设是正确的。 String 是不可变的,但没有最终声明,指针就无法更改。因此,如果您想“更改” String 变量,您可以这样做,但它实际上不会更改对象,它将创建一个新对象并将指针指向新对象。添加 final 使您无法执行此操作,它不会让您更改指针引用,并且它指向的 String 对象是不可变的,因此您无法更改 final String。

【讨论】:

    【解决方案3】:

    Java 在许多方面有所不同。

    在 Java 中,您永远无法在创建 String 后更改其内容 - 它是不可变的。此外,Java 引用本质上等同于 C++ 指针。但在 C++ 中,您可以更改 std::string 的内容,除非它被声明为 const

    综合起来:

    String s = "stuff"; // Java
    const std::string* s = new std::string("stuff"); // C++
    

    现在在 Java 中创建 Java 引用 final 意味着您不能将引用更改为指向不同的 String。这相当于在 C++ 中将指针设为 const:

    final String s = "stuff"; // Java
    const std::string* const s = new std::string("stuff"); // C++
    

    Jave 还自动为其Strings 管理内存。这在 C++ 中可以大致近似。

    像这样:

    String s = "stuff"; // Java
    std::shared_ptr<const std::string> s =
        std::make_shared<const std::string>("stuff"); // C++
    

    final String s = "stuff"; // Java
    const std::shared_ptr<const std::string> s =
        std::make_shared<const std::string>("stuff"); // C++
    

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 2018-01-25
      • 2010-11-13
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      相关资源
      最近更新 更多