这里将创建多少个对象?

时间:2018-07-26 05:45:24

标签: java

String x = "a"+"b";
x = x+"c";

请描述一下在内存分配中将创建多少个对象。

3 个答案:

答案 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());

这是字符串常量池在内存中的外观。 enter image description here

关于字符串常量池的另一件有趣的事情是,池空间根据对象的内容分配给对象。池中不会有两个内容相同的对象。

使用字符串文字创建字符串对象时会发生这种情况

“使用字符串文字创建字符串对象时,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”。

因此,要回答您的问题,此代码将仅生成一个对象。