4.4 数据类型拓展及面试题讲解
4.4.1 整数拓展(进制)
- 进制:生活中我们用的是十进制,规则就是逢十进一,由 0 1 2 3 4 5 6 7 8 9 组成。
- 二进制:由 0 1 组成,逢二进一。
- 八进制:由 0 1 2 3 4 5 6 7 组成,逢八进一。
- 十六进制:由 0 1 2 3 4 5 6 7 8 9 A B C D E F 组成,逢十六进一。
4.4.1.1 进制的互相转换
- 二进制转换十进制
8 4 2 1 法
1 0 0 1(二进制)
1x8 + 0x4 + 0x2 + 1x1 = 9 (十进制)
- 任何进制转换十进制 通用方法
二进制:1 0 0 1
十进制:1x20 + 0x21 + 0x22 + 1x23 = 9
八进制:100
十进制:0x80 + 0x81 + 1x82 = 64
十六进制:100
十进制:0x160 + 0x161 + 1x162 = 256
- 十进制转任何进制 通用方法
十进制:9
二进制:
9/2 = 4…1 4/2 = 2…0 2/2 = 1…0 1/2 = 0…1 然后把余数从最后一个倒着串到第一个连起来!
return 1001
十进制:100
八进制:144
十进制:100
十六进制:64
- 二进制转十六进制和八进制
- 每三位二进制数 对应 一个八进制数,二进制数如果 不足,则在后面补0,直到充足为止。
1 0 0 1(二进制)
补0:100 100
44(八进制)- 每四位二进制数 对应 一个十六进制数,二进制数如果 不足,则在后面补0,直到充足为止。
1 0 0 1(二进制)
9(十六进制)
- 十六进制和八进制转二进制
其实就是把每个十六进制数或八进制数,直接转变成 二进制数即可。
4.4.2 Java的进制书写
整数拓展:二进制0b 十进制 八进制0 十六进制0x
它的意思仅仅是,你可以写 一个 二进制、十进制。八进制、十六进制的 常量值数据,然后 存储到 int 类型里!所以我们打印的时候,你会发现 打印的 还是 十进制!因为 你并没有调节 打印的方式,默认 打印的就是 是十进制的!
4.4.3 浮点数扩展
- float和double是有精度问题的
- float f = 0.1f;
double d = 1.0/10;
System.out.println(d==f);
提示 false 不相等!- float d1 = 23131312312312313f;
float d2 = d1 + 1;
System.out.println(d1==d2);
提示 true 相等!
原因在于,浮点数存储的每一个数在内存里面,对应的是 “位”。符号位占一位,float幂指数占8位,double幂指数占11位。float尾数占23位,double尾数占52位。那么可以想到,即使遵循IEEE 754 标准,那么数字也可能在未超出范围的时候,超出了二进制数的位数,怎么办呢?Java就将其四舍五入了。所以精度当然不是准确的!
1.0/10 可能它的 二进制 不等于 0.1 的二进制。也可能是因为 类型不同!
第二种情况就是,已经越界了,那么越界返回的值,在Java里是一个。
我们一般都会去 采用 BigDecimal
我们一定要避免 用float 和 double 进行 比较的逻辑判断
4.4.4 字符扩展
所有的字符 本质上 都是 数字!它们是用 这些数字 做的 映射,让其在电脑显示屏上显示对应的字符。
- Unicode 编码 的书写存储
char c3 = '\u0061';//利用转义字符 \u 来实现 Unicode编码的字符存储。比如说 61 对应的 就是 字符 a。
4.4.4 String 在堆空间上开辟空间
String sa = new String("hello world");
String sb = new String("hello world");
System.out.println(sb==sa);
//提示 false 因为 开辟堆空间,返回的是 开辟的内存地址。所以 当然不相等了。。
String sc = "hello world";
String sd = "hello world";
System.out.println(sc ==sd );
//提示 true,这个是 存储在 常量区 同一个地址的位置上,并且 数据 都是 hello world。
4.4.5 布尔值扩展
boolean flag = true;
if(flag == true){}//新手
if(flag){} //老手
//上面的 两条语句 其实 是 一个意思,并且 也是一个效果。
//我们 非常的 提倡 代码 要精简!