==与equals的区别:
== :对比的是栈中的值,基本数据类型是变量值,引用数据类型是堆中内存对象的地址。
equals:Object中默认也是采用 ==比较,但通常会重写,重写后的equals方法,根据具体的重写情况决定比较属性的值、地址等。
一、Integer
package kaoshiceshi02;
public class Demo03 {
public static void main(String[] args) {
Integer i=1,j=1;
//==对于基本数据类型比较的是值,对于引用数据类型比较的是地址。
//Integer属于引用数据类型,==比较的是地址。
//此时对于值介于-128~127中的两个Integer数(注:Integer比较地址时才会用到这个范围, 比较值时用不到这个范围。),如果它们值相同,那么它们的内存地址是相同的,==的输出结果为true。
//1介于-128~127之间,==输出true。
//equals()默认比较的是地址,但Integer中jdk已定义好重写的equals()方法,
在Integer里面equals比较的是值(内容),所以只要值(内容)一样就会输出true。
System.out.println(i==j);//true System.out.println(i.equals(j));//true
//200超出了-128~127这个范围,==输出false。
//equals比较的是内容,依然为true。
Integer m=200,n=200; System.out.println(m==n);//false System.out.println(m.equals(n));//true
二、字符串
String str1="Hello";
String str2="Hello";
String str3=new String("Hello");
//==对于基本数据类型比较的是值,对于引用数据类型比较的是地址。
//String是引用数据类型,==比较的是地址。且在str1创建后,常量池中便有了"Hello"
//所以在定义str2时,因常量池中已有"Hello",所以此时直接从常量池中取出,
//所以str1与str2两者地址相同,==比较结果为true。
System.out.println(str1==str2);//true
//equals()默认比较的是地址,但String中jdk已定义好重写的equals()方法,
//在String里面比较的是值(内容),所以只要值(内容)一样就会输出true。
//"Hello"与"Hello"内容相同,所以输出true。
System.out.println(str1.equals(str2));//true
//==对于基本数据类型比较的是值,对于引用数据类型比较的是地址
//String是引用数据类型,比较的是地址。
//因new String,一定会在栈中开辟一个新的内存空间,
//所以str3与str1内存地址不同,而str1与str2内存地址相同,故str3与str2内存地址也不同。
//==比较结果为false。
System.out.println(str1==str3);//false System.out.println(str2==str3);//false
//equals()默认比较的是地址,但String中jdk已定义好重写的equals()方法,
//在String里面比较的是值(内容),所以只要值(内容)一样就会输出true。
//"Hello"与"Hello"内容相同,所以输出true。
System.out.println(str1.equals(str3));//true System.out.println(str2.equals(str3));//true
三、自动拆箱
Integer a=200; int b=200; //==对于基本数据类型比较的是值,对于引用数据类型比较的是地址。 //这里会自动拆箱后,然后==再按值进行比较。 System.out.println(a==b);//true } }



