Java包装类,以及Integer与int之间的比较
一、Java的基本类型
Java语言中提供了八种基本类型,包括六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
- 整数型,包括byte、short、int、long,默认初始值是0;
- 浮点型,包括float、double,默认初始值是0.0;
- 字符型,char型,默认值是'',注意跟“”的区别,''是字符的引号,“”是字符串的引号,两者不同。
- 布尔型,boolean,默认初始值是false。
注意:如果不初始化一个char类型的变量,将它输出在console的时候你看不到任何结果。Java中,字符型并不是用ASCII码来存储的,而是用16位的Unicode字符集来存储,它的范围就是字符集的范围,默认值是u000000。
二、包装类
包装类把基本类型转换为对象,每个基本类型在java.lang包中都有一个相应的包装类,包括有:
| 基本类型 | 包装类型 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
此外,在java.math包中还有两个用于数字计算的类型,分别是BigInteger、BigDecimal。它们无对应的基本类型,主要应用于高精度的运算,其中BigInteger 支持任意精度的整数运算,BigDecimal支持任意精度带小数点的运算,可以用于避免使用基本类型时产生的精度损失等问题。
三、包装类的用法
这里只讨论六种数字基本类型对应的包装类,因为它们是使用最频繁的,这些类中常用的方法可分为两类:一种是本类型与其它基本类型之间的转换,另一种是字符串与本类型和基本类型之间的转换。如下图,是Integer类中的一些常用方法:

其中的前五个,都是属于第一种,即与其它基本类型之间的转换。下面的三个则属于第二种,是字符串与本类型及基本类型之间的转换。
A、本类型与其它类型转换
示例如下:
1 Integer temp1 = new Integer(45);
2 int temp2 = 45;
3
4 byte t1 = temp1.byteValue(); //包装类的转换
5 byte t2 = (byte)temp2; //基本数据类型的强制类型转换
B、本类型和对应基本类型转换
JDK1.5引入了自动装箱和拆箱的机制,那么什么是装箱和拆箱呢?
装箱就是将基本类型转换成包装类,分为自动装箱和手动装箱。同样地,拆箱就是将包装类型转换成基本类型,也分为自动拆箱和手动拆箱。
示例如下:
1 int a1=4;
2
3 //手动装箱
4 Integer aI1 = new Integer(a1);
5 //自动装箱
6 Integer aI2 = a1;
7
8 //手动拆箱
9 int ai1 = aI1.intValue();
10 //自动拆箱
11 int ai2 = aI2;
C、字符串和基本类型转换
c1.基本类型转换成字符串类型
c1a. 包装类 的toString()方法
c1b. String 类的valueOf()方法
c1c. 空字符串加一个基本类型变量
1 //基本类型转换成字符串类型有三种方法
2 int b = 1;
3 String b1 = Integer.toString(b);
4 String b2 = String.valueOf(b);
5 String b3 = b+"";
6 System.out.println("b1: "+b1+"b2: "+b2+"b3: "+b3);
c2.字符串转换成基本类型
c2a. 包装类的parse***()静态方法
c2b. 包装类的valueOf()方法
//字符串转换成基本类型的方法有两种
String b = "121";
int c1 = Integer.parseInt(b);
int c2 = Integer.valueOf(b);
四、基本类型和包装类的异同
4.1 在Java中,一切皆对象,但八大基本类型却不是对象。
4.2 声明方式的不同,基本类型无需通过new关键字来创建,而包装类型需new关键字。
4.3 存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中,能高效的存取,包装类型需要通过引用指向实例,具体的实例保存在堆中。
4.4 初始值的不同,包装类型的初始值为null,基本类型的的初始值视具体的类型而定。
4.5 使用方式的不同,如与集合类合作使用时只能使用包装类型。
五、Integer与int数据的比较
在Java中,因为有自动装箱/拆箱操作,所以int与Integer类型在比较大小时基本是没有差别的。
利用一段程序验证如下:
public class TestInteger {
public static void main(String[] args) {
int t1 = 46;
int t2 = 46;
Integer t3 = 46;
Integer t4 = new Integer(46);
Integer t5 = t1;
Integer t6 = new Integer(t2);
System.out.println("t1 == t2 " + (t1 == t2));
System.out.println("t1 == t3 " + (t1 == t3));
System.out.println("t1 == t4 " + (t1 == t4));
System.out.println("t1 == t5 " + (t1 == t5));
System.out.println("t1 == t6 " + (t1 == t6));
System.out.println("t4 == t2 " + (t4 == t2));
System.out.println("t5 == t2 " + (t5 == t2));
System.out.println("t6 == t2 " + (t6 == t2));
System.out.println("t4 == t3 " + (t4 == t3));
System.out.println("t5 == t3 " + (t5 == t3));
System.out.println("t6 == t3 " + (t6 == t3));
System.out.println("t3 equals t4 " + (t3.equals(t4)));
System.out.println("t3 equals t5 " + (t3.equals(t5)));
System.out.println("t3 equals t6 " + (t3.equals(t6)));
System.out.println("t3 equals t4 " + (t3.equals(t4)));
System.out.println("t4 equals t5 " + (t4.equals(t5)));
System.out.println("t4 equals t6 " + (t4.equals(t6)));
System.out.println("t5 equals t6 " + (t5.equals(t6)));
}
}
上面的程序中,分别利用针对变量和具体数字的两种装箱方式定义了四个Integer类的变量,
在后续的测试代码中分别使用了==和equals两种方式进行比较,其输出结果为:
t1 == t2 true
t1 == t3 true
t1 == t4 true
t1 == t5 true
t1 == t6 true
t4 == t2 true
t5 == t2 true
t6 == t2 true
t4 == t3 false
t5 == t3 true
t6 == t3 false
t3 equals t4 true
t3 equals t5 true
t3 equals t6 true
t3 equals t4 true
t4 equals t5 true
t4 equals t6 true
t5 equals t6 true
使用equals方式的比较中,所有的结果都是true。Integer类中的equals方法具体是:
1 public boolean equals(Object obj) {
2 if (obj instanceof Integer) {
3 return value == ((Integer)obj).intValue();
4 }
5 return false;
6 }
从代码可以看出,两个Integer类的equals方法最终比较的是,其各自所包装的intValue的值是否相等,因此,所有的输出结果都是true。
在使用==比较的时候,输出结果中有两个是false,都是在两个Integer类比较时产生的。因为当==比较的一个Integer类和一个int变量时,自动装箱/拆箱会对其进行处理,最终比较的是数值结果。当面对两个Integer类时,==所比较的是两个引用所指的是否为同一对象。而在上面的程序中,t4和t6都是通过new创建出的新对象,因此它们与前面的t3是完全不同的引用,所以结果是false。
值得注意的是t3和t5的比较结果,针对数值46和int变量t1的自动装箱结果指向的是同一个Integer对象,这说明在这段程序中,没有使用new来显式创建新对象时,虚拟机只会将引用指向已经存在的结果。
Java包装类,以及Integer与int之间的比较的更多相关文章
- java POJO中 Integer 和 int 的不同,用int还是用Integer
https://www.jianshu.com/p/ff535284916f [int和Integer的区别] int是java提供的8种原始类型之一,java为每个原始类型提供了封装类,Intege ...
- Java中List、integer[]、int[]之间的转化
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- Java包装类之Integer的 "==" 判断数值是否相等的陷阱及原因分析
在好久以前的一次面试中,面试官问了我这么一个问题:“现在有 Integer a = 56, b = 56, c = 180, d = 180; 请问:a == b ,c == d 是否成立,也就是 ...
- Java中的Integer和int
Java中的Integer是引用类型,而int是基本类型.Integer是int的包装器类型. java中的基本类型有布尔类型boolean;字符类型char;整数类型byte,int,long,sh ...
- [java]byte和byte[]与int之间的转换
1.byte与int转换 public static byte intToByte(int x) { return (byte) x; } public static int byteTo ...
- java - Integer、int 、String相互转换总结
一下子还真记不清这三种数据类型之间的转换方法,所以做个小笔记. public class Test03 { public static void main(String[] args) { //int ...
- java中Integer与int装箱拆箱一点收获
示例代码: class BoxIntInteger { public static void main(String[] args) { Integer a = new Integer(10111); ...
- java : 包装类 缓冲机制的使用(转载)
摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i).Byte valueOf(byte b).Short valueOf(short s).Long valueOf(l ...
- Java|从Integer和int的区别认识包装类
https://blog.csdn.net/darlingwood2013/article/details/96969339?utm_medium=distribute.pc_relevant.non ...
随机推荐
- javaweb 入门
java web 我们首先来看一下两种网络服务的常用架构. C/S([Client/Server])架构 B/S架构 (Browser/Server) (这是重点) 程序完全部署在服务器上,用户通过浏 ...
- 微信小程序中路由跳转
一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...
- Less-25 preg_replace2
Less-25: 核心语句: 各种回显也均有. 通过blacklist,我们可以发现,本题屏蔽了and和or. preg_replace函数中正则表达式后面的i是一个修饰符,代表正则匹配时不区分大小写 ...
- 6. 站在巨人的肩膀学习Java Filter型内存马
本文站在巨人的肩膀学习Java Filter型内存马,文章里面的链接以及图片引用于下面文章,参考文章: <Tomcat 内存马学习(一):Filter型> <tomcat无文件内存w ...
- 第三次Scrum Metting
日期:2021年4月27日会议主要内容概述:确定后端和前端接口,前端讨论画图页面,解决两处画图问题 一.进度情况# 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 ...
- Alpha-技术规格说明书
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.架构与技术栈 1.整体架构 本项目的整体架构如上图所示.下面我们将对涉及 ...
- UltraSoft - Beta - Scrum Meeting 4
Date: May 20th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 完成了课程中心对课程提醒的爬虫 Liuzh 前端 修改DDL列表中起始时间为课程名 ...
- 【二食堂】Alpha - 事后分析
事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? Alpha阶段要解决的问题是:根据用户标注的信息完成知识图谱的生成渲染.要解决的问题定义得比较 ...
- Noip模拟69 2021.10.5
考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...
- 2019.03.27【GDOI2019】模拟 T3
题目大意 给出$n$, $p$, 求有多少长度为$n$的排列可以被分成三个上升子序列, 数量对$p$取模, 数据范围 $3 \leq n \leq 500$. 思路 首先让我们考虑如果有一个排列,如何 ...