一、Java变量类型及底层原理
1.1 变量在内存中的存吃
1.1.1 栈内存
方法内部声明的变量存储在栈内存中(包括方法参数)
特征:
- 线程私有,生命周期与方法调用相同
- 存储基本数据类型和对象引用(不是对象本身)
- 后进先出,分配和释放速度快
1.1.2 堆内存
new创建的对象实例存储在堆内存中
特征
- 线程共享,生命周期由垃圾回收器管理
- 存储对象实际数据和数组
- 分配和释放速度较慢
1.2 方法区
静态变量:static修饰的变量存储在方法区(Java 8后称为元空间)
特点:
- 线程共享
- 存储类级别的信息,包括静态变量、常量池等
二、基本数据类型
| 数据类型 | 大小(位) | 默认值 | 底层表示 |
|---|---|---|---|
| byte | 8 | 0 | 有符号整数 |
| short | 16 | 0 | 有符号整数 |
| int | 32 | 0 | 有符号整数 |
| long | 64 | 0L | 有符号整数 |
| float | 32 | 0.0f | IEEE 754浮点数 |
| double | 64 | 0.0d | IEEE 754浮点数 |
| char | 16 | '\u0000' | Unicode字符 |
| boolean | JVM实现相关 | false | 通常用1位或1字节表示 |
三、基本数据类型的转换
3.1 自动转换(隐式转换)
小类型->大类型,编译器会自动转换,无需手动操作
byte → short → int → long → float → double
char → int
注意: 之所以chat能向int类型转换,是因为将char类型数据转化对应的ASCII码值
3.2强制转化(显示转换)
大类型->小类型,必须强转,否则会编译错误
目标类型 变量名 = (目标类型) 源变量;
// 示例
long b = 1;
int a = (int) b;
注意事项:
- 强制转换可能导致数据精度丢失或溢出
- 转换前应确保数据在目标类型的范围内
3.3基本数据类型与包装类之间的转换
Java 5引入了自动装箱(Autoboxing)和自动拆箱(Unboxing)机制,简化了基本类型与包装类之间的转换。
1. 自动装箱(基本类型 → 包装类)
java
Integer num = 10; // 自动装箱,相当于Integer num = Integer.valueOf(10);
Double d = 3.14; // 自动装箱
2. 自动拆箱(包装类 → 基本类型)
java
Integer num = 10;
int i = num; // 自动拆箱,相当于int i = num.intValue();
Double d = 3.14;
double value = d; // 自动拆箱
3. 底层原理
java
// 基本类型 → 包装类
int primitiveInt = 20;
Integer wrappedInt = Integer.valueOf(primitiveInt); // 或 new Integer(primitiveInt)
// 包装类 → 基本类型
Integer wrappedInt = 30;
int primitiveInt = wrappedInt.intValue();
3.1字符串与其他类型的转换
1. 基本类型 -> 字符串
方法1:基本数据类型:使用String.valueOf()
java
int i = 10;
String str = String.valueOf(i);
方法2:包装类:使用包装类的toString()
java
Integer num = 20;
String str = num.toString();
2.字符串 -> 基本类型
使用包装类的parseXxx()方法:
java
String str = "123";
int i = Integer.parseInt(str);
double d = Double.parseDouble("3.14");
boolean b = Boolean.parseBoolean("true");
long l = Long.parseLong("1000L");
若类型转换错误,会抛出NumberFormatException异常,要注意捕获异常,进行处理