原文地址:https://blog.csdn.net/chenliguan/article/details/53888018

1 int与Integer的基本使用对比

(1)Integer是int的包装类;int是基本数据类型; 
(2)Integer变量必须实例化后才能使用;int变量不需要; 
(3)Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; 
(4)Integer的默认值是null;int的默认值是0。

2 int与Integer的深入对比

(1)由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

  1. Integer i = new Integer(100);
  2. Integer j = new Integer(100);
  3. System.out.print(i == j); //false

(2)Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

  1. Integer i = new Integer(100);
  2. int j = 100
  3. System.out.print(i == j); //true

(3)非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

  1. Integer i = new Integer(100);
  2. Integer j = 100;
  3. System.out.print(i == j); //false

(4)对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

  1. Integer i = 100;
  2. Integer j = 100;
  3. System.out.print(i == j); //true
  4.  
  5. Integer i = 128;
  6. Integer j = 128;
  7. System.out.print(i == j); //false

  对于第4条的原因: java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

  1. public static Integer valueOf(int i){
  2. assert IntegerCache.high >= 127;
  3. if (i >= IntegerCache.low && i <= IntegerCache.high){
  4. return IntegerCache.cache[i + (-IntegerCache.low)];
  5. }
  6. return new Integer(i);
  7. }

3 Java两种数据类型

3.1 Java两种数据类型分类

(1)基本数据类型,分为boolean、byte、int、char、long、short、double、float; 
(2)引用数据类型 ,分为数组、类、接口。

3.2 Java为每个原始类型提供了封装类

  为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每 一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

  1. 基本数据类型: booleancharbyteshortintlongfloatdouble
  2. 封装类类型:BooleanCharacterByteShortIntegerLongFloatDouble

4 基本解析

4.1 自动装箱:将基本数据类型重新转化为对象

  1. public class Test {
  2. public static void main(String[] args) {
  3. //声明一个Integer对象
  4. Integer num = 9;
  5.  
  6. //以上的声明就是用到了自动的装箱:解析为:Integer num = new Integer(9);
  7. }
  8. }

  9是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明。自动将基本数据类型转化为对应的封装类型,成为一个对象以后就可以调用对象所声明的所有的方法。

4.2 自动拆箱:将对象重新转化为基本数据类型

  1. public class Test {
  2. public static void main(String[] args) {
  3. //声明一个Integer对象
  4. Integer num = 9;
  5.  
  6. //进行计算时隐含的有自动拆箱
  7. System.out.print(num--);
  8. }
  9. }

  因为对象时不能直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除。对比:

  1. /装箱
  2. Integer num = 10;
  3. //拆箱
  4. int num1 = num;

5 深入解析

5.1 情况描述

  1. public class Test {
  2. public static void main(String[] args) {
  3. //在-128~127 之外的数
  4. Integer num1 = 128; Integer num2 = 128;
  5. System.out.println(num1==num2); //false
  6.  
  7. // 在-128~127 之内的数
  8. Integer num3 = 9; Integer num4 = 9;
  9. System.out.println(num3==num4); //true
  10. }
  11. }

  解析原因:归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)。 
  加大对简单数字的重利用,Java定义在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。 
而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象。

5.2 Integer源码解析

  给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf,源码如下:

  1. public static Integer valueOf(String s, int radix) throws NumberFormatException {
  2. return Integer.valueOf(parseInt(s,radix));
  3. }
  1. public static Integer valueOf(int i) {
  2. assert IntegerCache.high >= 127;
  3. if (i >= IntegerCache.low && i <= IntegerCache.high)
  4. return IntegerCache.cache[i + (-IntegerCache.low)];
  5. return new Integer(i);
  6. }

  IntegerCache是Integer的内部类,源码如下:

  1. /**
  2. * 缓存支持自动装箱的对象标识语义
  3. * -128和127(含)。
  4. *
  5. * 缓存在第一次使用时初始化。 缓存的大小
  6. * 可以由-XX:AutoBoxCacheMax = <size>选项控制。
  7. * 在VM初始化期间,java.lang.Integer.IntegerCache.high属性
  8. * 可以设置并保存在私有系统属性中
  9. */
  10. private static class IntegerCache {
  11. static final int low = -128;
  12. static final int high;
  13. static final Integer cache[];
  14.  
  15. static {
  16. // high value may be configured by property
  17. int h = 127;
  18. String integerCacheHighPropValue =
  19. sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
  20. if (integerCacheHighPropValue != null) {
  21. int i = parseInt(integerCacheHighPropValue);
  22. i = Math.max(i, 127);
  23. // Maximum array size is Integer.MAX_VALUE
  24. h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
  25. }
  26. high = h;
  27.  
  28. cache = new Integer[(high - low) + 1];
  29. int j = low;
  30. for(int k = 0; k < cache.length; k++)
  31. cache[k] = new Integer(j++);
  32. }
  33.  
  34. private IntegerCache() {}
  35. }

int 和 Integer 有什么区别的更多相关文章

  1. Hashtable,HashMap,TreeMap有什么区别?Vector,ArrayList,LinkedList有什么区别?int和Integer有什么区别?

    接着上篇继续更新. /*请尊重作者劳动成果,转载请标明原文链接:*/ /*https://www.cnblogs.com/jpcflyer/p/10759447.html* / 题目一:Hashtab ...

  2. 在java语言中int 和 Integer 有什么区别

    在java语言中int 和 Integer 有什么区别 解答:int是基本数据类型,Integer是int的包装类,属于引用类型

  3. int和Integer之间的区别和联系

          在工作中使用==埋下的坑这篇博文中,我们看到当使用基本类型的时候==是完全没有问题的,部分或者混合使用基本类型和装箱基本类型的时候,就可能出现问题了,那么我们可能会想基本类型和装箱基本类型 ...

  4. java int 与 Integer之间的区别

    int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...

  5. 一、基础篇--1.1Java基础-int 和 Integer 有什么区别,Integer的值缓存范围

    int和Integer的区别 int是基本数据类型,Integer是int的包装类. Integer必须实例化后才能使用,int变量不需要. Integer实际是对象的引用,生成一个新对象实际上是生成 ...

  6. Java int和Integer包装类的区别和比较

    区别:                                                                                                  ...

  7. PHP 中 int 和 integer 类型的区别

    半夜整理东西,发现一个以前没留意到的小问题. function show($id) : int { return $id; } function show($id) : integer { retur ...

  8. java面试题(杨晓峰)---第七讲谈谈int和integer有什么区别?

    理解装箱和拆箱的过程. 对象由三部分组成:对象头,对象实例,对齐填充. 对象头:一般是十六个字节,分两部分,第一部分:哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等,第二部分是类型指针 ...

  9. Java int和integer有什么区别 (mybatis踩坑)

    不要在实体类中使用int 我们都知道Integer是int的包装类,而int是基本数据类型.所以Integer类型的变量会初始化为null,int类型则会被初始化为0 . 所以在下面的动态拼接例子中: ...

随机推荐

  1. ElasticSearch高可用集群环境搭建和分片原理

    1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...

  2. BZOJ4455/UOJ185 [Zjoi2016]小星星

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. java中HashMap、HashTable、TreeMap的区别总结【表格对比清楚明了】

      底层 有序否 键值对能否为Null 遍历 线程安全 哈希Code Hashmap 数组+链表 无序 都可null iterator 不安全 内部hash方法 Hashtable 数组+链表 无序 ...

  4. js进阶---12-10、jquery绑定事件和解绑事件是什么

    js进阶---12-10.jquery绑定事件和解绑事件是什么 一.总结 一句话总结:on和off. 1.jquery如何给元素绑定事件? on方法 22 $('#btn1').on('click', ...

  5. Linux文件夹权限详解

    - 第一个字符代表文件(-).目录(d),链接(l) - 其余字符每3个一组(rwx),读(r).写(w).执行(x) - 第一组rwx:文件所有者的权限是读.写和执行 - 第二组rw-:与文件所有者 ...

  6. APP耗电量专项测试整理

    Android: (使用batterystats) 方法: 手机自带的电量监控.GT 命令(5.0以上系统才可以): 1.下载historian.py脚本,下载地址:https://github.co ...

  7. BCCoventUtils全角与半角互相转换

    public class BCConvert { /** * ASCII表中可见字符从!开始,偏移位值为33(Decimal) */ static final char DBC_CHAR_START ...

  8. Node.js小白开路(一)-- 全局变量篇

    全局内容是有点类似于我们在浏览器编程的时候的window对象的,当时在node之中虽然我们编写的变量会自动的给出上下文环境(模块),但是全局变量的存在还是大大的帮助了我们编程时候的便捷性.我们可以在任 ...

  9. react login page demo

    1. login form import React from "react"; import {Row, Col} from "antd"; import { ...

  10. webpack 使用中的问题

    用gulp-watch代替watch webpack打包体积分析器 集合