== 和 equals
2018-09-20 本文已影响0人
机器不能学习
这个问题缠绕了很久。
什么时候用==?
基本数据类型时使用==,byte - long -int -short -char double -boolean时候使用
原理是比较他们的值
复合类型变量呢?
复合型变量比如封装过的String,interger
他们使用==是比较其内存地址,对于object对象来说,它的equals是比较的地址,但是String改写了这个方法,改写后的方法是比较值的
那么数据都是存在哪里呢?
这里的引用类型包括类复合变量,以及对象数组等等....
在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。
(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中
(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。
同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量
(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的
(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中
上面说的基本数据类型的值也在堆中,这个不准确
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。
所以当小于127时,int用==是相同的,因为它都指向常量池唯一地址