java中==的含义
==的基本解释
==是二元运算符,其最终的结果返回的是基本数据类型中的boolean型。它是比较基本数据类型和引用数据类型,它的作用是比较两个变量是否相等,但对相等的定义我们应该达成一致。
情况一,基本数据类型之间比较
byte,short,char,int,long,float,double,boolean 他们之间的比较,比较的是他们的值。在比较它们值时,可能存在变量类型不同,在两个基本数据类型变量一致时,比较的是值。在比较两个基本数据类型不同是,会进行自动类型转换,小类型会转换成大类型,此时比较的也是值,当无法进行自动类型转换,便会报语法错误。
从本质来讲,基本数据类型比较的是内存地址,因为有jvm的常量池,所以我们赋值的是常量的内存地址。我们仅仅可以假想它们比较的是"值",但实质上是因为它们指向了同样的内存地址
情况二,引用数据类型之间比较
引用数据类型是指对象、数组、字符串等之间的比较,比较的是它们的内存地址。
字符串比较
String s1 = "abs";
String s2 = "abs"; //
String s3 = new String("abs");
System.out.println(s1 == s2);//s1与s2 内存地址相同
System.out.println(s2 == s3);//s2与s3 内存地址不相同
在编译时s1和s2的字符串"abs"会被放入jvm的常量池中。所以s1和s2在赋值的时候都是一样指向常量池中"abs"的内存地址。而s3不同,s3新new String对象,其字符串内容被放在heap中,s3在stack中指向heap地址。因此s2和s3内存地址不同。
情况三、基本数据类型与包装器类型的比较
包装器类型是指基本数据类型对应的类(int、Integer)。在比较时,会进行自动拆箱、装箱的操作。
自动拆箱、装箱
//自动装箱
Integer a = 127; //实际上是 Integer.valueOf(127)
//自动拆箱
int b = a;//实际上是 a.intValue()
装箱就是包装成对象