1. “ = = ” “==” “==”
对于Java中的 “ = = ” “==” “==”比较来说,如果被比较的是基本数据类型,则比较的是基本数据类型的值(注:等号两边的数据类型不一定要相同,只要是值相同,就能返回true,但对于某些不同数据类型的比较,编译器会直接报错)
public static void main(String[] args) {
int a=1;
int b=1;
char c=1;
byte d=1; //byte数据类型:代表一个字节(8位:-128~127)
boolean e=true;
System.out.println(a==b);//true
System.out.println(a==c);//true
System.out.println(a==d);//true
System.out.println(a==e);//报错
}
Java中的基本数据类型有:
1.逻辑类: boolean
2.文本类 :char
3.整数类 :byte, short, int, long
4.浮点类 :double, float。
也就是说,对于以上的数据类型, “ = = " “==" “=="采取的都是值比较,值相等就返回true,值不相等就返回false。
如果被比较的不是基本数据类型,而是引用类型的话,那 “ = = " “==" “=="所比较的就不是他们“内容”的值,而是两者内存地址的值,如果两者内存地址相同,则返回true,否则返回false
public static void main(String[] args) {
Object a=new Object();
Object b=new Object();
Object c= a;
System.out.println(a==b);//false
System.out.println(a==c);//true
}
Java中的引用类型有:
1.类:class
2.接口:Interface
3.数组:Array
记录一个String类中的巨坑:
public static void main(String[] args) {
String a="123";
String b="123";
String c=new String("123");
String d=new String("123");
System.out.println(a==b); //ture
System.out.println(a==c); //false
System.out.println(c==d); //false
}
为什么会出现明明字符串a、b、c、d的值都相等,但是 = = == ==符号比较出来的结果却是有的相等,而有的却不同呢。这就涉及到Java的一些底层原理了。我们知道,String对象的创建有两种方式,一种是String a=“123”;另一种是String c=new String(“123”);如果以第一种方式创建对象,则对象是创建在Java的常量池中的,具体的创建方式是Java虚拟机会现在常量池中找是否存在对象“123”,如果存在,则直接返回“123”的引用,如果不存在,则创建一个对象“123”,再返回它的引用,所以实际上,a与b是同一个对象“123”的引用;而如果以第二种方式创建对象,则对象是创建再堆中的,虚拟机会在堆中创建一个对象,然后再常量池中找对象“123”,如果没有就在常量池中创建一个,然后将常量池中的对象“123”拷贝到堆中新创建的对象里,再返回堆中对象的引用,所以c与d引用的对象在堆中,而且是不同的对象,显然c、d的对象地址是不同的而a、b的对象地址是相同的。
2.equals()
equals方法的原型在类Object中,而Object类是所有类的父类,如果我们翻看equals方法在Object类中的源码就会发现只有一行代码
并且我们可以看到Object类中的equal方法和 = = == ==是一样的,对于类来说依旧是地址比较,但是在很多其他类中都重写了equals方法,使其不再是地址比较,比如String类。
对于在String类中的equals(),如果地址相同则返回true,如果地址不同则会调用StringLatin1类中的equals()方法或者StringUTF16中的equals()方法。
我们再来看看StringLatin1类中的equals()方法是怎样的(StringUTF16类中的原理大同小异)
明显可以看到,StringLatin1类中的equals()方法对字符串进行了逐字符的比较,所以equals()方法在String类中进行重写后,不再是地址比较,而是值比较,所以我们在比较两个字符串是否相等时最好不要用 = = == ==,而是使用equals方法。
public class Main{
public static void main(String[] args) {
String a=new String("123");
String b=new String("123");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
}
}