小林coding面试题笔记(二)

AI-摘要
DeepSeek GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
小林coding面试题笔记(二)
Jie1. Java的基本数据类型
Java支持两类数据类型:基本数据类型
和引用数据类型
。
基本数据类型共有8种,分为以下三类:
- 数值型:包括整数类型(
byte
、short
、int
、long
)和浮点类型(float
、double
)。 - 字符型:
char
。 - 布尔型:
boolean
。
以下是8种基本数据类型的默认值、位数、取值范围等信息:
数据类型 | 占用大小(字节) | 位数 | 取值范围 | 默认值 | 描述 |
---|---|---|---|---|---|
byte | 1 | 8 | -128 到 127 | 0 | 最小的整数类型,适合节省内存。 |
short | 2 | 16 | -32768 到 32767 | 0 | 较少使用,适合小范围整数。 |
int | 4 | 32 | -2147483648 到 2147483647 | 0 | 最常用的整数类型。 |
long | 8 | 64 | -9223372036854775808 到 9223372036854775807 | 0L | 表示非常大的整数,需加L 后缀。 |
float | 4 | 32 | 1.4E-45 到 3.4028235E38 | 0.0f | 单精度浮点数,需加f 后缀。 |
double | 8 | 64 | 4.9E-324 到 1.7976931348623157E308 | 0.0d | 双精度浮点数,默认浮点类型。 |
char | 2 | 16 | ‘\u0000’ 到 ‘\uffff’ | ‘\u0000’ | 表示单个字符,采用Unicode编码。 |
boolean | 不明确(理论1位) | 不明确 | true 或 false | false | 用于逻辑判断。 |
注意事项:
- 默认浮点数类型为
double
,若需声明float
型,需加f
或F
后缀。 - 默认整数类型为
int
,若需声明long
型,需加l
或L
后缀。 char
类型是无符号的,取值范围从0开始。- 包装类:
int
对应Integer
,char
对应Character
,其他基本类型包装类首字母大写。 boolean
类型的大小和存储方式依赖于JVM实现,通常以1位表示,但实际存储可能占用1字节或更多。
2. long和int可以互转吗?
可以,long
和int
可以相互转换:
int
转long
:自动转换,安全无数据丢失。long
转int
:需强制类型转换,可能导致数据丢失或溢出。
示例代码:
1 | int intValue = 10; |
总结:
- 小类型转大类型:自动转换。
- 大类型转小类型:需强制转换,注意数据丢失或溢出。
- 在实际开发中,尽量避免强制类型转换,尤其是可能导致数据丢失的场景。
3. 数据类型转换方式
常见的类型转换方式:
- 自动类型转换(隐式转换):小范围类型自动转换为大范围类型。
示例:int
转long
,float
转double
。 - 强制类型转换(显式转换):大范围类型转换为小范围类型,需显式声明。
示例:long
转int
,double
转int
。 - 字符串转换:通过
Integer.parseInt()
、Double.parseDouble()
等方法将字符串转换为数值类型。
示例:1
2
3
4
5
6
7
8String str = "123";
int num = Integer.parseInt(str); // 字符串转int
```
4. **数值之间的转换**:通过包装类方法实现,如`Character`、`Integer`等。
示例:
```java
char c = 'A';
int ascii = Character.getNumericValue(c); // 字符转ASCII值
4. 类型互转可能出现的问题
- 数据丢失:大范围类型转小范围类型时,高位数据可能丢失。
示例:1
2
3long largeValue = 123456789L;
int smallValue = (int) largeValue; // 数据丢失
System.out.println(smallValue); // 输出:-539222987 - 数据溢出:小范围类型转大范围类型时,可能填充额外高位空间。
- 精度损失:浮点数类型转换时可能丢失精度。
示例:1
2
3double d = 1.23456789;
float f = (float) d; // 精度损失
System.out.println(f); // 输出:1.2345679 - 类型不匹配:不兼容类型转换会导致编译或运行时错误。
示例:1
2String str = "abc";
int num = Integer.parseInt(str); // 抛出NumberFormatException
5. 为什么用BigDecimal而不是double?
double
可能出现精度丢失问题,尤其在涉及金钱计算时。
示例:
1 | System.out.println(0.05 + 0.01); // 输出:0.060000000000000005 |
使用BigDecimal
可以避免精度问题:
1 | BigDecimal num1 = new BigDecimal("0.1"); |
注意:
- 使用
BigDecimal
时,应通过字符串构造,避免浮点数精度丢失。 BigDecimal
提供了丰富的API(如add()
、subtract()
、multiply()
、divide()
),适合高精度计算。- 在涉及货币、金融等场景时,优先使用
BigDecimal
。
6. 装箱和拆箱是什么?
- 装箱(Boxing):基本类型转为包装类。
- 拆箱(Unboxing):包装类转为基本类型。
示例:
1 | Integer i = 10; // 自动装箱 |
注意:
- 在循环中频繁装箱/拆箱可能影响性能,建议使用基本类型。
- 装箱和拆箱是编译器的语法糖,底层通过
Integer.valueOf()
和intValue()
实现。
7. 为什么需要Integer?
- 对象封装:
Integer
提供了方法(如parseInt()
)处理int
相关数据。 - 集合支持:集合类(如
ArrayList
)只能存储对象,需使用Integer
。 - 泛型支持:泛型只能使用引用类型,需用
Integer
代替int
。 - 空值支持:
Integer
可以为null
,而int
不支持空值。
8. Integer相比int的优点
- 对象特性:
Integer
是引用类型,可用于集合、泛型等场景。 - 自动装箱/拆箱:简化基本类型与对象类型的转换。
- 方法支持:
Integer
提供了丰富的方法(如compareTo()
、toString()
等)。
9. 为什么保留int类型?
- 性能:
int
操作更高效,内存占用更小(4字节 vs.Integer
的16字节)。 - 直接存储:
int
变量直接存储数据,无需额外内存分配。 - 简单性:
int
适合高性能场景,如循环计数器、数学运算等。
10. Integer的缓存机制
Integer
类对-128
到127
范围内的值实现了缓存。
示例:
1 | Integer a = 127; |
超出范围时,不会复用缓存对象:
1 | Integer c = 128; |
原因:
- 缓存机制通过
Integer.valueOf()
方法实现。 - 缓存范围可通过
-XX:AutoBoxCacheMax=<size>
调整,默认范围为-128
到127
。 - 缓存机制提高了小范围整数的性能,但超出范围时会创建新对象。
Comment
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果