一、数据类型概述
在 Java
中,数据类型分为两大类:
- 基本数据类型(Primitive Types)
- 引用数据类型(Reference Types)
mermaid
graph TD
A[Java数据类型] --> B[基本数据类型]
A --> C[引用数据类型]
B --> D[数值型]
B --> E[字符型]
B --> F[布尔型]
D --> G[整数类型]
D --> H[浮点类型]
G --> I[byte,short,int,long]
H --> J[float,double]
C --> K[类]
C --> L[接口]
C --> M[数组]
二、基本数据类型
1. 整数类型
类型 | 大小 | 范围 | 默认值 | 示例 |
---|---|---|---|---|
byte | 8位 | -128 ~ 127 | 0 | byte b = 100; |
short | 16位 | -32768 ~ 32767 | 0 | short s = 1000; |
int | 32位 | -2^31 ~ 2^31-1 | 0 | int i = 100000; |
long | 64位 | -2^63 ~ 2^63-1 | 0L | long l = 10000000000L; |
2. 浮点类型
类型 | 大小 | 范围 | 默认值 | 示例 |
---|---|---|---|---|
float | 32位 | 约 ±3.4E+38 | 0.0f | float f = 3.14f; |
double | 64位 | 约 ±1.7E+308 | 0.0d | double d = 3.1415926; |
3. 字符类型
类型 | 大小 | 范围 | 默认值 | 示例 |
---|---|---|---|---|
char | 16位 | 0 ~ 65535 | '\u0000' | char c = 'A'; |
4. 布尔类型
类型 | 大小 | 范围 | 默认值 | 示例 |
---|---|---|---|---|
boolean | 1位 | true/false | false | boolean flag = true; |
三、引用数据类型
1. 类(Class)
java
// 示例:自定义类
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter和setter方法
}
2. 字符串(String)
String
是 Java 中最常用的引用类型之一,用于表示文本字符串。虽然它看起来像基本类型,但实际上是一个类。
2.1 String 的特点
不可变性
String
对象一旦创建就不能被修改- 所有看似修改字符串的操作都会创建新的
String
对象
字符串池(String Pool)
- Java 使用字符串池来优化字符串存储
- 相同的字符串字面量会共享同一个对象
java
// 示例:String 创建方式
String str1 = "Hello"; // 使用字符串字面量
String str2 = new String("Hello"); // 使用构造函数
String str3 = str1 + " World"; // 字符串拼接
2.2 String 常用方法
java
// 示例:String 常用方法
String str = "Hello World";
// 获取长度
int length = str.length(); // 11
// 获取子字符串
String sub = str.substring(0, 5); // "Hello"
// 查找字符
int index = str.indexOf('o'); // 4
// 字符串比较
boolean equals = str.equals("Hello World"); // true
boolean ignoreCase = str.equalsIgnoreCase("hello world"); // true
// 字符串转换
String upper = str.toUpperCase(); // "HELLO WORLD"
String lower = str.toLowerCase(); // "hello world"
// 去除空格
String trim = " Hello ".trim(); // "Hello"
2.3 StringBuilder 和 StringBuffer
由于 String
的不可变性,频繁的字符串操作会产生大量临时对象。这时可以使用 StringBuilder
或 StringBuffer
:
java
// 示例:StringBuilder 使用
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
// StringBuffer 使用方式相同,但线程安全
StringBuffer sbf = new StringBuffer();
sbf.append("Hello");
sbf.append(" ");
sbf.append("World");
String result2 = sbf.toString(); // "Hello World"
2.4 String 与 char[] 的转换
java
// String 转 char[]
String str = "Hello";
char[] chars = str.toCharArray();
// char[] 转 String
char[] chars2 = {'H', 'e', 'l', 'l', 'o'};
String str2 = new String(chars2);
3. 接口(Interface)
java
// 示例:接口定义
public interface Animal {
void eat();
void sleep();
}
4. 数组(Array)
java
// 示例:数组声明和初始化
int[] numbers = new int[5]; // 声明长度为5的整型数组
String[] names = {"Alice", "Bob", "Charlie"}; // 声明并初始化字符串数组
四、类型转换
1. 自动类型转换(隐式转换)
java
// 示例:自动类型转换
int i = 100;
long l = i; // 自动将int转换为long
float f = l; // 自动将long转换为float
2. 强制类型转换(显式转换)
java
// 示例:强制类型转换
double d = 3.14;
int i = (int)d; // 强制将double转换为int,结果为3
3. 类型转换规则
小类型转大类型:自动转换
byte
→short
→int
→long
→float
→double
char
→int
→long
→float
→double
大类型转小类型:需要强制转换
- 可能造成精度损失
- 可能造成数据溢出
五、包装类(Wrapper Classes)
基本类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
自动装箱和拆箱
java
// 自动装箱: Java自动将基本数据类型 int 的值 100 转换为对应的包装类 Integer 对象。
Integer i = 100;
// 自动拆箱: Java自动将 Integer 对象 i 转换为基本数据类型 int。
int j = i;
TIP
自动装箱:像把一件商品(基本类型)自动放进盒子(包装类对象)里。
自动拆箱:自动拆箱:像从盒子里直接取出商品,丢掉盒子。
六、特殊值
1. 空值(null)
- 只能赋值给引用类型
- 不能赋值给基本类型
2. 默认值
- 基本类型:0或false
- 引用类型:null
七、关键字
Java
关键字是 Java
语言中具有特殊含义的保留字,不能用作标识符(如变量名、类名等)。
Java
关键字可以分为以下几类:
1. 访问控制关键字
关键字 | 说明 |
---|---|
public | 公共访问权限,所有类都可以访问 |
protected | 受保护的访问权限,同一包内或子类可以访问 |
private | 私有访问权限,只有本类可以访问 |
default | 默认访问权限,同一包内可以访问 |
2. 类、方法和变量修饰符
关键字 | 说明 |
---|---|
class | 声明类 |
interface | 声明接口 |
enum | 声明枚举类型 |
abstract | 声明抽象类或方法 |
final | 声明不可继承的类、不可重写的方法或常量 |
static | 声明静态成员 |
synchronized | 声明同步方法或代码块 |
volatile | 声明易变变量 |
transient | 声明不需要序列化的字段 |
native | 声明本地方法 |
3. 程序控制关键字
关键字 | 说明 |
---|---|
if | 条件语句 |
else | 条件语句的否定分支 |
switch | 多分支选择语句 |
case | switch语句的分支 |
default | switch语句的默认分支 |
while | 循环语句 |
do | 循环语句 |
for | 循环语句 |
break | 跳出循环或switch |
continue | 继续下一次循环 |
return | 从方法返回 |
4. 异常处理关键字
关键字 | 说明 |
---|---|
try | 捕获异常 |
catch | 处理异常 |
finally | 无论是否发生异常都会执行的代码块 |
throw | 抛出异常 |
throws | 声明方法可能抛出的异常 |
5. 包相关关键字
关键字 | 说明 |
---|---|
package | 声明包 |
import | 导入包 |
6. 基本类型关键字
关键字 | 说明 |
---|---|
boolean | 布尔类型 |
byte | 字节类型 |
char | 字符类型 |
double | 双精度浮点类型 |
float | 单精度浮点类型 |
int | 整型 |
long | 长整型 |
short | 短整型 |
7. 变量引用关键字
关键字 | 说明 |
---|---|
super | 引用父类 |
this | 引用当前对象 |
void | 表示方法不返回值 |
null | 空引用 |
8. 保留关键字
关键字 | 说明 |
---|---|
const | 保留关键字,未使用 |
goto | 保留关键字,未使用 |
关键字使用注意事项
- 关键字不能用作标识符(如变量名、类名等)
- 关键字都是小写的
- 关键字不能修改其含义
- 某些关键字(如
const
和goto
)虽然保留但未使用
八、注意事项
选择合适的数据类型
- 考虑数据范围
- 考虑内存占用
- 考虑性能影响
类型转换注意事项
- 避免不必要的类型转换
- 注意精度损失
- 注意数据溢出
包装类使用建议
- 优先使用基本类型
- 需要对象特性时使用包装类
- 注意自动装箱拆箱的性能影响