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

将为String创建多少个对象?

茅鸿宝
2023-03-14

我知道,当我们使用下面给出的字符串文本时,字符串对象是在字符串池中创建的(如果它不存在的话)。

String str1= "hello";
String str2= "hello";

在上述情况下,池中只会创建一个字符串对象。

但是,当我们使用new关键字时,它总是在堆内存中创建一个新的String对象(即使String池中有一个)

 String str3=new String("hello"); // here a new object will be created in heap.

在这里,我有一个困惑,关于在下面的情况下将创建多少对象,以及在哪里(池或堆内存)。

 1) String s="Hello";
    String s1 = new String ("Hello");

 2) String s = new String("Hello");
    String s1 = new String("Hello");

 3) String s="Hello";
    String s1=new String (s);

 4) String s1 = new String ("Hello");
    String s="Hello";

共有3个答案

崔绍辉
2023-03-14

为您的示例创建了多少对象?

 1) 4        
 2) 4        
 3) 3        
 4) 4

请注意,每个String对象都包含一个包含字符串内容的char-数组。因此,当创建一个新的字符串时,实际上创建了两个对象

1) 2)和4)

示例中的每一行要么在池中创建一个String,其中包含一个char-数组(因此我们有两个对象),要么创建一个新的String,其中再次包含一个char-数组。请注意,在这些示例中,字符串都不共享任何内容。

3)

这个例子是不同的,因为我们使用第一个字符串(2个对象)来创建第二个字符串。在这种情况下,第二个字符串将是一个新对象,但它将使用与第一个相同的字符-数组,因此不会创建新对象。这导致总共只有3个对象,而不是4个。

再举一个例子

String s1 = "Hello";
String s2 = "Hello";

在这种情况下,我们将只有两个对象,因为s1s2都将指向池中具有相同char-数组的相同String对象。

富锦
2023-03-14

在Java的String对象中,我们可以用与任何其他对象相同的方式来计算内存,只是字符串的混淆现象很常见。

标准字符串实现有四个实例变量:对字符数组(8字节)的引用和三个int值(每个值4字节)。第一个int值是字符数组中的偏移量;第二个是计数(字符串长度)。

就图中图形中的实例变量名称而言,所表示的字符串由值[偏移量]到值[偏移量计数-1]组成。String对象中的第三个int值是一个哈希代码,在某些情况下可以节省重新计算。

因此,每个字符串对象总共使用40个字节(16个字节用于对象开销,4个字节用于三个int实例变量,8个字节用于数组引用,4个字节用于填充)。

这个空间要求是对数组中字符本身所需空间的补充。字符所需的空间是分开计算的,因为字符数组通常在字符串之间共享。由于字符串对象是不可变的,这种安排允许实现在字符串对象具有相同的基础值[]时节省内存。字符串值和子字符串。

长度为N的字符串通常使用40个字节(对于html" target="_blank">字符串对象)加上24个2N字节(对于包含字符的数组),总共使用64个2N字节。但在字符串处理中,使用子字符串是很典型的,Java的表示法是为了让我们不必复制字符串的字符就可以这样做!

资料来源:算法第四版

梁渊
2023-03-14

每次调用新String(...)都会创建一个新实例。可以使用String.intern()从池中获取实例。

String s="Hello";
String s1 = new String ("Hello");
System.out.println(System.identityHashCode(s)==System.identityHashCode(s1));


String si= new String ("Hello").intern();
String s1i = new String ("Hello").intern();
System.out.println(System.identityHashCode(si)==System.identityHashCode(s1i));

这印的是真假

 类似资料:
  • 问题内容: 我有以下Java代码: 问题很简单:调用此方法将创建多少个对象? 一开始我回答说创建了5个String对象,但是我的书回答说只有3个对象被创建,没有给出解释(这是一个SCJP问题)。 从我的角度来看,有5个对象:“ Fred”,“ 47”,“ Fred47”,“ ed4”,“ ED4”。 我也在SCJP模拟考试中找到了这个问题,答案是3。 问题答案: “ Fred”和“ 47”将来自字

  • 问题内容: 我和我的朋友正在讨论Strings,而我们坚持了这一点: 他说总共将创建三个对象,而我说将创建一个对象。 他在3个对象之后的逻辑是:一个用于“ ObjectOne”,一个用于“ ObjectTwo”,第三个是两个String对象的串联版本。 我在一个对象后面的逻辑是在编译时,两个字符串对象都将在字节码中串联为: 并且在运行时,将仅以这种方式创建一个对象。这背后的真相是什么? 问题答案:

  • 所以我不确定是0还是2。 如果有人知道请告诉我。

  • 我厌倦了下面的片段,得到了3个对象和3个引用的答案。但在回答键中说,这是4个对象和3个参考。我不知道是我错了还是回答键错了。请有人帮忙。 我的答案解释: 参考文献:str1、str2、str3。因此引用数=3。 对象:最初创建的对象计数=0。 第1行创建值为Java并引用str1的新对象。对象创建计数=1。 第2行创建值为“GFT”并引用“str2”的新对象。对象创建计数=2。 第3行创建新引用“

  • 如果我们使用 那么创建了多少对象,它们驻留在哪里?

  • 问题内容: 当涉及到String时,对于对象的情况我有点困惑,因此想知道以下代码将创建多少个对象,并针对String池和堆对String对象的创建进行了一些解释。 问题答案: 将创建4个对象。 两个注意事项: 总是创建一个新对象。字符串文字只能为所有情况创建一个对象。最佳实践是永远不要使用-实例化是多余的。 两个字符串的连接转换为,因此在此处创建了另一个对象。