java基础总结(1)--深入理解基本数据类型
深入理解java数据类型
java是一种强类型语言,这就意味着必须为每一个声明变量声明一种类型。在java中,一共有8种数据类型,其中4种整型,2种浮点类型,1种字符类型和一种表示真值的boolean类型。
1. 整型
整型用于表示没有小数部分的整数部分,java提供了4中整型,如下表所示:
类 型 | 存储大小 | 取值范围 |
---|---|---|
int | 4字节 | -2^31 ~ 2^31 - 1 |
short | 2字节 | -2^15 ~ 2^15 - 1 |
long | 8字节 | -2^63 ~ 2^63 - 1 |
byte | 1字节 | -2^7 ~ 2^7 - 1 |
但是java是一门面向对象的语言,所以对于基本类型java也有其包装类型:Integer,Short,Long,Byte.
自动装箱与自动拆箱
为了使基本数据类型灵活转变,java采用了自动装箱与自动拆箱。如下所示:
Integer i = 9; // 装箱
int a = i; // 拆箱
装箱就是自动把基本类型转化为包装器类型,拆箱就是自动把包装器类型转化为基本数据类型。
那么java是怎么实现自动装箱和自动拆箱的呢?我们反编译一下:
public static void main(java.lang.String[]);
Code:
0: bipush 9
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: aload_1
7: invokevirtual #3 // Method java/lang/Integer.intValue:()I
10: istore_2
11: return
从反编译的指令中可以看出自动装箱是调用了valueof方法,而拆箱是调用了intValue方法,本着探究的精神再来看看源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) // 判断是否在Integer缓存区内
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
显然这里返回了new Integer(i),但是前面进行一个判断,我们再接着去看IntegerCache类:
private static class IntegerCache {
static final int low = -128; // 缓存区左闭区间
static final int high; // 缓存区右闭区间
static final Integer cache[]; // 缓存数组
static {
// high value may be configured by property
// 翻译一下,就是high的值可以由属性或者参数配置
int h = 127; // 默认是 127
// 下面就是检测是否修改了high的配置
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
// 如果未修改,直接赋值
high = h;
// 将区间[-128,127]的数值存入缓存数据
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
看过源码我们知道装箱的原理,也了解到Integer里的缓存机制,所以推出一个常见的题目,那就是Integer大小的比较:
for (int i = -200; i <= 200; i++){
Integer a = i;
Integer b = i;
System.out.println("a = " + a + ", b = " + b + ", a == b: " + (a == b));
}
答案也很显然了,相信你早就知道了,就是在区间[-128, 127]的值比较都为true,其他都为false。当然只有在装箱情况下的比较才会这样,其他的如:
int a = 1, int b = 1或者Integer a = new Integer(1), Integer b = new Integer(1)都遵循一般情况分别为true和false;所以,由此可以推出Long,
Character等也同理,但是这缓存机制对浮点类型并不适用,你想想从1.0缓存到2.0有多少个小数?无数个!那么为什么要采用缓存机制呢?既然是缓存,那大概是为了避免每次取数都要new一个对象,减少损耗。而且确实int类型使用最多,这样每次在使用时都是重复使用同一个对象。
java整型对java跨平台的支持:
为了实现“一次编译,到处运行”的理想,java整型的范围与运行java的机器是无关的,这就解决了软件从一个平台移植到另一个平台的诸多问题。不会出现软件在32位机器运行良好,而在16位机器运行就出现问题,所以每一种类型的取值范围都是固定的。
2.浮点类型
浮点类型表示有小数部分的数值,java有两种浮点类型,如下所示:
类 型 | 存储大小 | 取值范围 |
---|---|---|
float | 4字节 | 大约±3.40282346638528860e+38(有效数7位) |
double | 8字节 | 大约 ±1.79769313486231570e+308 (有效数15位) |
(注:取值范围依据根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值。 第 63 位(掩码 0x8000000000000000L 选定的位)表示浮点数的符号。第 62-52 位(掩码 0x7ff0000000000000L 选定的位)表示指数。第 51-0 位(掩码 0x000fffffffffffffL 选定的位)表示浮点数的有效数字(有时也称为尾数))
- 浮点数值不适用于有舍入误差的金融计算中,例如:
···
System.out.println(2.0 - 1.1);
···
结果会是
0.8999999999999999
那么为什么不是0.9呢?那是因为浮点数值用二进制表示,而二进制系统无法精确表示1/10。所以要进行精确运算时,最好使用BigDecimal类
public static void main(String[] args) {
BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("1.1");
System.out.println(a.subtract(b));
}
结果
0.9
3.总结
- 装箱是自动把基本数据类型转化为包装器类型,拆箱是自动把包装器类型转化为基本数据类型。
- 整型以及char类型在自动装箱且数值在[-128, 127] 时,会返回缓存数组中相应的值而不是new一个对象
- 在进行精确运算时不要使用浮点类型,而要使用BigDecimal类
java基础总结(1)--深入理解基本数据类型的更多相关文章
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
- Java基础之(五):数据类型
Java快捷键 首先我们先来介绍下IDEA的一些快捷键 psvm=public static void main(String[] args) {} sout=System.out.println(& ...
- java基础01-03-注释、标识符、数据类型讲解
java基础01-注释 java中的注释有三种: 单行注释 多行注释 文件注释 public class helloworld { public static void main(String[] a ...
- Java基础12:深入理解Class类和Object类
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Java基础3:深入理解String及包装类
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- Java基础之路(一)下--引用数据类型之数组
上次我们说了java的基础数据类型,今天我们就来说一下引用数据类型中的数组. 什么是数组 数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合. 数组中的每一个数据称之为数组元素,数 ...
- Java基础(二):基本数据类型和变量类型
一.java基本数据类型: 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. Java 的两 ...
- java基础知识(一)之数据类型和运算符
1.标识符:JAVA里面我们可以为之命名的就是标识符,如变量.方法.类等. 但是标识符只能包含字母.数字.下划线(_)和美元符号($),并且只能以字母.下划线和美元符号开头不能以数字开头.2.变量:在 ...
- java 基础 01 变量和注释、数据类型
1,变量和注释 比如:姓名:xiaoming 年龄:18 1.1变量的基本概念 当需要在程序中记录单个数据内容时,则需要声明一个变量来处理,而变量的本质就是内存中申请一块存储单元用于存储数据内容,由于 ...
- Java基础 带你深刻理解自动装箱,拆箱含义
1.什么是装箱,什么是拆箱装箱:把基本数据类型转换为包装类.拆箱:把包装类转换为基本数据类型.基本数据类型所对应的包装类:int(几个字节4)- Integerbyte(1)- Byteshort(2 ...
随机推荐
- 不想用锐捷怎么办?锐捷出问题|锐捷不能用怎么办?用menohust代替吧
首先获取 MentoHUST(代替锐捷网络认证客户端) V4.1.0.2001 绿色免费版 解压到任意目录 用管理员身份 启动 安装&卸载 .bat(右键用管理员运行) 这个文件可能乱码了 ...
- 2018.8.7 python3 for循环中的else语句
for else 简述 用break关键字终止当前循环就不会执行当前的else语句,而使用continue关键字快速进入下一论循环,或者没有使用其他关键字,循环的正常结束后,就会触发else ...
- tomcat 7.0 免安装版配置
转载请注明出处,欢迎邮件交流:1057449102@qq.com 注意:tomcat 运行是依赖jdk的,前提是要安装了jdk,配置好. 1.把下载好的 apache-tomcat-7.0.85.zi ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作
以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Co ...
- 20190906_matplotlib_学习与快速实现
20190906 Matplotlib 学习总结 第一部分: 参考连接: Introduction to Matplotlib and basic line https://www.jianshu.c ...
- 泛微ecology OA系统某接口存在数据库配置信息泄露漏洞
2漏洞详情 攻击者可通过该漏洞页面直接获取到数据库配置信息,攻击者可通过访问存在漏洞的页面并解密从而获取数据库配置信息,如攻击者可直接访问数据库,则可直接获取用户数据,由于泛微e-cology默认数据 ...
- 敏捷宣言(Agile Manifesto)和敏捷开发十二原则
敏捷宣言 The Agile Manifesto Individuals and interactions over Process and tools 个体与交互 重于 过程和工具 Working ...
- .NET Core 3.0 部署在docker上运行
自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...
- python学习之【第十六篇】:Python中的常用模块之OS模块、sys模块、random模块
1. OS模块 OS模块是与操作系统交互的一个接口.内部提供了以下方法: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname& ...
- 树上神奇 逆 逆序对(我的叫法)hh的小纸条 重中之重!!!!!
HH是一位十分爱好数学的大佬,尤其喜爱数数,一天百无聊赖的他写下了一个1-N的排列,并且在小纸条上记下了每个数前面有多少个数比他小,但HH不小心忘记了这个排列.现在只有当时记下的小纸条,现在请你还原出 ...