一般情况下考察:equals()和“==”都是是进行地址比较,基本数据类型可以用“==”直接进行数值(其实是地址)比较引用数据类型用equals()进行数值比较;
注意:equals()特殊在于他可以被覆盖,如果被覆盖,就按覆盖的来算(一般引用数据类型都覆盖了),例如String类里的就是覆盖之后的equals()只进行数值比较;而如果没有被覆盖依旧是按“==”来进行地址比较,因为默认情况自己没有定义equals()方法那就是继承于object类。
**在JVM底层有个对象池,当一些引用数据类型直接赋值时,会将这些值放入对象池,当下次再进行有相同的值进行赋值时,会直接给他,而不会再开辟空间,
package com.stx.test;
public class StringQ {
public static void main(String[] args) {
A a = new A();
A a2 = new A();
a.i = a2.i = 100;
System.out.println("自定类 equals"+a.equals(a2));//false
System.out.println("自定类 ==: "+(a==a2));
String str1 = new String("s");
String str2 = new String("s");
System.out.println("string equals: "+str1.equals(str2));//true
System.out.println("string ==: "+ (str1==str2));
String s1="w";
String s2="w";
System.out.println("string equals: "+s1.equals(s2));
System.out.println("string ==: "+(s1==s2));
Integer q = new Integer(1);
Integer w = new Integer(1);
System.out.println("Integer equals: "+q.equals(w));
System.out.println("Integer ==: "+(q==w));
Integer e = 1;
Integer r = 1;
System.out.println("Integer equals: "+q.equals(w));
System.out.println("Integer ==: "+(e==r));
/*
* 自定类 equalsfalse
自定类 ==: false
引用string equals: true
引用string ==: false
string equals: true
string ==: true
引用Integer equals: true
引用 Integer ==: false
Integer equals: true
Integer ==: true
*/
}
}
class A {int i;}