前言

很多刚学 Java 的朋友,学到数据类型扩展这一块都会懵:
为什么 0.1f == 0.1 是 false?
为什么 new String 和直接赋值用 == 结果不一样?
八进制、十六进制到底怎么写?字符为什么能强转成数字?

这篇文章我把最核心、最常考、最容易错的知识点全部整理出来,
代码逐行跑过、语义化命名、注释超详细,看完你一定通透。


一、整数类型拓展:四种进制写法

Java 中整数可以用 4 种进制 表示,面试非常喜欢考。

// 十进制:默认写法
int i = 10;

// 八进制:以数字 0 开头
int i2 = 010;

// 十六进制:以 0x 开头
int i3 = 0x10;

System.out.println(i);   // 10
System.out.println(i2);  // 8
System.out.println(i3);  // 16

重点规则

  • 二进制:0b 开头
  • 八进制:0 开头
  • 十进制:正常写
  • 十六进制:0x 开头(0~9 + a~f)

二、浮点数拓展:精度陷阱(高频面试坑点)

float、double 不能用于精确比较!
不能用来做金钱计算!

float f  = 0.1f;
double d = 1.0 / 10;

System.out.println(f == d); // false

为什么是 false?

因为 0.1 无法用二进制精确表示,float 和 double 存储的是近似值。


再看一个更离谱的例子:

float d1 = 1234567890f;
float d2 = d1 + 1;

System.out.println(d1 == d2); // true

float 精度有限,+1 已经超出精度范围,结果不变。

👉 开发规范:
金融、金额、高精度计算必须用 BigDecimal


三、字符拓展:字符本质就是数字!

所有字符,底层都是 Unicode 编码数字

char c1 = 'a';
System.out.println((int) c1); // 97

char c2 = '中';
System.out.println((int) c2); // 20013

Unicode 转义字符

char c3 = '\u0061';
System.out.println(c3); // a

👉 结论:
字符 = 数字的外观展示


四、转义字符

最常用的两个:

System.out.println("hello\tWorld"); // \t 制表符(Tab)
System.out.println("hello\nWorld"); // \n 换行

五、字符串对比:== 到底比较什么?(面试必考)

这是 Java 最经典的面试题之一。

// 方式1:new 出来的,在堆里,新建对象
String aa = new String("hello world");
String ab = new String("hello world");
System.out.println(aa == ab); // false

// 方式2:直接赋值,放在字符串常量池,会复用
String ac = "hello world";
String ad = "hello world";
System.out.println(ac == ad); // true

一句话总结

  • ==:比较地址
  • equals():比较内容
  • 字符串比较内容永远用 equals

六、布尔值拓展:代码精简规范

boolean flag = true;

// 不推荐
if (flag == true) {}

// 推荐(规范、简洁)
if (flag) {}

七、完整可运行代码(最终版)

public class DataTypeExtensionDemo {
    public static void main(String[] args) {

        // 1. 整数进制拓展
        int i = 10;
        int i2 = 010;
        int i3 = 0x10;

        System.out.println(i);   // 10
        System.out.println(i2);  // 8
        System.out.println(i3);  // 16

        // 2. 浮点数精度问题
        float f = 0.1f;
        double d = 1.0 / 10;
        System.out.println(f == d); // false

        float d1 = 1234567890f;
        float d2 = d1 + 1;
        System.out.println(d1 == d2); // true

        // 3. 字符本质是数字
        char c1 = 'a';
        System.out.println((int) c1); // 97

        char c2 = '中';
        System.out.println((int) c2); // 20013

        char c3 = '\u0061';
        System.out.println(c3); // a

        // 4. 转义字符
        System.out.println("hello\tWorld");
        System.out.println("hello\nWorld");

        // 5. 字符串 == 比较(面试重点)
        String aa = new String("hello world");
        String ab = new String("hello world");
        System.out.println(aa == ab); // false

        String ac = "hello world";
        String ad = "hello world";
        System.out.println(ac == ad); // true

        // 6. 布尔值简化写法
        boolean flag = true;
        if (flag) {
            // 推荐写法
        }
    }
}

总结(必背)

  1. 整数有四种进制:0b0、默认、0x
  2. 浮点数不能精确比较,禁止用于金钱
  3. 字符本质是 Unicode 数字
  4. \t 制表符、\n 换行
  5. 字符串 == 比较地址,equals 比较内容
  6. 布尔判断直接写 if(flag) 最规范
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐