Java字符串的“==”和“+”

  1. == 比较字符串:
    首先要明确, == 比较的是字符串内存地址,比较字符串的值使用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. 字符串相+的原理:
  • 如果+两边的字符串都是字符串值,那么编译器会优化,此时操作符+随便使用,如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);
}

你可能感兴趣的:(Java字符串的“==”和“+”)