String x = "a"+"b";
x = x+"c";
请描述一下在内存分配中将创建多少个对象。
答案 0 :(得分:2)
String x = "a"+"b";
x = x+"c";
编译为以下字节码:
0: ldc #19 // String ab
2: astore_1
3: new #21 // class java/lang/StringBuilder
6: dup
7: aload_1
8: invokestatic #23 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
11: invokespecial #29 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: ldc #32 // String c
16: invokevirtual #34 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #38 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
如您所见,常量表达式"a"+"b"
由编译器转换为"ab"
,x = x+"c"
编译为(Java 9.0.1):
x = new StringBuilder(String.valueOf(x)).append("c").toString();
因此,您将获得以下对象:
"ab"
在字符串池中"c"
在字符串池中StringBuilder
char[]
内StringBuilder
String
返回的StringBuilder
byte[]
内的String
因此,如果您不计算字符串池中的字符串文字:
({StringBuilder
+ char[]
)+(String
+ byte[]
)= 4个对象
注意:StringBuilder
仅分配1个char[]
,因为它预先分配了16个额外的字符,足以附加所添加的1个额外的字符,即没有重新分配缓冲区。
如果您确实在字符串池中对字符串文字进行计数(应该这样做),则会得到更多的信息:
2 *(String
+ byte[]
)= 4个对象
总共 8个对象。
以上内容并未考虑到JIT进行的优化。
答案 1 :(得分:0)
我想您想知道java如何在内存中管理字符串。
每当您使用字符串文字创建字符串对象时,该对象就会存储在字符串常量池中,而每当您使用new关键字创建字符串对象时,此类对象都会存储在堆内存中。
例如,当您创建如下所示的字符串对象时,它们将存储在字符串常量池中。
String s1 = "abc";
String s2 = "xyz";
String s3 = "123";
String s4 = "A";
当您使用如下所示的new关键字创建字符串对象时,它们将存储在堆内存中。
String s5 = new String("abc");
char[] c = {'J', 'A', 'V', 'A'};
String s6 = new String(c);
String s7 = new String(new StringBuffer());
关于字符串常量池的另一件有趣的事情是,池空间根据对象的内容分配给对象。池中不会有两个内容相同的对象。
使用字符串文字创建字符串对象时会发生这种情况
“使用字符串文字创建字符串对象时,JVM首先检查要创建的对象的内容。如果池中存在具有相同内容的对象,则它将返回该对象的引用。它不会创建新对象。如果内容与现有对象不同,则只能创建新对象。
但是,当您使用new关键字创建字符串对象时,无论内容是否相同,都会创建一个新对象
希望它能使您走上正确的道路。
来源:https://javaconceptoftheday.com/how-the-strings-are-stored-in-the-memory/
答案 2 :(得分:-3)
将生成一个名为func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool
{
// return NO to disallow editing.
return true
}
func textFieldDidBeginEditing(_ textField: UITextField)
{
// became first responder
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool
{
// return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
return true
}
func textFieldDidEndEditing(_ textField: UITextField)
{
// may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
}
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason)
{
// if implemented, called in place of textFieldDidEndEditing:
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
{
// return NO to not change text
return true
}
func textFieldShouldClear(_ textField: UITextField) -> Bool
{
// called when clear button pressed. return NO to ignore (no notifications)
return true
}
的String对象。
第一行ist的“ x”值是“ ab”。
在第二行,将x
的值添加到对象x
,再添加“ c”。
因此,新值将为“ abc”。
因此,要回答您的问题,此代码将仅生成一个对象。