A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孔斌 中级黑马   /  2013-1-28 10:22  /  1318 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test1 {

  2.         /**
  3.          * 有关内存分配的问题
  4.          */
  5.         public static void main(String args[]){
  6.                 float f =4.2F;
  7.                 Float g = new Float(4.2F);
  8.                 Double d = new Double(4.2);
  9.                 System.out.println(f==g);//true  这个是为什么
  10.                 System.out.println( (g.equals(4.2)));
  11.                 System.out.println(g.equals(f));
  12.                 System.out.println(d.equals(f));
  13.         }

  14. }
复制代码
我们知道 对象的初始化是分配到推内存,而简单数据类型是在栈内分配,为什么会相等呢?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

7 个回复

倒序浏览
equals() 用于引用数据类型(除了基本数据类型8个,都是引用数据类型,包括封装类,Object子类等),  比较是否指向相同的对象,
回复 使用道具 举报
float f =4.2F;
基本类型,指向了4.2F常量池中的堆内存地址
Float g = new Float(4.2F);
原始类型,为4.2F常量在内存创建了一个原始类型Float,JVM在规定范围,自动拆装功能。能把它们指向同一空间。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
实际上自动装箱就是系统自动帮我们去 new 了 Integer 对象。每个对象都会有一个 hashCode() 方法,
这个方法是继承 Object 而来,Object 类是所有类的超类。当需要比较两个对象是否相等时,可以用 " == " 和 equals 来做比较。

于对象而言, " == " 比较的是哈希码的值,也就是比较 hashCode() 方法的返回值,这个值是唯一的,在底层它是用来确定对象在堆内存上的存储位置。

" == " 也可以用来做基本数据类型的比较。而equals 方法是用来比较两个对象的内容是否一样。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
这个题我一开始看也不明白。后来想了一下,明白了。
8种基本类型在JDK5之后有了自动装箱特性。

float f =4.2F;    --->基本类型
Float g = new Float(4.2F);   --->引用类型

System.out.println(f==g);//true  这个是为什么
这里是比较内存地址。由于f是基本类型,会自动装箱成引用类型。在自动装箱时,它会去查找有没有 一个包装了数据为4.2F的Float对象。如果有就是用它,没有就创建一个。所以f自动装箱所引用的对象和g所所引用的对象是同一个,==比较就为true了


评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
Float g = new Float(4.2F);    从JDK1.5之后有自动拆箱功能,把g 自动转为了基本数据类型,当两个都是基本数据类型时而且数值一样,结果就为true

回复 使用道具 举报
杨杨 中级黑马 2013-1-30 11:14:35
7#
自动拆箱
回复 使用道具 举报
杨杨 中级黑马 2013-1-30 11:15:47
8#
你跟string有点混吧 string类不是基本类型
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马