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中的泛型
目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...
随机推荐
- python 反序列化
Python-反序列化函数使用 pickle.dump(obj, file) : 将对象序列化后保存到文件 pickle.load(file) : 读取文件, 将文件中的序列化内容反序列化为对象 pi ...
- python---插入排序的实现
插入排序 思想 列表被分为有序区和无序区两个部分, 最初有序区只有一个元素, 每次从无序区选择一个元素, 插入到有序区的位置, 直到无序区变空 import random from cal_tim ...
- ssm整合-ssmbuild
目录 项目结构 导入相关的pom依赖 Maven资源过滤设置 建立基本结构和配置框架 Mybatis层编写 Spring层 Spring整合service层 SpringMVC层 Controller ...
- 安全市场迎来新挑战,FinClip助力车联网数据安全
随着汽车工业的发展与电子技术的进步,智能汽车迎来了前所未有的蓬勃发展,随着汽车电动化.网联化.智能化交融发展,车辆运行安全.数据安全和网络安全风险交织叠加,安全形势更加复杂严峻......
- 群晖下虚拟机编译部署WOW服务端TrinityCore
前言 前几天突然想玩WOW了,但是我是一个特别轻度的玩家,以前点卡的时候,我就是上去一个人做做任务,跑跑地图,不怎么玩副本和PVP,现在让我花钱充月卡,不太现实,没那个时间玩,所以,就考虑玩个私服,但 ...
- optimoptions requires Optimization Toolbox(optimoptions 需要 Optimization Toolbox)解决方法
问题:在下载版的matlab中做coursera的machine learning里的ex2,做到 1.2.3 Learning parameters using fminunc 时出现optimop ...
- Hyperledger Fabric 部署在多个主机上
前言 在实验Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务.TLS组织运行维护Orderer服务中,我们已经完成了使用提供 TLS-CA 服务的 council ...
- Restful API和传统的API的区别
一.功能区别 Restful API是当作资源的唯一标识符,而传统是实现某某功能 如:/api/getList/1 and /api/getList?page=1 二.methods多样性 Restf ...
- pgpool-II 4.3 中文手册 - 入门教程
本章解释了如何开始使用 Pgpool-II. 安装 在本节中,我们假设您已经安装了 Pgpool-II 与 PostgreSQL 集群. 你的第一个复制(Replication) 在本节中,我们将解释 ...
- Dapr 远程调试之 Nocalhost
虽然Visual studio .Visual studio code 都支持debug甚至远程debug ,Dapr 搭配Bridge to Kubernetes 支持在计算机上调试 Dapr 应用 ...