JavaSE 19 Java基础语法 → 数据类型拓展&&面试题讲解

本文介绍了数据类型的拓展,包括整数的进制转换,如二进制、八进制、十六进制之间的转换,并讲解了Java中进制表示的方法。同时,讨论了浮点数的精度问题,由于存储机制导致的不精确比较。此外,字符在计算机中的本质以及String对象在内存中的处理方式也进行了阐述。最后提到了布尔值在逻辑判断中的使用建议。
摘要由CSDN通过智能技术生成

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

  • 二进制转十六进制和八进制
  1. 每三位二进制数 对应 一个八进制数,二进制数如果 不足,则在后面补0,直到充足为止。


    1 0 0 1(二进制)
    补0:100 100
    44(八进制)
  2. 每四位二进制数 对应 一个十六进制数,二进制数如果 不足,则在后面补0,直到充足为止。


    1 0 0 1(二进制)
    9(十六进制)
  • 十六进制和八进制转二进制

其实就是把每个十六进制数或八进制数,直接转变成 二进制数即可。


4.4.2 Java的进制书写

整数拓展:二进制0b 十进制 八进制0 十六进制0x

它的意思仅仅是,你可以写 一个 二进制、十进制。八进制、十六进制的 常量值数据,然后 存储到 int 类型里!所以我们打印的时候,你会发现 打印的 还是 十进制!因为 你并没有调节 打印的方式,默认 打印的就是 是十进制的!在这里插入图片描述在这里插入图片描述


4.4.3 浮点数扩展

  • float和double是有精度问题的
  1. float f = 0.1f;
    double d = 1.0/10;
    System.out.println(d==f);
    提示 false 不相等!
  2. 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){} //老手
//上面的 两条语句 其实 是 一个意思,并且 也是一个效果。
//我们 非常的 提倡 代码 要精简!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值