Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将整数转换为字符串-从性能和内存的角度使用字符串文字或原语?_Java_String_Concatenation_Primitive - Fatal编程技术网

Java 将整数转换为字符串-从性能和内存的角度使用字符串文字或原语?

Java 将整数转换为字符串-从性能和内存的角度使用字符串文字或原语?,java,string,concatenation,primitive,Java,String,Concatenation,Primitive,备选案文1: String newStr = someStr + 3 + "]"; 备选案文2: String newStr = someStr + "3" + "]"; 在性能、记忆和一般实践方面,哪个选项更好? 我可以使用哪些推荐的工具/方法来测量代码的内存使用情况及其性能(除了测量开始时间和结束时间并计算差异)两者之间不会有任何明显的差异。使用您认为最符合逻辑和可读性的内容。我会用 String newStr = someStr + "3]"; 我推荐它作为一个很棒的java应用程序

备选案文1:

String newStr = someStr + 3 + "]";
备选案文2:

String newStr = someStr + "3" + "]";
在性能、记忆和一般实践方面,哪个选项更好?
我可以使用哪些推荐的工具/方法来测量代码的内存使用情况及其性能(除了测量开始时间和结束时间并计算差异)

两者之间不会有任何明显的差异。使用您认为最符合逻辑和可读性的内容。我会用

String newStr = someStr + "3]";
我推荐它作为一个很棒的java应用程序评测工具,帮助我发现很多内存问题

我认为选项1和选项2在内存使用方面没有太大区别,特别是对于桌面应用程序而言。

第一个选项将成为:

StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append (3);
sb.append ("]");
String newStr = sb.toString ();
StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append ("3");
sb.append ("]");
String newStr = sb.toString ();
第二个将成为:

StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append (3);
sb.append ("]");
String newStr = sb.toString ();
StringBuilder sb = new StringBuilder (String.valueOf (someStr));
sb.append ("3");
sb.append ("]");
String newStr = sb.toString ();
以下是拆卸:

public String foo (String someStr)
{
    String newStr = someStr + 3 + "]";
    return newStr;
}

public String bar (String someStr)
{
    String newStr = someStr + "3" + "]";
    return newStr;
}

public java.lang.String foo(java.lang.String);
Code:
   0: new           #16                 // class java/lang/StringBuilder
   3: dup
   4: aload_1
   5: invokestatic  #18                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   8: invokespecial #24                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
  11: iconst_3
  12: invokevirtual #27                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  15: ldc           #31                 // String ]
  17: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  20: invokevirtual #36                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  23: astore_2
  24: aload_2
  25: areturn

public java.lang.String bar(java.lang.String);
Code:
   0: new           #16                 // class java/lang/StringBuilder
   3: dup
   4: aload_1
   5: invokestatic  #18                 // Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   8: invokespecial #24                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
  11: ldc           #44                 // String 3
  13: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  16: ldc           #31                 // String ]
  18: invokevirtual #33                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  21: invokevirtual #36                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  24: astore_2
  25: aload_2
  26: areturn
publicstringfoo(stringsomestr)
{
字符串newStr=someStr+3+“]”;
返回新闻TR;
}
公共字符串栏(字符串someStr)
{
字符串newStr=someStr+“3”+“]”;
返回新闻TR;
}
public java.lang.String foo(java.lang.String);
代码:
0:new#16//类java/lang/StringBuilder
3:dup
4:aload_1
5:invokestatic#18//方法java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
8:invokespecial#24//方法java/lang/StringBuilder。”“:(Ljava/lang/String;)V
11:iconst_3
12:invokevirtual#27//方法java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
15:ldc#31//String]
17:invokevirtual#33//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20:invokevirtual#36//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
23:astore_2
24:aload_2
25:轮到你了
公共java.lang.String栏(java.lang.String);
代码:
0:new#16//类java/lang/StringBuilder
3:dup
4:aload_1
5:invokestatic#18//方法java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
8:invokespecial#24//方法java/lang/StringBuilder。”“:(Ljava/lang/String;)V
11:ldc#44//String 3
13:invokevirtual#33//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16:ldc#31//String]
18:invokevirtual#33//方法java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21:invokevirtual#36//方法java/lang/StringBuilder.toString:()Ljava/lang/String;
24:astore_2
25:aload_2
26:轮到你了

假设someString是常量,则两者都是常量表达式,将在编译时进行计算。它们将导致相同的类文件和运行时行为

资料来源:报告写道:

编译时常量表达式是一个表示原语类型的值或字符串的表达式,该值或字符串不会突然完成,并且仅使用以下内容组成:

  • 基本类型的文字和字符串类型的文字(§3.10.1、§3.10.2、§3.10.3、§3.10.4、§3.10.5)

  • 加法运算符
    +
    -
    (§15.18)

String类型的编译时常量表达式总是“interned”,以便使用String.intern方法共享唯一实例

如果someString不是常量,大多数现代编译器将使用StringBuilder,这是Java语言规范明确规定的:

字符串串联的结果是对字符串对象的引用,该对象是两个操作数字符串的串联。在新创建的字符串中,左操作数的字符位于右操作数的字符之前

字符串对象是新创建的(§12.5),除非表达式是编译时常量表达式(§15.28)

实现可以选择在一个步骤中执行转换和连接,以避免创建然后丢弃中间字符串对象。为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似技术来减少通过表达式求值创建的中间字符串对象的数量

对于基本类型,实现还可以通过直接从基本类型转换为字符串来优化包装器对象的创建


每当连接一个字符串时,每次连接时,都会创建该字符串的新副本,并且两个字符串都会被复制,每次复制一个字符。这导致时间复杂度为O(n2)(McDowell)

如果要提高性能,请使用

StringBuilder
其中一个构造函数具有以下语法:

public StringBuilder(int size); //Contains no character. Initial capacity of 'size'. 
StringBuilder(可变字符序列。请记住字符串是不可变的)通过简单地创建所有字符串的可调整大小的数组来帮助解决此问题。仅在必要时将其复制回字符串(McDowell)

参考:

麦克道尔,盖尔·拉克曼。破解编码面试,第6版。印刷品


“Stringbuilder(Java平台SE 8)”。Docs.oracle.com。N.p.,2016年。网状物2016年6月4日。

两者没有任何区别。@Smit:编译器将使用
StringBuilder
作为字符串concatenation@Smit:使用StringBuilder将导致与问题中的代码相同的字节码,或者更糟。@JBNizet和@jlordo,但这是一个不同的答案。我理解错了什么?阅读答案的结尾和评论。答案先是弄错了,然后试图变得正确。阅读米哈伊尔·弗拉基米罗夫对这个问题的回答。第一个将附加
3
(装箱为整数3),然后附加
]
。第二个附加
3]
+1。我不知道为什么,但我的眼睛看到了这一刻的永恒