Java中的数据类型

本文基于JDK 1.8.0_45

基本数据类型

Java中的基本数据类型及其所占字节大小如下所示。基本数据类型是在栈中字节分配内存,其中一个char为两个字节,这样一个char中即可存储一个中文汉字。

类型 字节
byte 1
char 2
short 2
integer 4
long 8
float 4
double 8
boolean 1/8

注:1 byte是8 bits

在定义long的时候需要在数字末尾加上l或者L,在定义float的时候可以在数字末尾加上f或者F(默认如果数字中有小数点则为float),在定义double的时候需要在数字末尾加上d或者D。一般建议在数字末尾加上大写字母来标示数据类型,这是因为特别是小写字母l和数字1在印刷体中较难区分,使用大写字母L更易于阅读。如:

byte b = 1;
char c = 1;
short s = 1;
int i = 1;
long l = 1L;
float f = 1F;
double d = 1D;

在各种数据类型之间可以进行转换,转换顺序如下所示:

byte -> short, char -> int -> long

float -> double

int -> float

long -> double

包装类

在Java中基本数据类型是存储在栈中,不是对象。为了在一些需要使用对象的场景中使用这些基本数据类型,Java给每种数据类型定义一种相对应的包装类,对应关系如下。

类型 包装类型
byte Byte
char Character
short Short
integer Integer
long Long
float Float
double Double
boolean Boolean

这些基本类型和包装类型可以直接进行转换,这被称为自动装箱、拆箱。自动装箱、拆箱是一个比较消耗内存的操作,尽量避免使用,下面会介绍Java对这个操作的一些优化。

Number

其中Byte、Short、Integer、Long、Float、Double均继承自abstract类Number,在Number类中定义了获取这六种基本数据类型数据的方法,其中方法byteValue和方法shortValue是通过先获取intValue再将integer的数据强转为byte或short类型实现的。

基本方法

在每种Number类型中均定义了最大值、最小值、基本数据类型的Class对象、二进制长度和字节长度,另外还提供了众多的util方法,如有符号无符号转换,与各种进制(Java目前支持2-36进制,其他均需要自行实现)的string的互相转换,从系统属性中直接获取包装类型的属性值的get*。

parse*和valueOf方法的区别是前者返回的是基本数据类型,后者返回的是包装类的实例。

Integer中有一个很赞的方法decode,接收一个string,根据string中的标示自动判断该数据的进制并转换为Integer。

二进制相关方法方法

另外还有一些二进制相关的方法,以下以Integer中的方法为例:

System.out.println("Integer.toBinaryString(5) = " + Integer.toBinaryString(5));// 5的二进制为101
System.out.println("Integer.highestOneBit(5) = " + Integer.highestOneBit(5));// 最高位置为1,其他为0:二进制为100, 十进制为4
System.out.println("Integer.lowestOneBit(5) = " + Integer.lowestOneBit(5));// 最低位置为1,其他为0:二进制为001, 十进制为1
System.out.println("Integer.numberOfLeadingZeros(5) = " + Integer.numberOfLeadingZeros(5));// 二进制中开头有多少个0:29
System.out.println("Integer.numberOfTrailingZeros(5) = " + Integer.numberOfTrailingZeros(5));// 二进制中结果有多少个0:0
System.out.println("Integer.bitCount(5) = " + Integer.bitCount(5));// 二进制中有多少个1:2
System.out.println("Integer.rotateLeft(5, 2) = " + Integer.rotateLeft(5, 2));// 向左旋转:二进制为10100,十进制为20
System.out.println("Integer.rotateRight(5, 2) = " + Integer.rotateRight(5, 2));// 向右旋转:二进制为1000000000000000000000000000001,十进制为1073741825
System.out.println("Integer.reverse(16777216) = " + Integer.reverse(16777216));// 将二进制反转:128
System.out.println("Integer.signum(-100) = " + Integer.signum(-100));// 符号位为负时返回-1
System.out.println("Integer.signum(0) = " + Integer.signum(0));// 入参为0时返回0
System.out.println("Integer.signum(100) = " + Integer.signum(100));// 符号位为正时返回1
System.out.println("Integer.reverseBytes(1) = " + Integer.reverseBytes(1));// 按字节反转:16777216
System.out.println("Integer.reverseBytes(16777216) = " + Integer.reverseBytes(16777216));// 按字节反转:16777216

除以0?

一般我们认为0是不能作为分子进行除法运算的,否则会抛出ArithmeticException异常。但是事实上在Java中对浮点数做除法运算的时候0可以可以作为除数的,如下

System.out.println(-1.0F / 0.0F);// -Infinity
System.out.println(1.0F / 0.0F);// Infinity
System.out.println(0.0F / 0.0F);// NaN
System.out.println(1 / 0);// java.lang.ArithmeticException: / by zero

Number的缓存——享元模式

所谓享元模式即为将一部分最经常使用的对象缓存在内存中,但需要使用这些对象的时候直接从内存中获取已经实例化好的对象而不是重新实例化一个,这样可以很好的节约内存并减少对象实例化的开销。

上面说到自动装箱、拆箱是一个比较消耗内存的操作,而数字是程序中最经常使用的东西,为了解决这个问题Java使用享元模式对这个操作进行了优化,对Byte、Short、Integer、Long的缓存范围是-128~127。其中Integer的缓存最大值是可以在JVM启动的时候通过-XX:AutoBoxCacheMax=size进行自定义。如以下程序在执行的时候添加参数-XX:AutoBoxCacheMax=130即可全部返回true。

System.out.println(Integer.valueOf("127") == Integer.valueOf("127"));
System.out.println(Integer.valueOf("128") == Integer.valueOf("128"));

Boolean

Boolean中定义了true和false的实例、基本数据类型的class对象,与基本数据类型boolean、string直接的互相转换,另外还提供了一些and、or、xor的util方法。

Character

Character对自动装箱拆箱也做了跟Number相关类型类似的优化,对0-127之间的char进行了缓存。另外提供了很多其他的util方法,比如大小写转换、与string、number之间的互相转换等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,617评论 18 399
  • 第一类:逻辑型boolean 第二类:文本型char 第三类:整数型(byte、short、int、long) c...
    Jasonme阅读 1,071评论 0 4
  • 一.在没有应聘报社之前,我对传媒行业一概不知。记者,编辑,运营,对我来说,遥远而又陌生。 但是,记者,于我而言,神...
    财女有钱途阅读 4,362评论 0 0
  • 你的名字:于千万人之中,缘来是你 之前被赞誉到极致的视觉画面,对我来说感触到不大,可能是经常观看动画动漫的原因,早...
    麦芽余鱼阅读 537评论 1 3
  • 老妇聊发少年狂,左脚伸,右手扬,锦帽花衣,千人舞广场。为报倾城随音响,扭屁股,比腚靓。 黄昏舞曲尚开张,鬓微霜,又...
    假号阅读 193评论 6 5