Java:包装类小记
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
- int 是 Java 的八种基本数据类型之一,而 Integer 是 Java 为 int 类型提供的封装类;
- int 型变量的默认值是 0,Integer 变量的默认值是 null,这一点说明 Integer 可以区分出未赋值和值为 0 的区分;
- Integer 变量必须实例化后才可以使用,而 int 不需要。
关于 Integer 和 int 的比较的延伸:
由于 Integer 变量实际上是对一个 Integer 对象的引用,所以两个通过 new 生成的 Integer 变量永远是不相等的,因为其内存地址是不同的;
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.println(i==j); // false
Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true。因为包装类 Integer 和基本数据类型 int 类型进行比较时,Java 会自动拆包装类为 int,然后进行比较,实际上就是两个 int 型变量在进行比较;
Integer i = new Integer(100);
System.out.println(i==100); // true
非 new 生成的 Integer 变量和 new Integer() 生成的变量进行比较时,结果为 false。因为非 new 生成的 Integer 变量指向的是 Java 常量池中的对象(但是是有范围的,具体见下方),而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同;
Integer i = new Integer(100);
Integer j = 100;
System.out.println(i==j); // false
对于两个非 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:包装类小记的更多相关文章
- effective java读书小记(一)创建和销毁对象
序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...
- Java 包装类笔记
@(JDK)[包装类] Java 包装类笔记 当需要使用到集合的时候,如果是基础数据类型,需要转换为包装类,再使用,在JDK1.5之前,每次使用的时候,都需要手动转换为包装类(称为装箱),然后在使用的 ...
- Java包装类及其拆箱装箱
Java包装类,Wrapper~由于在java中,数据类型总共可分为两大种,基本数据类型(值类型)和类类型(引用数据类型).基本类型的数据不是对象,所以对于要将数据类型作为对象来使用的情况,java提 ...
- Java包装类的常量池
Integer a=Integer.valueOf(100); Integer b=Integer.valueOf(100); System.out.println(a==b); Double d1 ...
- JAVA包装类的缓存范围
JAVA包装类的缓存范围 前两天面试遇到两个关于JAVA源码的问题,记录下来提醒自己. 1.写出下面的输出结果 System.out.println(Integer.valueOf("100 ...
- java包装类和值类型的关系
java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long fl ...
- java包装类的缓存机制(转)
出处: java包装类的缓存机制 java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存.提高性能的功能,只有在自动装箱时有效 Integer包装类 举个栗子: Integer a = ...
- Java JPA小记
什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...
- java : 包装类 缓冲机制的使用(转载)
摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i).Byte valueOf(byte b).Short valueOf(short s).Long valueOf(l ...
随机推荐
- SQL语句之高级使用
1.select top select top 用于规定要返回的数据的数目 注意:并非所有的数据库系统都支持 SELECT TOP 语句. MySQL 支持 LIMIT 语句来选取指定的条数数据, ...
- 原子操作cas
一.概念, 基于处理器指令,把比较和交换合成一个指令完成,保证了原子性: 因为是针对一个内存地址值的,一个内存地址指向一个变量,所以只对一个共享变量能保证原子性: 二.原子操作类 锁只有synchro ...
- 案例九:shell脚本自动创建多个新用户,并设置密码
此脚本是用来批量创建用户并设置用户密码,在企业用非常实用. 脚本一 #!/bin/bash for name in $( seq 1 100 ) do useradd "user$name& ...
- K8s Master当作Node使用的方法
1.使用下面的命令操作使得master 可以作为node使用 承载pod kubectl taint nodes --all node-role.kubernetes.io/master- 可能会出现 ...
- 剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n ...
- 5ucms后台新增字段
1.修改admin\inc\class_content.asp文件,把需要的字段添加进去 2.修改\admin\admin_content.asp 文件,把需要的字段添加进后台操作模板 3.用sql语 ...
- 让selenium规避网站的检测
在使用selenium对某些网站模拟访问的时候会被检测出来,检测出来之后就有可能拿不到我们想要的数据,那么我们怎么可以规避掉呢? 在使用谷歌浏览器的时候我们右键-检查-console-输入window ...
- CF39C-Moon Craters【dp】
正题 题目链接:https://www.luogu.com.cn/problem/CF39C 题目大意 坐标轴上有\(n\)个圆,给出每个圆的位置\(c_i\)和半径\(r_i\). 要求选出最多的圆 ...
- FastAPI(39)- 使用 CORS 解决跨域问题
同源策略 https://www.cnblogs.com/poloyy/p/15345184.html CORS https://www.cnblogs.com/poloyy/p/15345871.h ...
- idea使用gitee的小坑
1. 账号配置 账号配置登陆时提示 *** is not a valid login name: Email support only. 翻译:只能支持邮箱登录 解决方法:在gitee网站上查看自己配 ...