Java随谈(六)## 我们真的理解 Java 里的整型吗?
我们真的理解 Java 里的整型吗
整型是我们日常生活中最常用到的基础数据类型,看这篇文章之前,我想问:
我们真的像自己认为的那么理解 Java 内的整型吗?
也许看完本篇文章你就有自己的答案。
C 语言 提供了如下的整型
学习 Java 的整型之前,让我们看看它的前辈——C 语言的实现。
让我们更好地了解它的设计。
数据类型 | 占用字节 | 取值范围 |
---|---|---|
signed char | 1 byte(8 bit) | -2^7, 2^7-1 |
signed short | 2 byte(16 bit) | -2^15, 2^15-1 |
signed int | 4 byte(32 bit) | -2^31, 2^31-1 |
signed long | 4 byte(32 bit) | -2^31, 2^31-1 |
signed long long | 8 byte(64 bit) | -2^63, 2^63-1 |
unsigned char | 1 byte(8 bit) | 0, 2^8-1 |
unsigned short | 2 byte(16 bit) | 0, 2^16-1 |
unsigned int | 4 byte(32 bit) | 0, 2^32-1 |
unsigned long | 4 byte(32 bit) | 0, 2^32-1 |
unsigned long long | 8 byte(64 bit) | 0, 2^64-1 |
Java 提供了如下整型
Java 则简单了很多。
数据类型 | 占用字节 | 取值范围 |
---|---|---|
byte | 1 byte(8 bit) | -2^7, 2^7-1 |
short | 2 byte(16 bit) | -2^15, 2^15-1 |
int | 4 byte(32 bit) | -2^31, 2^31-1 |
long | 8 byte(64 bit) | -2^63, 2^63-1 |
Java 和 C 整型的区别
C的整型大小与操作系统的位数直接相关, 需要通过 sizeof 运算符先算出默认位数。 Java统一了位数。
C的整型存在 unsigned 和 signed 的区别,而 Java 只有 signed。
优势:更简单,不会遇到 unsigned 和 signed 整型进行运算的隐式转换问题。
劣势:如果碰到 unsigned 的整型,会用存储容量更大的来存储。
例子
- unsigned byte 在 Java 中存储为 short
- unsigned short 在 Java 中存储为 int
- unsigned int 在 Java 中存储为 long
- unsigned long 在 Java 中存储为 BigDecimal
注: java 8 新增了 unsigned 相关的API,可以通过API计算。
或采用 Guava 的 unsigned整数实现。 例如(com.google.common.primitives.UnsignedInteger)C 语言存在的整型溢出问题, 而 java.lang.Math包 提供了 xxxExact() 方法。
java 的装箱问题
原始数据类型 | 占用字节 | 包装类 | 占用字节 |
---|---|---|---|
byte | 1 byte(8 bit) | Byte | 16 byte(128 bit) |
short | 2 byte(16 bit) | Short | 16 byte(128 bit) |
int | 4 byte(32 bit) | Integer | 16 byte(128 bit) |
long | 8 byte(64 bit) | Long | 16 byte(128 bit) |
包装类的劣势
- 在数据密集型操作中,内存消耗会对性能产生巨大影响
- 基础类型存在默认值,而包装类可能存在 null,引起空指针异常
- 基础类型可以通过 == 判断大小,包装类型判断大小需要用 equals() 方法
包装类的优势
- 包装类会缓存实例,减小内存消耗。
比如: Integer 会缓存 -128, 127内的实例 - 支持新特性,比如泛型,lambda表达式。
- 包装类提供了对象操作,封装了一些实用的方法
比如:- Integer 继承了 Number 类, 可以和其他的 Number 子类进行转化
- Integer 实现了 Comparable 接口
- Integer 存在 unsigned API (java8)
- Integer 提供了转化为二、八、十六进制的 API
- Integer 提供了构造方法,并在其中校验了入参是否合法
- Integer 提供了四则运算等算数API
Java 并不完美,它可以更好
从现在往回追溯,Java 的 Integer 事实上源于一个妥协。由于 java 号称完全面向对象,而在最初的版本中却存在 byte, short, int, long, char, boolean, float, double 这八种原始数据类型(primitive data types)。
在 Java 中我们无法写出类似下面的代码
3.toString();
而在一些更加纯粹的面向对象语言,则可以实现上述代码。
例如 Scala
3.toString();
引用
- Java Notes For Professionals.pdf
- Java 语言规范
感谢
希望对你有所帮助!
Java随谈(六)## 我们真的理解 Java 里的整型吗?的更多相关文章
- 你真的理解Java 注解吗?
你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...
- Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...
- Java基础系列1:深入理解Java数据类型
Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个 ...
- Java内存管理-你真的理解Java中的数据类型吗(十)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 作为Java程序员,Java 的数据类型这个是一定要知道的! 但是不管是那种数据类型最 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- 夯实Java基础系列10:深入理解Java中的异常体系
目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...
- java提高篇(三)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- 夯实Java基础系列11:深入理解Java中的回调机制
目录 模块间的调用 多线程中的"回调" Java回调机制实战 实例一 : 同步调用 实例二:由浅入深 实例三:Tom做题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 ...
- 夯实Java基础系列13:深入理解Java中的泛型
目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...
随机推荐
- vscode代码格式化快捷键及保存时自动格式化
一.实现vs code中代码格式化快捷键:[Shift]+[Alt]+ F 二.实现保存时自动代码格式化: 1)文件 ------.>[首选项]---------->[设置]: 2)搜索 ...
- java语言和jdk、jre基础
Java语言平台 * J2SE(Java 2 Platform Standard Edition)标准版 * 是为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可以完成一些桌 ...
- maven项目中各文件都没有报错,但是项目名称有红叉
项目报错可以看到Problems(可以在Window--Show View--other--输入Problems找到) 一.可能原因 1.项目中各文件没有报错,但是项目名称中 ...
- Wireshark查找与标记数据包
查找数据包 按Ctrl-F. 查找数据包提供了4个选项: 显示过滤器(Display filter):该选项可以让你通过输入表达式进行筛选,并只找出那些满足该表达式的数据包.如:not ip, ip. ...
- IDM调用参数
cmd调用IDM 基本命令: IDMan /d URL [/p 本地文件路径] [/f 本地文件名] [/q] [/h] [/n] [/a] 参数: 名称 作用 /d 下载文件的url /s 开始任务 ...
- SpringMVC-获得Restful风格的参数
使用@PathVariable注解:接收请求路径中占位符的值 @RequestMapping("/report18/{username}") @ResponseBody publi ...
- C++五子棋(三)——判断鼠标有效点击
分析 在鼠标左键点击时,我们不能让新棋子在已有棋子的位置落下,同时我们还要让棋子在规定位置落下--棋盘线的交点处. 功能实现 创建数据类型 创建头文件chessData.h和源文件chessData. ...
- Solon 1.6.36 发布,更现代感的应用开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- mouseenter 和 mouseover 的区别
当鼠标移动到元素上时就会触发mouseenter事件 类似mouseover,它们两者之间的差别是 mouseover鼠标经过自身盒子会触发,经过子盒子还会触发.mouseenter只会经过自身盒子触 ...
- shell基础知识讲解
第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash redhat和centos使用 d ...