时光飞逝,蓦然回首,Java 基础 似乎我都快记不起来了,希望这次能温故而知新,或是一些感动,或是一些惊喜,或重拾年轻时候的回忆。
在 JVM 中,数据分为两大类:primitive types (原生类型)和 reference types(引用类型)。
Java 的 8种基本数据类型:
在Java中,一共有8种基本类型 英文 : primitive type ,primitive 原始的,朴实无华的,非派生的,在 计算机科学 Computer Science 中 有 “原” 的意义,所谓的 “原”, 我的理解是,这8种基础类型是非引用型的数据。
其中,4个整数型 int,short , long ,byte ; 2个浮点型 double , float ,1个用来专门表示Unicode编码的字符单元的类型char,1个用于纪念布尔的真假的布尔类型。
整型:
类型 | 存储空间 | 取值范围 |
byte | 1 * byte字节 8bit位 | -2^7 ~ ( 2^7 -1) |
short | 2 * byte字节 16bit位 | -2^15 ~ (2^15-1) |
int | 4 * byte字节 32bit位 | -2^31 ~ (2^31-1) |
long | 8 * byte字节 64bit位 | -2^63 ~ ( 2^63 -1) |
学过C语言的兄弟,肯定首先就注意到了,Java中没有无符号整型的概念,都是带符号的。
1 byte字节 等于 8 bit ;正数部分专门为了0,特意的减了一个1。int 类型最常用,这个也很好记,如果中国的人口加上印度的人口肯定超过了21.5亿人,这个时候肯定就是要溢出了。如果要用一个数字来代表地球上的人口,那这个类型只能是long。byte 和 short 类型 用于特定的应用场合,如:底层的文件处理 或者 需要控制占用存储空间量的大数组。
long类型数字在后面可以后缀一个L,大小写皆可,来指明为long整型。0x或0X代表 16进制的数;8进制有一个前缀0,010就是8。从Java7开始,0b或0B可以代表二进制,0b1001就是9,同样从Java 7 开始,为了方便阅读,你可以在数字下面加入下划线,来方便你自己阅读代码。比如 1_0000_0000这就是曾经的首富王健林的一个小目标。
package com.cosyit.corejava.core1;
public class Main {
public static void main(String[] args) {
System.out.println(0b1001); // 9
System.out.println(010); // 8
System.out.println(0x10); // 16
System.out.println(1_0000_0000);
System.out.println(21_5000_0000L);//默认表示int ,加上l就不会有溢出的编译错误。
//使用Integer的静态方法把10进制的 -3 转为二进制表示。
String s = Integer.toBinaryString(-3);
}
}
关于二进制数字的转换,这个我在C/C++博客中写过,Go的博客中也写过,这里Java一样,也写一遍,计算机基础性的东西大家都一样的。
1.如何获取一个数的二进制表示:
有符号 int 第一位是0 则是正数,第一位是1 则为负数。
对于负数的绝对值,是符号位以外的部分取反后再加1。
需求: 我们想用8bit的二进制表示-3
做法: -3,负号的首位 毋庸置疑 设置为1 ,
现在就处理剩下7个bit
先表示3 000 0011
取反 111 1100
加1 111 1101
添加上符号位 1111 1101
2.逆向过程,从一个二进制表示的负数 1111 1101 ,获取易读的表示(我觉得十进制更易读)
先看首位 是1,那么就写个负号 ,
再看剩下的7位数取反 0000010 ,这是2
再加1, 为得到绝对值为3,负号则乘以-1,我们可知其值为 -3.
精华就是:相互转换都一样的玩法,先搞定符号位,剩下位数取反加一。
浮点型:
类型 | 存储空间 | 取值范围 |
float | 4 * byte字节 32bit位 | 约 -3.4E38F — +3.4E38F ,有效位数6-7位 |
double | 8 * byte字节 64bit位 | 约-1.798E308~1.798E308 E308 ,有效位数15位 |
double类型的数值精度是float类型精度的两倍,固又被称为 双精度数值类型。
fload 大约只能表示7位十进制的数字,double 大约表示15位的十进制数据,所以绝大部分的应用程序都采用double类型,涉及金融的场景,大多数情况下,我们都会使用BigDecimal类,我们可以保证不会有精度缺失,否则公司的会计就会来找你麻烦了。
编译器遇到小数类型,默认认为为double 类型。 fload的后缀为f | F,double数值 后缀为 d | D ,另外,比较两个浮点数是否相等,不能直接用 == 全等号。
![](https://i-blog.csdnimg.cn/blog_migrate/0a1d016d180d378926879490acb525ca.png)
IEE754标准 规定了 如何以二进制的方式表示十进制的数字:
这块比较绕:有兴趣的可以去看下视频: 什么是浮点数?10分钟彻底掌握浮点数的底层原理 #安员外读书会_哔哩哔哩_bilibili