内存级分析,基本数据类型,引用数据类型 比较是否相等

来源:互联网 发布:如何看端口是否打开 编辑:程序博客网 时间:2024/05/17 00:55

基本数据类型,引用数据类型 比较是否相等

 

int a = 50;  int b=  50;    Double c = 200.0;  Double d = 200.0;    Integer e = 10;  Integer f = 10;    Integer g = 200;  Integer h = 200;  int y = 200;    String i = "abc";  String j = "a"+ "bc";    String k = new String ("abc");    String l =  "a";  String m = "bc";  String n = l+m;    System.out.println("a=b? 答案是 "+(a==b));  System.out.println("c=d? 答案是 "+(c==d));  System.out.println("e=f? 答案是 "+(e==f));  System.out.println("g=h? 答案是 "+(g==h));  System.out.println("g=y? 答案是 "+(g==y));  System.out.println("i=j? 答案是 "+(i==j));  System.out.println("i=k? 答案是 "+(i==k));  System.out.println("i=n? 答案是 "+(i==n));


 

代码亲测,结果如下:

a=b? 答案是 truec=d? 答案是 falsee=f? 答案是 trueg=h? 答案是 falseg=y? 答案是 truei=j? 答案是 truei=k? 答案是 false


 

i=n? 答案是 false


 

见解——1.基本数据类型见的比较:

   1、 基本数据类型举例 int  如上:  内存给 a 的10在内存栈中分配一个内存空间, 再给 b 的 10 在内存栈中分配一个内存空间。比较时拿出a.b 的地址寻找到数值,直接比较数值大小。

   2、Double 数据类型(注意大写),在内存堆中,分别分配内存空间存储200,在内存栈中分别存储地址指针。非基本数据类型,比较时比较内存地址,故为false。

   3、Integer 数据类型, 再分配内存地址前执行一个算法(暂时这么理解),-128—127 之间的数值直接存在常量池中,e 在堆内存开辟一个新的内存空间, 调用常量池中存放的10 的内存地址,将 10 存放在新开辟的内存空间中, f  发现常量池中已经有了 10,且 已经被 e 引用过了,直接指向 e ,故 e 和 f 内存地址相同,故比较结果为:true。

   4、 Integer 数据类型, 再分配内存地址前执行一个算法(暂时这么理解),-128—127 之间的数值直接存在常量池中,超过了,直接在内存堆中 new 一个新的内存地址,存放数据。g =200, 直接在内存堆中分配新的地址,h =200 同理, 比较时比较内存地址,由于在内存堆中开辟新的内存空间,故内存栈中存的内存地址一定不同,非基本数据类型,比较时比较内存地址,故为false。

   5、h和y 的比较实际上是比较的数值大小,在比较时,对 Integer 进行 拆箱操作(Integer.valueOf()),取出 Integer 的数值然后进行比较。

   6、String 自动数据存放在常量池中,执行i ,j 比较时,i  = ”abc“,字符串”abc“加载到常量池中,j = "a"+"bc",java编译器直接执行操作,实际程序操作的是 j = "abc",常量池中

”abc “已经被 i  引用过, j  发现"abc"已经被 i 引用过了,就直接指向 i ,故 true。

   7、i  引用了 常量池中的 "abc",在内存堆中存放, String k = new String ("abc");执行 new 这一操作,在内存堆中另外开辟一个内存空间,来存放字符串“abc”,不会在常量池中比较是否被引用过。 故 i 的内存地址 和 k 的内存地址不同(两个不同的内存空间内存地址一定不同)。

    8、执行 l +m 操作,内存堆要事先分配一个内存空间,将执行操作后的结果进行存放,故 i 的内存地址 和 n的内存地址不同(两个不同的内存空间内存地址一定不同)。

 

3 0
原创粉丝点击