- 用
==比较字符串:
首先要明确,==比较的是字符串内存地址,比较字符串的值使用equals()方法。
看下面几个例子:
String a = "233";
String b = "2" + "33";
String c = new String("233");
String d = c.intern();
System.out.println(a == b); true
System.out.println(a == c); false
System.out.println(a == d); true
字符串b会经过编译器优化,编译后代码为String b = "233",所以a == b。
关于字符串c、d的解释,请移步→ Java虚拟机内存模型的方法区。
- 字符串相
+的原理:
- 如果
+两边的字符串都是字符串值,那么编译器会优化,此时操作符+随便使用,如1所示的字符串b。 - 如果
+两边的字符串至少有一边不是字符串值,此时操作符+就不会优化了。如下面的字符串e。
e.g.
String a = "233";
String e = "6" + a;
String f = "6233";
System.out.println(b == e); false
此时字符串e等效于:
String e = new StringBuilder().append("6").append(b).toString();
通过查看StringBuilder的源码得知toString()方法实际调用的是new String(value, 0, count),所以b != e。
再看下面的代码:
String g = "a";
for (int i = 0; i < 100; i++) {
g += i;
}
等效于:
String g = "a";
for (int i = 0; i < 100; i++) {
g = new StringBuilder().append(g).append(i).toString();
}
每循环1次,都会先创建一个StringBuilder对象,再生成一个新的字符串对象,很影响效率。
如果一个字符串连续使用多次操作符+,此时应该尽量使用StringBuilder对象。
上述代码优化如下:
StringBuilder sb = new StringBuilder("a");
for (int i = 0; i < 100; i++) {
sb.append(i);
}












网友评论