【Java 基础】数据类型扩展与高频面试题(彻底搞懂进制、浮点数、字符串、Unicode)
·
前言
很多刚学 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) {
// 推荐写法
}
}
}
总结(必背)
- 整数有四种进制:
0b、0、默认、0x - 浮点数不能精确比较,禁止用于金钱
- 字符本质是 Unicode 数字
\t制表符、\n换行- 字符串
==比较地址,equals比较内容 - 布尔判断直接写
if(flag)最规范
更多推荐





所有评论(0)