如果不行的话,如何解释:
class test
{
public static void main(String[] args)
{
String a = "abc";
String b = "def";
System.out.println(a==b); String c = "abc";
String d = "abc";
System.out.println(c==d);
}
}
结果是
true
false
class test
{
public static void main(String[] args)
{
String a = "abc";
String b = "def";
System.out.println(a==b); String c = "abc";
String d = "abc";
System.out.println(c==d);
}
}
结果是
true
false
应该是:
false
true
在java中没有像c++中的字符重载
在java中"=="符号如果用于比较引用,比较的是两个引用的指向的地址是否一致而不是内容是否一致
,equals()函数比较内容是否一致
String b = "def";
String c = "abc";
String d = "abc";这四句创建了2个字符串常量,"abc"和"def",变量a、c、d分别引用"abc",变量b引用"def"。
故"a==c"、"a==d"、"c==d"都是true
string b = "B";
a+b;// "+"
int A = 0;
int B = 1;
A+B;// "+"加号不是重载吗?
StringBuffer tmp = new StringBuffer();
tmp.append(a);
tmp.append(b);
a = tmp.toString();
if (true) return;
doSomething(); //编译错误,因为这段代码在“编译期”就已经能被确定永远不会被执行
}只要有一个String不能在编译期确定其值的话(比如是一个参数,或者其他方法的返回值,即使这个参数的值或者函数返回值永远固定),那么还是如上所讲,使用StringBufferpackage test;public class Test {
private static final String a = "a" + "a" + "a" + "aa";
private static final String b = "b" ;
private static final String c = "c";
private static final String d = a + b + c; public static void main(String[] args) { }}
反编译结果
package test;public class Test { // Fields
private static final String _$258 = "aaaaa";
private static final String _$259 = "b";
private static final String _$260 = "c";
private static final String _$261 = "aaaaabc"; // Constructors
public Test() { } // Methods
public static void main(String[] args) { }
}
因为String是使用一种特殊对象处理的.String c = "abc";
String d = "abc";
是相同的字符,c、d是指向同一个内存地址。所以"=="返回是true;
当执行c = c+ "a";的时候,c又被重新分配了地址,再执行c==d则返回false;
{
public static void main(String[] args)
{
String a = "abc";
String b = "abc";
System.out.println(a+" "+b+" "+(a==b)); b = b + "d" ;
System.out.println(a+" "+b+" "+(a==b)); b = b.substring(0,3);
System.out.println(a+" "+b+" "+(a==b));
}
}
结果是:
abc abc true
abc abcd false
abc abc false
证明了楼上的观点。会不会是编译器作的事情呢?在编译的时候将所有相同的字符串都用一个对象来存储,
而在运行时就不会再检查相同的字符串是否使用同一个对象了,对吧?