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中的泛型
目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...
随机推荐
- java中字符串池,String池,共享池到底是怎么回事?
栈中有共享池的概念,比 如下面例子中,sz="hello";在栈中创建一个String对象引用变量sz,然后看看栈中有没有"hello",如果没有,则将&quo ...
- css3,css的基础全局运用
浮动 1.浮动起来的盒子不占用位置,浮动了一个盒子下面的标准流的盒子会顶上来 可用清除浮动的方法来解决标准流会顶替位置的问题 清除浮动给父盒子加overflow: hidden; 鼠标经过事件 : ...
- java获取登录ip和地址
//获取HttpServletRequest对象 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestCon ...
- 5.Java程序运行机制
一.编译型和解释型语言区别 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以任何的高级语言编写的程序都必须转换成计算机语言,也就是机器码.而这种转换的方式有两种: 编译 ...
- Java语言学习day31--8月06日
今日内容介绍1.正则表达式的定义及使用2.Date类的用法3.Calendar类的用法 ###01正则表达式的概念和作用 * A: 正则表达式的概念和作用 * a: 正则表达式的概述 * 正则表达式也 ...
- Find the Maximum - 题解【思维,贪心】
题面 这是2022年ICPC昆明站的F题.在赛场上,我一开始敲了个贪心,但是出锅了,改敲树形DP,但是时间来不及了.在队友的提醒下补过了这个题,知道解法的我发现我就是个纯纯的老坛-- 原题链接在牛客网 ...
- 【Java分享客栈】我曾经的两个Java老师一个找不到工作了一个被迫转行了
前言 写这篇文章的初衷主要是最近发生了两件事,让我感慨良多,觉得踏入这个行业的初始,有些事情就应该长远考虑,这样对职业发展才更有利,仅仅停留在技术的追求上固然能壮大自身,可逆水行舟的程序员们终究会面临 ...
- JS 中 对象 基础认识
俗话说:"万物皆对象",在 Javascript 中除了原始值几乎所有的东西都可以看做对象: 布尔是对象( new 关键词定义) 数字是对象( new 关键词定义) 字符串是对象 ...
- 常问的MySQL面试题集合
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 ...
- 没错,华为开始对IoT下手了!
最近,有很多粉丝在后台私信 想知道目前最热的技术是什么? 小编觉得,5G时代到来 物联网技术将迎来快速的发展 加上目前,国内物联网人才短缺 每年人才缺口达百万 IoT物联网将成为最热门的技术 最近,小 ...