- 用
==
比较字符串:
首先要明确,==
比较的是字符串内存地址,比较字符串的值使用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);
}
网友评论