幽兰生空谷
--绝世独自开

Java面试题分享- int、Integer 和 == 、equals的区别

int、Integer 和 == 、equals

代码先行:

package com.itheibai.test;
public class MyJavaTest {
    public static void main(String[] args) {
        System.out.println("Hello itheibai!");
        Integer a1 = 100;
        Integer a2 = 100;
        Integer a3 = 200;
        Integer a4 = 200;
        Integer n5 = new Integer(100);
        Integer n6 = new Integer(100);
        Integer n7 = new Integer(200);
        Integer n8 = new Integer(200);
        int b1 = 100;
        int b3 = 200;

        System.out.println("(非new生成的Integer 100.equals(100) ? )equals : " + a1.equals(a2));
        System.out.println("(非new生成的Integer 200.equals(200) ? )equals : " + a3.equals(a4));
        System.out.println("(new生成的Integer 100.equals(100) ? )equals : " + n5.equals(n6));
        System.out.println("(new生成的Integer 100.equals(100) ? )equals : " + n7.equals(n8));

        //非new生成的两个Integer变量,做 == 比较时,如果两个变量的值在区间 -128到127之间,结果为 true,否则为 false
        //当在IDEA中开启代码检测的时候,会提示你将 == 替换为 equals
        System.out.println("(非new生成的Integer 100 == 100 ? )== : " + (a1 == a2));
        System.out.println("(非new生成的Integer 200 == 200 ? )== : " + (a3 == a4));
        //new生成的 Integer 做 == 比较,比较的是两个对象的地址
        System.out.println("(new生成的Integer 100 == 100 ? )== : " + (n5 == n6));
        System.out.println("(new生成的Integer 200 == 200 ? )== : " + (n7 == n8));
        //Integer 变量与 int 变量做 == 比较,Integer 变量类型会自动拆箱为 int 类型
        System.out.println("(非new生成的Integer & int 100 == 100 ? )== : " + (a1 == b1));
        System.out.println("(非new生成的Integer & int 200 == 200 ? )== : " + (a3 == b3));
        System.out.println("(new生成的Integer & int 100 == 100 ? )== : " + (n5 == b1));
        System.out.println("(new生成的Integer & int 200 == 200 ? )== : " + (n7 == b3));
        /**
         *  总结:
         *  1. new的对象存放在 堆内存 中,不同的对象,堆内存 的地址不同;
         *  2. 普通变量存放在 常量池 中(如 int a,int b 存放在常量池中);
         *  3. == 比较 非new 生成的基本类型变量,比较的是值是否相等;
         *  4. == 比较 new 生成的对象,比较的是引用地址是否相等;
         *  5. equals 比较 非new 生成的基本类型变量,等同于 == 作比较;
         *  6. equals 比较 new 生成的对象,比较的是 对象的内容 是否相同;
         *  7. java在编译 Integer a1 = 100;时,会翻译成 Integer a1 = Integer.valueOf(100);
         *     valueOf方法在Java api 中会对 -128到127 之间的数进行缓存,
         *     如Integer a1 = 127时,会将127进行缓存,下次再写 Integer a1 = 127 时,就会直接从缓存中取,就不会 new 了。
         *  8. Integer的默认值是 null, int 的默认值是 0;
         *  9. Integer 是 int 的包装类,int 则是Java的一种基本类型
         *  10. Integer 变量必须实例化后才能使用,而int变量不需要
         *  11. Integer 实际是对象的引用,当 new 一个 Integer 时,实际是生成一个指针指向此对象;
         *      而int则是直接存储数据值。
         */
    }
}

执行结果:

总结第 7 条的原因,跟进Integer的源码查看方法

/**
返回表示指定int值的Integer实例。 如果不需要新的Integer实例,则通常应优先使用此方法而不是构造函数Integer(int) ,因为此方法通过缓存频繁请求的值可能会产生明显更好的空间和时间性能。 此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。
形参:i – 一个int数值。
返回值:表示i的Integer实例。
自:1.5
*/
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

一点拙见~

赞(2) 打赏
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Java面试题分享- int、Integer 和 == 、equals的区别》
文章链接:https://www.itheibai.com/archives/715
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。

评论 抢沙发

评论前必须登录!

 

养成“打赏”的好习惯,从我做起!

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册