我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时
String str = new String("test");
在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方?
据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“测试”已经可用。
如果我误解了这个概念,请澄清我。
使用intern()
:
public static void main(String[] args) throws IOException {
String s = new String(new char[] { 'a', 'b', 'c' }); // "abc" will not be added to String constants pool.
System.out.println(System.identityHashCode(s));
s = s.intern();// add s to String constants pool
System.out.println(System.identityHashCode(s));
String str1 = new String("hello");
String str2 = "hello";
String str3 = str1.intern();
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
System.out.println(System.identityHashCode(str3));
}
O/P:
1414159026
1569228633 --> OOPs String moved to String constants pool
778966024
1021653256
1021653256 --> "hello" already added to string pool. So intern does not add it again.
语句str=新字符串(“测试”) 创建一个字符串对象,该对象像任何其他对象一样存储在堆上。作为参数传递的字符串文本“test”存储在字符串常量池中。
String#intern()
检查字符串池中是否已存在字符串常量。如果已经有一个,它将返回它,否则它将创建一个新的并将其存储在池中。请参阅Javadocs:
返回字符串对象的规范表示形式。
字符串池最初是空的,由classString
私有维护。
调用intern方法时,如果池中已经包含一个与此字符串对象相等的字符串(由
equals(object)
方法确定),则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。
因此,对于任何两个字符串,当且仅当s.equals(t)
为真时,s.intern()==t.intern()
为真。
从JDK7开始,中间字符串存储在堆上。这来自JDK7的发行说明:
在JDK 7中,内部字符串不再在Java堆的永久生成中分配,而是与应用程序创建的其他对象一起分配到Java堆的主要部分(称为年轻和老代)。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。由于这种变化,大多数应用程序在堆使用方面只会看到相对较小的差异,但更大的应用程序会加载许多类或大量使用
字符串。intern()方法将看到更显著的差异。
想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 我正在学习Spring并构建一些实验应用程序。我不知道在哪里使用@Autowired来创建对象。 我得到了它促进松散耦合的部分,并且每次都创建一个新的对象,而不是“new”关键字所做的。 但是,对于我们需要在应用程序中使用的第三方对象,我们应该做些什么呢。例如,我正在使用一个rest API,为此我需要初始化三个类,如下所示 这段代
问题内容: 我正在使用它来获取当前时间: 我想将值(我将其打印)放入日期对象中,我尝试了以下方法: 但是eclipse告诉我这个功能不好。 编辑 的是,我打印您使用System.out.println的价值 问题答案: 每当您要将String转换为Date对象时, 请使用尝试使用 。另外的事情是,如果您想将转换为,则应该使用函数。 现在已不建议使用Point for you,现在 不建议使用。现在
返回前用调试器运行程序时,指针的值为0x0000000009DFAA90,但的值变为0x0000000009DFAA98。 这种情况只发生在字符串类型中。我试着对我的一个类的“int[10]”、“string*[10]”和对象做同样的操作,但问题只发生在处理string和代码时: 工作非常好。 有没有人能解释一下为什么会发生这种情况,以及如何使它正常工作? PS:我们正在使用Visual Stud
问题内容: 我是JSON的新手。我正在尝试在Java(org.json.JSONObject(json.jar))中创建一个类似于(基本上是一组名称- 值对)的JSON字符串 谁能帮助我如何用Java创建它?我希望名称和值都在其中,以便我可以遍历集合,然后获得单个值。 问题答案: 该库是链接的,因此您可以通过首先创建一个json数组,然后创建单个对象并将它们一次添加到数组中来创建对象,如下所示:
我在Kathy Sierra的书中读到,当我们使用new操作符创建String时,比如String s=new String(“abc”),因为我们使用了new关键字,Java将在普通(非池)内存中创建一个新的String对象,s将引用它。此外,字面上的“ABC”将被放置在池中。 intern()表示,如果String pool已经包含一个字符串,则返回池中的字符串;否则,将String对象添加到
问题内容: 如何使用下面的代码解组XML字符串并将其映射到下面的JAXB对象? 问题答案: 要传递XML内容,您需要将内容包装在中,然后将其解组: