我知道,当我们使用下面给出的字符串文本时,字符串对象是在字符串池中创建的(如果它不存在的话)。
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";
为您的示例创建了多少对象?
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";
在这种情况下,我们将只有两个对象,因为
s1
和s2
都将指向池中具有相同char
-数组的相同String
对象。
在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的表示法是为了让我们不必复制字符串的字符就可以这样做!
资料来源:算法第四版
每次调用新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个对象。 两个注意事项: 总是创建一个新对象。字符串文字只能为所有情况创建一个对象。最佳实践是永远不要使用-实例化是多余的。 两个字符串的连接转换为,因此在此处创建了另一个对象。