首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果它们的值相等,Java中是否有其他类似String对象的变量或对象将共享一个内存位置或对象引用?

如果它们的值相等,Java中是否有其他类似String对象的变量或对象将共享一个内存位置或对象引用?
EN

Stack Overflow用户
提问于 2016-05-27 20:37:24
回答 3查看 41关注 0票数 1

我了解到以下变量将在JVM中共享相同的内存位置,因为它们的值是相同的:

代码语言:javascript
复制
String banana = "yummy";
String strawberry = "yummy"; // banana == strawberry is true here

除非您为其中一个提供了类似这样的"new“关键字:

代码语言:javascript
复制
String banana = "yummy";
String strawberry = new String("yummy"); // banana == strawberry is false

从而强制创建一个新的字符串对象。

我想知道的是,在Java中,除了String类的对象之外,是否还有其他对象会发生这种情况?

EN

回答 3

Stack Overflow用户

发布于 2016-05-27 21:15:27

是的,还有其他类型的应用程序。下面是一个例子:

代码语言:javascript
复制
  Integer a = 42;
  Integer b = 42;

自动装箱产生的-128到+127范围内的Integer实例保证是同一个对象;参见JLS 5.1.7BooleanByteShortCharacter也有类似的保证。它还可以应用于上述更大的范围,并适用于Long,尽管这是特定于平台的。

实际上,您真正询问的是T类型的示例,其中t1.equals(t2)表示t1 == t2……用于T的某些子集。对于所有数组类型和未覆盖Object.equals的任何类类型都是如此。后者的示例包括所有enum类型、java.lang.Classjava.lang.StringBuilderjava.lang.Object本身。

票数 3
EN

Stack Overflow用户

发布于 2016-05-27 20:57:49

不适用,只适用于String对象。

票数 0
EN

Stack Overflow用户

发布于 2016-05-27 21:09:29

代码语言:javascript
复制
String banana = "yummy"; 

是对字符串池中的"yummy“的引用。

代码语言:javascript
复制
String strawberry = new String("yummy");

在堆中创建新对象

字符串具有方法intern()

返回string对象的规范表示。

下面的代码输出为true:

代码语言:javascript
复制
String banana = "yummy";
String strawberry = new String("yummy"); 
System.out.println(banana == strawberry.intern());

请参阅String javadoc

无论如何,对于引用类型的对象,使用method equals。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37483788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档