Java:包装类

对 Java 中的 包装类 这个概念,做一个微不足道的小小小小记

基本数据&包装类

四类八种基本数据类型

数据类型 关键字 内存占用 取值范围
字节型 byte 1个字节 -128~127
短整型 short 2个字节 -32768~32767
整型 int(默认) 4个字节 -231~231 - 1
-2147483648~2147483647
长整型 long 8个字节 -263~263 - 1
单精度浮点数 float 4个字节 1.4013E-45~3.4028E+38
双精度浮点数 double(默认) 8个字节 4.9E-324~1.7977E+308
字符型 char 2个字节 0-65535
布尔类型 boolean 1个字节 true,false

对应的包装类型

基本类型 对应的包装类(位于java.lang包中)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

装箱和拆箱

自动装箱是 Java 编译器在基本数据类型和对应得包装类之间做的一个转化。比如:把 int 转化成 Integer,double 转化成 Double 等等。反之就是自动拆箱。

原始类型:boolean、char、byte、short、int、long、float、double

封装类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double

比较说明-1

Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
int i = 1; //
System.out.println(c==d); // 有缓存存在,结果为true
System.out.println(e==f); // 超出缓存了,地址比较,结果为false
System.out.println(c==(a+b)); // a+b进行了算数运算,触发自动拆箱,因此比较的是数值是否相等,结果为true
System.out.println(i==a); // 原始类型和封装类型进行比较时,封装类型会自动拆箱成基本类型后再进行比较,结果为true
System.out.println(c.equals(a+b)); // a+b算数运算,自动拆箱,使用equals时自动装箱为Integer类型的数据,故结果为true
System.out.println(g==(a+b)); // a+b算数运算,自动拆箱,因此比较的是数值是否相等,结果为true
System.out.println(g.equals(a+b)); // a+b算数运算,自动拆箱,使用equals时自动装箱为Integer类型的数据,g为Long类型的数据,类型不一致,因此结果为false
System.out.println(g.equals(a+h)); // 由于此时h为Long类型数据,因此装箱为Long类型数据,比较结果为true

比较说明-2

Integer x = 100;
Integer y = new Integer(100);
Integer z = new Integer(100); // 1.Integer ... 和 new Integer:
// new Integer 会创建对象,存储在堆中
// 而Integer在[-128,127]中,从缓存中取,否则会 new Integer
// 所以Integer和new Integer进行==比较的话,肯定为false;
// Integer和new Integer 进行equals比较的话,肯定为true
System.out.println(x==y); // false
System.out.println(x.equals(y)); // true
// 2.new Integer和new Integer进行==比较的时候,肯定为false,而进行equals比较的时候,肯定为true
// 原因是new的时候,会在堆中创建对象,分配的地址不同,==比较的是内存地址,所以肯定不同
System.out.println(y==z); // false
System.out.println(y.equals(z)); // true

Integer vs int

  1. int 是 Java 的八种基本数据类型之一,而 Integer 是 Java 为 int 类型提供的封装类;
  2. int 型变量的默认值是 0,Integer 变量的默认值是 null,这一点说明 Integer 可以区分出未赋值和值为 0 的区分;
  3. Integer 变量必须实例化后才可以使用,而 int 不需要。

关于 Integer 和 int 的比较的延伸:

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

    Integer i = new Integer(100);
    Integer j = new Integer(100);
    System.out.println(i==j); // false
  2. Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true。因为包装类 Integer 和基本数据类型 int 类型进行比较时,Java 会自动拆包装类为 int,然后进行比较,实际上就是两个 int 型变量在进行比较;

    Integer i = new Integer(100);
    System.out.println(i==100); // true
  3. 非 new 生成的 Integer 变量和 new Integer() 生成的变量进行比较时,结果为 false。因为非 new 生成的 Integer 变量指向的是 Java 常量池中的对象(但是是有范围的,具体见下方),而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同;

    Integer i = new Integer(100);
    Integer j = 100;
    System.out.println(i==j); // false
  4. 对于两个非 new 生成的 Integer 对象进行比较时,如果两个变量的值在区间 [-128, 127] 之间,则比较结果为 true,否则为 false。Java 在编译 Integer i = 100 时,会编译成 Integer i = Integer.valueOf(100),而 Integer 类型的 valueOf 的源码如下所示:

    Integer i = 127;
    Integer j = 127;
    System.out.println(i==j); // true Integer i = 128;
    Integer j = 128;
    System.out.println(i==j); // false // valueOf 的源码
    public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
    }

    从上面的代码中可以看出:Java 对于 [-128, 127] 之间的数会进行缓存,比如:Integer i = 127,会将 127 进行缓存,下次再写 Integer j = 127 的时候,就会直接从缓存中取出,而对于这个区间之外的数就需要 new 了。

针对上述第4点,引申出包装类的缓存

  • Boolean:全部缓存
  • Byte:全部缓存
  • Character:<= 127 缓存
  • Short:-128 ~ 127 缓存
  • Long:-128 ~ 127 缓存
  • Integer:-128 ~ 127 缓存
  • Float:没有缓存
  • Doulbe:没有缓存

参考

https://blog.csdn.net/qq_35571554/article/details/82876774

https://blog.csdn.net/aoxiangzhe/article/details/81297157

https://www.cnblogs.com/javatech/p/3650460.html

Java:包装类小记的更多相关文章

  1. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  2. Java 包装类笔记

    @(JDK)[包装类] Java 包装类笔记 当需要使用到集合的时候,如果是基础数据类型,需要转换为包装类,再使用,在JDK1.5之前,每次使用的时候,都需要手动转换为包装类(称为装箱),然后在使用的 ...

  3. Java包装类及其拆箱装箱

    Java包装类,Wrapper~由于在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型).基本类型的数据不是对象,所以对于要将数据类型作为对象来使用的情况,java提 ...

  4. Java包装类的常量池

     Integer a=Integer.valueOf(100); Integer b=Integer.valueOf(100); System.out.println(a==b); Double d1 ...

  5. JAVA包装类的缓存范围

    JAVA包装类的缓存范围 前两天面试遇到两个关于JAVA源码的问题,记录下来提醒自己. 1.写出下面的输出结果 System.out.println(Integer.valueOf("100 ...

  6. java包装类和值类型的关系

    java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long fl ...

  7. java包装类的缓存机制(转)

    出处: java包装类的缓存机制 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = ...

  8. Java JPA小记

    什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...

  9. java : 包装类 缓冲机制的使用(转载)

    摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i).Byte valueOf(byte b).Short valueOf(short s).Long valueOf(l ...

随机推荐

  1. MySQL——主从复制

    ---- 高可用 ---- 辅助备份 ---- 分担负载 复制是MySQL的一项功能,允许服务器将更改从一个实例复制到另一个实例. --主服务器将所有数据和结构更改记录到二进制日志中. --从属服务器 ...

  2. IPsec NAT-T说明和环境搭建

    1. IPsec与NAT的关系 NAT作为一个IPV4的地址转换协议,它最初的目的是用来最解决IPv4地址不足的问题.通过NAT协议,局域网内的多个主机可以共同使用一个公网地址,这在很大程度上减轻了I ...

  3. django报错外理收集

    网址指向同一地址后: Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message be ...

  4. 10.6Java学习

    1.类,对象,方法的定义.2.标识符分为两类:关键字/常见的基本类型:boolean(布尔型),byte(字节型),char(字符型),double(双精度),float(浮点),int(整型),lo ...

  5. 【Python学习】1.数据类型

    一.整数 可以使用十进制和十六进制来表示整数.比如:-1000和0x1e3f2d 二.浮点数 直接表示浮点数,比如:2.443或者1.2e5 1.2e-10等 整数和浮点数在计算机内部存储的方式是不同 ...

  6. UI自动化测试:App的Webview页面元素左滑

      一.前言 在做App自动化测试时,我们会遇到如上图所示的列表数据页面左滑删除场景,一般可以通过location.rect方法获取对应列表的元素坐标,然后使用TouchAction或者swipe滑动 ...

  7. Django学习day02随堂笔记

    每日测验 """ 今日考题 1.谈谈你对web框架的认识,简述web框架请求流程 2.python三大主流web框架的区别 3.安装django需要注意的事项有哪些(最少 ...

  8. CDI Features inJavaEE 的上下文和依赖注入

    基本的CDI的功能: 类型安全:CDI使用Java类型来解析注入,而不是通过(字符串)名称注入对象.当类型不足时, 可以使用限定符 注释.这允许编译器轻松检测错误,并提供简单的重构. POJO:几乎每 ...

  9. 基于swoole框架hyperf开发的纯API接口化的后台RBAC管理工具hyperfly@v1.0.0发布

    hyperfly@v1.0.0发布 本文地址http://yangjianyong.cn/?p=323转载无需经过作者本人授权 github地址:https://github.com/vankour/ ...

  10. http升级https遇到的问题

    1. 功能请求失效: 可能是链接为http请求,导致出现问题 2.浏览器网址左边出现黄色感叹号: 这是由于网页中存在http的图片链接,需要根据实际情况修改; 3.将网页内的http请求变为https ...