在此之前,我们先了解一下Java的包装类和自动拆箱/装箱

什么是包装类

虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。 沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。这种借助于非面向对象技术的做法有时也会带来不便。比如:

  1. 编码过程中只接收对象的情况,比如List中只能存入对象,不能存入基本数据类型;比如一个方法的参数是Object时,不能传入基本数据类型,但可以传入对应的包装类; 比如泛型等等。
  2. 基本数据类型没有toString()方法等

Java中对每种基本类型都有一个对应的包装类:

  • byte -> Byte
  • short -> Short
  • int -> Integer
  • long -> Long
  • float -> Float
  • double -> Double
  • boolean -> Boolean
  • char -> Character

其中需要注意int对应的是Integer,char对应的Character,其他6个都是基本类型首字母大写即可。

每个包装类的对象可以封装一个相应的基本类型的数据,并提供了其它一些有用的方法。包装类对象一经创建,其内容(所封装的基本类型数据值)不可改变(类似于String类,可看源码)。

基本数据类型和包装类的区别

拆箱/装箱

基本数据类型和对应包装类转换称为装箱:

Integer i = Integer.valueOf(1);  //手动装箱

Integer j = 1;  //自动装箱

Integer i0 = new Integer(1);

int i1 = i0;     //自动拆箱

int i2 = i0.intValue();    //手动拆箱

jdk5.0开始增加自动装箱/拆箱

  • int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型

2、Integer变量必须实例化后才能使用,而int变量不需要

3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值

4、Integer的默认值是null,int的默认值是0

  • 关于Integer和int的比较

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

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

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

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

3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是Java常量池中的对象)

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

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

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true

Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

Java在编译Integer i=100; 时,会翻译成为Integer i = Integer.valueOf(100); 而java api中对Integer类型的valueOf的定义如下

Integer包装类 默认创建了数值[-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

Integer  j = 300; 自动包装时的class字节码:

发现什么了? 自动包装时实际上还是调用的valueOf方法。而上面我们讲过的,valueOf方法用到了缓存池

Integer和int详解相关推荐

  1. java integer == int_Java中int和Integer的区别详解

    1.Java 中的数据类型分为基本数据类型和复杂数据类型 int是前者>>integer 是后者(也就是一个类) 2.初始化时>> int i =1; Integer i= n ...

  2. java int 详解,int与Integer详解(java基础篇)

    前言 在回顾==与equals的区别于联系时,我们很清楚的了解到: ==:可以用于基本数据类型的比较,也可以用于对象进行比.,对于基本数据类型,比较的是值:对于引用数据类型,比较的是内存地址 equa ...

  3. Integer源码详解

    尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159 对于Integer这个类估计大家也都非常熟悉了,以前看过他的源码,但也只是粗略的看了一下,最近有时间 ...

  4. Integer缓存IntegerCache详解

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 引子 今天,我们从一段非常简单的代码说起. 示例代码 package cn.com; /** ...

  5. pythonbyte转int_Python将byte数组转换为int详解

    代码 import struct import ctypes def test_struct(buf, offset): return struct.unpack_from("I" ...

  6. Integer类超详解

    目录(点击传送

  7. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...

  8. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  9. python int函数详解_Python内置函数OCT详解

    英文文档:oct ( x ) Convert an integer number to an octal string. The result is a valid Python expression ...

最新文章

  1. 国内首个零信任技术标准发布 腾讯安全牵头编制
  2. Windows 10下安装Anaconda(Anaconda3-5.1.0)
  3. idea怎么调成黑色页面
  4. 页面刷新 vuex 数据重新被初始化
  5. python的cubes怎么使用_如何使用python中的opengl?
  6. 动态规划——编辑距离
  7. 【资料】翘首期盼247天!《阿里巴巴Java开发手册》扫描插件详情介绍
  8. .c和.h文件的区别(转载)
  9. vi删除选中内容_如何优雅的删除代码-VIM
  10. ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
  11. 反射生成SQL语句入门
  12. Atitit 知识图谱 知识抽取 信息抽取的总结艾提拉总结 目录 1. 知识抽取 1 2. 数据源主要来自两种渠道( 2 2.1. 内部结构化数据vs 外部网页数据 2 3. 2. 知识图谱的数据来
  13. Ubuntu 字体安装以及 vscode字体配置
  14. Linux下如何使用搜狗词库
  15. 盘点2014年邮件行业大事件
  16. vuex存储什么数据_Redis除了存储数据以外还能做什么?
  17. BigWorld Pty. Ltd.是一家全球领先的大型多人在线游戏(MMOG)开发解决方案供应商...
  18. 安卓4.4pppoe拨号间隔及轮次修改
  19. 工图怎么进行三维标注
  20. 换地方上网后Kali Linux 网络设置

热门文章

  1. 【扩展】Freemarker模板遍历集合实现下载word部分文字隐藏
  2. 数据结构——关键路径AOV(图)
  3. [转] http、https 等 常用默认端口号
  4. 缓存的CachePut 冲突 Cacheable
  5. iOS-Core-Animation-Advanced-Techniques(一)
  6. 比bitblt和stretchblt效率更高的函数
  7. 《JSP程序设计》报告
  8. vector 通俗易懂描述
  9. 【Qt入门第23篇】 数据库(三)利用QSqlQuery类执行SQL语句
  10. 网络工程师成长日记138-前途迷茫和年龄无关