目录
Float、Double 类型的区别
在 Java 中,float
和 double
都是用于表示浮点数的数据类型,但它们之间有一些关键区别。double
是 双精度浮点数,而 float
是 单精度浮点数。
1. 内存占用
float
:占用 4 字节(32 位) 内存。double
:占用 8 字节(64 位) 内存。
2. 精度
float
:精度较低,有效精度为约 6到7位小数。double
:精度较高,有效精度为约 15到16位小数。
因此,double
可以表示的数值更精确,适合于需要高精度的计算。
3. 表示范围
float
:数值范围大约是 ±3.4×1038\pm 3.4 \times 10^{38}±3.4×1038。double
:数值范围大约是 ±1.7×10308\pm 1.7 \times 10^{308}±1.7×10308。
double
能表示的数值范围更广,适合用于更大的数值运算。
4. 默认浮点类型
- 在 Java 中,
double
是默认的浮点类型。如果不在浮点字面量后面加上f
或F
,编译器会默认将其解释为double
类型。
float myFloat = 3.14f; // 必须加 'f',否则会报错
double myDouble = 3.14; // 可以不加 'd',默认是 double
5. 计算速度
float
:因为占用的内存较小,计算速度通常比double
快,特别是在一些对计算效率有严格要求的场景(如图形渲染、游戏开发等)中。double
:由于精度高且占用内存大,计算速度相对较慢,但在现代计算机上差异不明显,因此通常推荐使用double
,除非明确要求使用float
。
6. 使用场景
float
:适用于对内存要求较高且精度要求不高的场景,例如图形处理或游戏编程中的坐标计算。double
:适合需要高精度的科学计算、财务计算和一般的浮点数运算,广泛用于大多数浮点运算场景。
7. 示例代码
public class Main {
public static void main(String[] args) {
float floatNumber = 3.1415927f; // 约7位有效数字
double doubleNumber = 3.141592653589793; // 约15位有效数字
System.out.println("Float value: " + floatNumber); // 输出: 3.1415927
System.out.println("Double value: " + doubleNumber); // 输出: 3.141592653589793
}
}
总结
特性 | float | double |
---|---|---|
内存占用 | 4 字节 | 8 字节 |
精度 | 约 6-7 位有效小数 | 约 15-16 位有效小数 |
数值范围 | ±3.4×1038\pm 3.4 \times 10^{38}±3.4×1038 | ±1.7×10308\pm 1.7 \times 10^{308}±1.7×10308 |
默认浮点类型 | 否 | 是 |
使用场景 | 内存优化、图形处理 | 一般数值运算、高精度计算 |
一般来说,在 Java 中如果不明确要求使用 float
,推荐使用 double
以获得更高的精度。
基础数据类型范围、默认值
Java 中的基础数据类型(也称为原始数据类型)共有 8 种,每种类型有不同的存储范围和默认值。下面是详细介绍:
数据类型 | 位数 | 字节数 | 范围 | 默认值 |
---|---|---|---|---|
byte | 8 | 1 | -128 到 127 | 0 |
short | 16 | 2 | -32,768 到 32,767 | 0 |
int | 32 | 4 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64 | 8 | -2^63 到 2^63 - 1 | 0L |
float | 32 | 4 | ±3.40282347E+38F (约 7 位小数) | 0.0f |
double | 64 | 8 | ±1.79769313486231570E+308 (约 15 位小数) | 0.0d |
char | 16 | 2 | 0 到 65,535 (Unicode 字符) | \u0000 |
boolean | 1 (逻辑) | (未规定) | true 或 false | false |
switch
语句支持以下数据类型作为条件表达式
数据类型 | 支持情况 |
---|---|
byte , short , int , char | 支持 |
String | 支持(Java 7 及以上) |
enum | 支持 |
包装类 Byte , Short , Integer , Character | 支持 |
boolean , long , float , double | 不支持 |
方法重载、重写
- 重载发生在一个类中,相同的方法名,参数的类型、顺序、数量不同,重载跟返回值无关
- 重写发生在子类父类之间,子类重写了父类的同一个方法
特性 | 方法重载(Overloading) | 方法重写(Overriding) |
---|---|---|
发生的地方 | 同一个类内 | 子类重写父类方法 |
方法签名 | 方法名相同,参数不同(数量、类型、顺序) | 方法名和参数列表相同 |
访问权限 | 可修改(无特别限制) | 子类方法访问权限不能低于父类方法 |
返回类型 | 可以不同,但返回类型通常不能作为区分重载的条件 | 返回类型可以是父类类型的子类(协变返回类型) |
抛出异常 | 可以不一样 | 子类方法可以抛出父类方法未抛出的异常 |
调用时机 | 编译时确定(静态绑定) | 运行时确定(动态绑定) |