跳到主要内容Java 常用类速查:包装类、String、StringBuilder、Math、日期类 | 极客日志Javajava
Java 常用类速查:包装类、String、StringBuilder、Math、日期类
综述由AI生成Java 开发中常用的核心类库。涵盖包装类的概念、自动装箱拆箱及缓存机制;详细解析了 String 类的不可变性、内存分配及常用方法,对比了 StringBuffer 与 StringBuilder 的区别;讲解了 Math 类的数学运算功能;并梳理了从 Date、Calendar 到 JDK 8 LocalDateTime 的日期处理演变。适合 Java 初学者快速查阅与复习。
不羁40 浏览
常用类是 Java 开发中频繁使用的工具类,掌握这些类的使用方法和特点能够提高开发效率,编写更加规范的代码。
⚡ 快速参考
- 包装类:将基本类型封装成对象,支持自动装箱和拆箱
- String 类:不可变字符串,使用
+ 拼接会创建新对象
- StringBuffer:可变字符串,线程安全,适合多线程环境
- StringBuilder:可变字符串,线程不安全,性能更高,推荐使用
- Math 类:提供数学运算的静态方法
- 日期类:Date、Calendar、LocalDateTime(Java 8+)
📚 学习目标
- 理解包装类的概念和自动装箱拆箱机制
- 掌握 String 类的常用方法和不可变性
- 理解 String、StringBuffer、StringBuilder 的区别
- 掌握 Math 类的常用方法
- 掌握日期类的使用和格式化
一、常用类概述
1.1 什么是常用类?
常用类: Java 提供的一系列工具类,包括包装类、字符串类、数学类、日期类等,用于处理常见的编程任务。
核心类:
- 包装类:将基本类型封装成对象
- String 类:处理字符串
- StringBuffer/StringBuilder:处理可变字符串
- Math 类:数学运算
- 日期类:处理日期和时间
二、包装类
2.1 包装类的概念
包装类(Wrapper Class): 将基本数据类型封装成对象。
为什么需要包装类?
- 基本类型不是对象,无法调用方法
- 泛型不支持基本类型
- 需要 null 值表示"无"
2.2 八大包装类
| 基本类型 | 包装类 | 父类 |
|---|
| byte | Byte | Number |
| short | Short | Number |
| int | Integer | Number |
| long | Long | Number |
| float | Float | Number |
| double | Double | Number |
| char | Character | Object |
| boolean | Boolean | Object |
2.3 装箱和拆箱
装箱: 基本类型 → 包装类
拆箱: 包装类 → 基本类型
int n1 = 100;
Integer integer1 = new Integer(n1);
Integer integer2 = Integer.valueOf(n1);
int n2 = integer1.intValue();
int n1 = 100;
Integer integer = n1;
int n2 = integer;
2.4 包装类型转换
Integer i = 100;
String s1 = i + "";
String s2 = i.toString();
String s3 = String.valueOf(i);
String s = "123";
Integer i1 = Integer.parseInt(s);
Integer i2 = new Integer(s);
2.5 Integer 常用方法
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
Integer.parseInt("123");
Integer.valueOf("123");
Integer.toBinaryString(10);
Integer.toHexString(255);
2.6 Character 常用方法
Character.isDigit('5');
Character.isLetter('a');
Character.isUpperCase('A');
Character.isLowerCase('a');
Character.isWhitespace(' ');
Character.toUpperCase('a');
Character.toLowerCase('A');
2.7 包装类的缓存机制
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println(c == d);
System.out.println(c.equals(d));
三、String 类
3.1 String 的特点
- String 对象用于保存字符串(字符序列)
- 字符串使用 Unicode 编码,一个字符占 2 个字节
- String 是 final 类,不能被继承
- String 实现了 Serializable(可序列化)、Comparable(可比较)接口
- 底层是
char[] value(JDK 8)或 byte[] value(JDK 9+)
- String 是不可变的(value 数组是 final 的)
3.2 String 的创建方式
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2);
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s3 == s4);
栈 常量池 堆
s1 ────→ "hello"
s2 ────→ ↑
s3 ────────────────→ String 对象 ──→ "hello"
s4 ────────────────→ String 对象 ──→ "hello"
3.3 String 的拼接
- 常量相加:在常量池
- 变量相加:在堆中(通过 StringBuilder 实现)
String s1 = "hello" + "world";
String a = "hello";
String b = "world";
String s2 = a + b;
System.out.println(s1 == s2);
3.4 String 常用方法
String s = "Hello World";
s.equals("hello");
s.equalsIgnoreCase("hello");
s.isEmpty();
s.startsWith("He");
s.endsWith("ld");
s.contains("lo");
String s = "hello world";
s.length();
s.charAt(0);
s.indexOf('o');
s.lastIndexOf('o');
String s = "Hello World";
s.substring(6);
s.substring(0, 5);
String s = "Hello World";
s.toUpperCase();
s.toLowerCase();
s.trim();
s.replace('l', 'L');
s.replace("World", "Java");
String s = "apple,banana,orange";
String[] arr = s.split(",");
String s2 = "a|b|c";
String[] arr2 = s2.split("\\|");
String s = "hello";
char[] chars = s.toCharArray();
String name = "张三";
int age = 20;
double score = 95.5;
String info = String.format("姓名:%s,年龄:%d,成绩:%.2f", name, age, score);
System.out.println(info);
3.5 String 常见面试题
String s = new String("hello");
- 常量池中的'hello'
- 堆中的 String 对象
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
s1 == s2:true(指向同一个常量池对象)
s1 == s3:false(s3 在堆中)
s1.equals(s3):true(内容相同)
四、StringBuffer 类
4.1 StringBuffer 的特点
- 代表可变的字符序列
- 线程安全(方法加了 synchronized)
- 效率比 String 高(修改时不创建新对象)
- 底层:
char[] value(可变数组)
- 是 final 类,不能被继承
4.2 String vs StringBuffer
| 特性 | String | StringBuffer |
|---|
| 可变性 | 不可变 | 可变 |
| 线程安全 | 安全 | 安全 |
| 效率 | 低(频繁创建对象) | 高 |
| 使用场景 | 字符串不变 | 频繁修改 |
4.3 StringBuffer 的创建
StringBuffer sb1 = new StringBuffer();
StringBuffer sb2 = new StringBuffer(100);
StringBuffer sb3 = new StringBuffer("hello");
4.4 String 和 StringBuffer 的转换
String str = "hello";
StringBuffer sb1 = new StringBuffer(str);
StringBuffer sb2 = new StringBuffer();
sb2.append(str);
StringBuffer sb = new StringBuffer("hello");
String s1 = sb.toString();
String s2 = new String(sb);
4.5 StringBuffer 常用方法
StringBuffer sb = new StringBuffer("hello");
sb.append(" world");
sb.append(123);
sb.delete(5, 11);
sb.replace(0, 5, "hi");
int index = sb.indexOf("123");
sb.insert(2, "aaa");
int len = sb.length();
sb.reverse();
五、StringBuilder 类
5.1 StringBuilder 的特点
- 代表可变的字符序列
- 线程不安全(方法没有 synchronized)
- 效率最高
- 底层:
char[] value(可变数组)
- 与 StringBuffer 方法完全相同
5.2 三者对比
| 特性 | String | StringBuffer | StringBuilder |
|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 线程安全 | 安全 | 安全 | 不安全 |
| 效率 | 低 | 较高 | 最高 |
| 使用场景 | 少量修改 | 多线程频繁修改 | 单线程频繁修改 |
long start = System.currentTimeMillis();
String s = "";
for (int i = 0; i < 100000; i++) {
s += i;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 100000; i++) {
sb.append(i);
}
StringBuilder sbd = new StringBuilder();
for (int i = 0; i < 100000; i++) {
sbd.append(i);
}
long end = System.currentTimeMillis();
效率: StringBuilder > StringBuffer > String
5.3 使用原则
- 字符串很少修改 → String
- 单线程大量修改 → StringBuilder(推荐)
- 多线程大量修改 → StringBuffer
六、Math 类
6.1 Math 常用方法
Math.abs(-10);
Math.pow(2, 3);
Math.sqrt(16);
Math.ceil(3.1);
Math.floor(3.9);
Math.round(3.5);
Math.round(3.4);
Math.random();
Math.max(10, 20);
Math.min(10, 20);
Math.PI;
Math.E;
6.2 生成随机数
int num = (int)(Math.random() * 11) + 10;
七、日期类
7.1 Date 类(第一代)
import java.util.Date;
import java.text.SimpleDateFormat;
Date date = new Date();
System.out.println(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
System.out.println(dateStr);
String str = "2025-01-18 18:30:00";
Date date2 = sdf.parse(str);
7.2 Calendar 类(第二代)
import java.util.Calendar;
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
cal.set(2025, 0, 18);
cal.add(Calendar.DAY_OF_MONTH, 10);
7.3 LocalDateTime 类(第三代,JDK 8+,推荐)
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateStr = now.format(dtf);
System.out.println(dateStr);
String str = "2025-01-18 18:30:00";
LocalDateTime ldt = LocalDateTime.parse(str, dtf);
LocalDateTime future = now.plusDays(10);
LocalDateTime past = now.minusMonths(2);
八、面试常见问题
Q1: String 为什么设计成不可变的?
- 安全性:String 常用于网络传输、文件路径、参数传递
- 线程安全:不可变对象天然线程安全
- 常量池优化:可以复用对象,节省内存
- hashCode 缓存:不可变,hashCode 只需计算一次
Q2: String、StringBuffer、StringBuilder 的区别?
| 特性 | String | StringBuffer | StringBuilder |
|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 线程安全 | 安全 | 安全 | 不安全 |
| 效率 | 低 | 较高 | 最高 |
- 少量修改 → String
- 单线程频繁修改 → StringBuilder
- 多线程频繁修改 → StringBuffer
Q3: == 和 equals() 对于 String 的区别?
==:比较引用(地址)
equals():比较内容
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
s1 == s2;
s1 == s3;
s1.equals(s3);
Q4: String s = new String('hello') 创建了几个对象?
- 常量池中的'hello'
- 堆中的 String 对象
Q5: String 的 intern() 方法的作用?
intern() 方法会在常量池中查找是否有相同内容的字符串:
- 如果有,返回常量池中的引用
- 如果没有,将字符串添加到常量池,并返回引用
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2);
System.out.println(s1 == s2.intern());
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online