当前位置: 首页 > 知识库问答 >
问题:

如果对象是用新操作符创建的,为什么要在字符串中插入方法?

邴俊达
2023-03-14

我看到了很多关于使用字符串文字和新关键字创建对象的问题,比如:

使用新运算符的String对象数量

但这并不能澄清我的疑虑。

情况1:使用字符串文字的字符串对象。它在字符串常量池中创建一个对象,如果它不存在,则返回此对象的引用。此对象被隐式驻留。

案例2:使用new()的字符串对象。它创建了两个对象,一个在字符串常量池中,另一个在堆区域中。引用变量引用堆区域对象。对于这个对象,我们需要调用intern方法来显式地将这个对象放入字符串常量池。

我的问题是,如果new()已经在字符串常量池中创建了一个对象,那么对堆区域中的对象调用intern方法有什么用呢?

共有2个答案

段溪叠
2023-03-14

案例1:使用字符串文字的字符串对象。它在字符串常量池中创建一个对象

对的

如果是,它不存在

错。它是存在的。

否则,返回此对象的引用。

它总是返回对象的引用。没有“其他”的说法。

这个对象是隐式的。

不是真的。它已经被搁置了,因为它是一个字符串。编译器和类加载器负责这一点。不是new运算符

案例2:使用new()的字符串对象。它创建两个对象,一个在字符串常量池中

不是真的。它已经在那里了:见上文。

还有一个在堆区。

对的

引用变量引用堆区域对象。对于这个对象,我们需要调用intern方法来显式地将这个对象放入字符串常量池。

对的

我的问题是new()是否已经在字符串常量池中创建了一个对象

没有,见上图。

洪和平
2023-03-14

用new()创建两个对象,一个在字符串常量池中,另一个在堆区域中。

只有当您创建一个新的String对象时,才会传递一个字符串文本,如下所示:

String s = new String("hello");

文字"Hello"将导致创建字符串常量池中的对象。new String将在堆上创建一个新的String对象,其中包含对象内容的文本副本。

你不应该像那样创建String对象,因为这样做是不必要的,而且效率低下。

然而,还有其他一些原因让你想做newstring(…) ,当传递给构造函数的值不是字符串文字时。例如,该值是从文件读取的数据。

 类似资料:
  • 使用此代码创建了多少个对象?-我知道3个字符串文本在字符串常量池中,StringBuilder对象在堆中,但当我调用reverse()、insert()或append()时,它会在池中创建一个新字符串吗?

  • 问题内容: 有没有办法从Java中的String变量创建新类? 另外,如果可能,生成的对象是否必须为Object类型? 也许有更好的方法,但是我希望能够从XML文件中检索值,然后实例化以这些字符串命名的类。这些类中的每一个都实现相同的接口,并从相同的父类派生,因此我将能够在该类中调用特定的方法。 问题答案: 这是你想做的: 请注意,newInstance方法不允许使用参数化的构造函数。(请参阅Cl

  • 代码如下: 运行时,这是错误消息: 错误:不匹配'运算符*'(操作数类型是'std::__cxx11::字符串{aka std::__cxx11::basic_string 如何修复此错误并使程序正确运行?

  • 问题内容: 我们通常使用关键字创建对象,例如: 字符串是对象,但是我们不能用来创建它们: 为什么是这样?我可以用做一个琴弦吗? 问题答案: 除了已经说过的内容外,Java中的字符串文字(即像Java 一样但不喜欢的字符串)是经过内插的-这意味着,每次引用时,你都将引用一个String实例,而不是一个新实例。每一次。因此,你将拥有: 但是如果你有 那么就有可能 (如果有人需要提醒,请务必使用比较字符

  • 本文向大家介绍为什么字符串对象在Java中是不可变的?,包括了为什么字符串对象在Java中是不可变的?的使用技巧和注意事项,需要的朋友参考一下 通常,字符串用于表示重要细节,例如数据库连接URL,用户名密码等。字符串的不变性有助于使这些细节保持不变。 类似地,在加载类时,将String用作参数。那时,更改字符串可能会导致加载错误的类。 如果不可变,则变量(字符串)自动为线程安全的。

  • 问题内容: 仅在字符串中具有对象类型时,如何创建对象?我正在寻找类似的东西: 当使用不同的ORM库(例如GORP和GORM)时,这将非常有用和方便。 可以在Golang中做到吗? 问题答案: 没有… 好吧,答案是“是,但是”,但是很大。Go中没有结构名称的中央注册表。您不会得到一个很好的,干净的标准库函数,该函数可能正是您所希望的。 相反,您必须自己编写映射,例如