== 和 equals 的区别是什么
关于 ==
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
对于基本类型和引用类型 == 的作用效果是不同的:
- 基本类型:比如 byte, short, char, int, long, float, double, boolean, 他们比较的是他们的值;
- 引用类型:比较的是他们在内存中的存放地址,更准确的说,是堆内存地址
如果是具体的阿拉伯数字的比较,值相等则为true,如:
int a=10 与 long b=10L 与 double c=10.0
都是相同的(为true),因为他们都指向地址为10的堆。
关于 equals
equals一般意义上是比较的是两个对象的内容是否相等,如String类中equals。但是由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行重写的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断
String s="abcd"
是一种非常特殊的形式和new
有本质的区别。
它是java中唯一不需要new 就可以产生对象的途径。以String s="abcd";
形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"
的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String s1 = "abcd"
;又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
而String s = new String("abcd");
和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
补充:任何非空的引用值X,x.equals(null)的返回值一定为false 。
来看个例子:
public class test1 {
public static void main(String[] args) {
String a = new String("abcd"); // a 为一个引用
String b = new String("abcd"); // b为另一个引用,对象的内容一样
String aa = "abcd"; // 放在常量池中
String bb = "abcd"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
}
}