awo*_*ker 6 java intellij-idea
当我使用IDE - "IDEA 14.03"时,它总是给我这个通知.注意:'StringBuilder sb'可以替换为'String'
下面是详细信息,当我定义一个名为"sb"的对象时,对象类是"StringBuilder".这是我尝试过的代码段:
StringBuilder sb = new StringBuilder("status=").append(status).append(" ,msg=").append(msg);
System.out.println(sb);
Run Code Online (Sandbox Code Playgroud)
我只想知道如果我将"StringBuilder"更改为"String"有什么好处.为什么IDE总是通知我更改类类型?
Ad *_*tum 12
我想为了理解你的IDE为什么要把StringBuilder改成String,你应该理解String,StringBuffer和StringBuilder之间的区别.
字符串是不可变的.这意味着如果您想要从字符串中更改某些内容,则不会删除原始字符串,而是创建一个新字符串,其中包括您的更改.StringBuffer和StringBuilder是可变的.这意味着对您的更改,原始字符串将相应更改.
它们之间的另一个主要区别是String和StringBuffer是线程安全的,而StringBuilder则不是.还有其他差异,请查看此网站以了解有关差异的更多信息.
如果将String与StringBuilder进行比较,在大多数情况下,使用String更加实用和合乎逻辑,如果您不知道,您对字符串执行了什么操作.
将字符串与加号(+)连接并不总是更好.例如,如果由于其可变性而在循环中更改字符串,则StringBuilder的append方法更符合逻辑.请阅读代码中的注释;
String a;
StringBuilder b;
for(int i=0; i<5; i++)
{
a += i; //String is immutable and in each iteration, a new object will be created
b.append(i); //StringBuilder is mutable and in each iteration, the existing string will be used.
}
Run Code Online (Sandbox Code Playgroud)
您的IDE所做的只是向您展示最佳实践.这就是为什么,它被称为推荐.
如果你想继续前进,不要让Intellij警告你; 你可以禁用警告;
@ CrazyCoder的评论在这里需要注意.
IDE在这里实际上非常聪明,它建议你改变它以获得更好的代码可读性,因为内部编译器将生成完全相同的字节码,并且你的代码将具有相同的性能和相同的内存使用,但它将更容易阅读.您可以获得可读性优势,而不会影响性能.不久前在IntelliJ IDEA论坛上提出并回答了类似的问题.
我知道这是一个老问题,已经得到了很好的回答,但只是一个无关紧要的小评论:在这种情况下,为了可读性,(并且因为编译器和 Ad 提到的一样),我会使用 String 。格式。代替
StringBuilder sb = new StringBuilder("status=").append(status).append(" ,msg=").append(msg);
Run Code Online (Sandbox Code Playgroud)
我发现这更具可读性:
String.format("status=%s, msg=%s", status, msg);
Run Code Online (Sandbox Code Playgroud)
小智 5
因为code 1
String s1 = "a";
String s2 = "b";
String result = s1 + s2;
Run Code Online (Sandbox Code Playgroud)
和code 2
String s1 = "a";
String s2 = "b";
String result = new StringBuilder().append(s1).append(s2).toString();
Run Code Online (Sandbox Code Playgroud)
编译成后bytecode,两段代码的结果是一样的。code 1将被编译器优化StringBuilder为:bytecode
L0
LINENUMBER 15 L0
LDC "a"
ASTORE 1
L1
LINENUMBER 16 L1
LDC "b"
ASTORE 2
L2
LINENUMBER 17 L2
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 2
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 3
L3
LINENUMBER 18 L3
RETURN
L4
LOCALVARIABLE args [Ljava/lang/String; L0 L4 0
LOCALVARIABLE s1 Ljava/lang/String; L1 L4 1
LOCALVARIABLE s2 Ljava/lang/String; L2 L4 2
LOCALVARIABLE result Ljava/lang/String; L3 L4 3
MAXSTACK = 2
MAXLOCALS = 4
Run Code Online (Sandbox Code Playgroud)
从 的角度来看bytecode,IDAE 认为这两种写法是等价的,而且 的写法code 1更加简洁。所以建议使用code 1
ps:如果你不喜欢它,你可以关闭这个提示:)
以上测试基于jdk1.8
| 归档时间: |
|
| 查看次数: |
6846 次 |
| 最近记录: |