我们知道, 在java中,对象的比较要用equals,对于下面这段代码:
public class EqualsTest {
public static void main(String[] args) {
String a = "a";
String b = "a";
System.out.println("a == b ? " + (a == b));
}
}
输出结果为:
a == b ? true
对于下面这段代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = "a";
String b = in.nextLine();
System.out.println("a == b ? " + (a == b));
}
}
运行时输入a后回车, 输出的结果为:
a == b ? false
Java中有常量池的概念。编译器编译时对代码做一定的优化。比如,在编译期能够确定的字符串,
如果不同的字符串对象拥有相同的字面量,则会将这样的字符串对象指向同一个个字符串对址。
这就是为会么在第一段代码中输出结果为true.
对于编译期不能确定的字符串常量,如第二段代码中的b, 编译器无法优化。所以,即使用户输入的
的与变量a相同字面量的"a",输出结果也是false,即a!=b, 但a.equals(b).
其实,常量池不光字符串有。有以下代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 1;
Integer b = 1;
System.out.println("a == b ? " + (a == b));
}
}
输出结果为:
a == b ? true
如果换成以下:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
Integer e = -128;
Integer f = -128;
Integer g = -129;
Integer h = -129;
System.out.println("a == b ? " + (a == b));
System.out.println("c == d ? " + (c == d));
System.out.println("e == f ? " + (e == f));
System.out.println("g == h ? " + (g == h));
}
}
输出结果为:
a == b ? true
c == d ? false
e == f ? true
g == h ? false
再看以下代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 127;
Integer b = in.nextInt();
System.out.println("a == b ? " + (a == b));
}
}
输入127, 输出结果为:a == b ? true
首先,运行a == b 时,并没有发生unbox,确实是两个对象在比较。
由程序可以看出,Integer也有池,大小为[-128, 128).
但是对于new 出来的对象,不管表示的值相不相等,用==来判断都是不相等的,如
Integer a = new Integer(1);
Integer b = new Integer(1);
些时的a == b 为false;
public class EqualsTest {
public static void main(String[] args) {
String a = "a";
String b = "a";
System.out.println("a == b ? " + (a == b));
}
}
输出结果为:
a == b ? true
对于下面这段代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String a = "a";
String b = in.nextLine();
System.out.println("a == b ? " + (a == b));
}
}
运行时输入a后回车, 输出的结果为:
a == b ? false
Java中有常量池的概念。编译器编译时对代码做一定的优化。比如,在编译期能够确定的字符串,
如果不同的字符串对象拥有相同的字面量,则会将这样的字符串对象指向同一个个字符串对址。
这就是为会么在第一段代码中输出结果为true.
对于编译期不能确定的字符串常量,如第二段代码中的b, 编译器无法优化。所以,即使用户输入的
的与变量a相同字面量的"a",输出结果也是false,即a!=b, 但a.equals(b).
其实,常量池不光字符串有。有以下代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 1;
Integer b = 1;
System.out.println("a == b ? " + (a == b));
}
}
输出结果为:
a == b ? true
如果换成以下:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
Integer e = -128;
Integer f = -128;
Integer g = -129;
Integer h = -129;
System.out.println("a == b ? " + (a == b));
System.out.println("c == d ? " + (c == d));
System.out.println("e == f ? " + (e == f));
System.out.println("g == h ? " + (g == h));
}
}
输出结果为:
a == b ? true
c == d ? false
e == f ? true
g == h ? false
再看以下代码:
public class EqualsTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Integer a = 127;
Integer b = in.nextInt();
System.out.println("a == b ? " + (a == b));
}
}
输入127, 输出结果为:a == b ? true
首先,运行a == b 时,并没有发生unbox,确实是两个对象在比较。
由程序可以看出,Integer也有池,大小为[-128, 128).
但是对于new 出来的对象,不管表示的值相不相等,用==来判断都是不相等的,如
Integer a = new Integer(1);
Integer b = new Integer(1);
些时的a == b 为false;