首先要简单说明一下基本类型和引用类型在JVM中的存放(详细jvm网上有很多)
基本类型:存放在jvm栈内存中
引用类型:在类加载或者实例化(new对象是)时会在堆内存中分配空间,引用地址存放在栈内存
回归正题
"=="操作符的作用
1、用于基本数据类型的比较
2、判断引用是否指向堆内存的同一块地址。
"equals"操作符的作用1、在引用对象未重写equals方法和hashcode方法前,比较是否是同一对象(即内存地址是否相同)
2.在对象重写equals方法和hashcode方法后,比较的是两个对象的内容是否一样。
直接看例子
public class Main {
public static void main(String[] args) {
//String作为对象使用时
String s1 = new String("111");
String s2 = new String("111");
//String作为基本类型使用时
String s3 = "111";
String s4 = "11"+"1";
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //true
System.out.println(s1==s3); //false
System.out.println(s1==s2); //false
//当String类型作为基本类型使用时
//如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。
//如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
System.out.println(s3==s4); //true
System.out.println(s3.equals(s4)); //true
//包装类
Integer i1 = 123;
Integer i4 = 123;
Integer i2 = new Integer(123);
Integer i3 = new Integer(123);
System.out.println(i1==i2); //false
System.out.println(i1.equals(i2)); //true
System.out.println(i2.equals(i3)); //true
System.out.println(i2==i3); //false
System.out.println(i1==i4); //true
int int1 = 111;
int int2 = 111;
System.out.println(s3.equals(int1)); //false
}