Java 常用类速查 Demo
按 JDK 内置 + 第三方两大维度,覆盖日常开发高频类与其常用方法。每个类附独立可运行 Demo,方法后用 // → 标注返回值或效果。
一、基础数据类型相关
1. String
用途:所有文本处理场景——字段拼接、日志、参数校验、JSON 字符串操作。
String s = "Hello,World";
s.length(); // → 11
s.charAt(0); // → 'H'
s.indexOf(","); // → 5
s.substring(6); // → "World"
s.substring(0, 5); // → "Hello"
s.split(","); // → ["Hello", "World"]
s.replace(",", "-"); // → "Hello-World"
s.toUpperCase(); // → "HELLO,WORLD"
s.trim(); // → 去首尾空格
s.contains("World"); // → true
s.startsWith("He"); // → true
s.equals("Hello,World"); // → true(比较内容,禁用 ==)
s.equalsIgnoreCase("hello,world"); // → true
String.format("id=%d", 5); // → "id=5"
String.join("-", "a", "b"); // → "a-b"
s.isEmpty(); // → false
s.isBlank(); // → false(Java 11+,判全空白)
2. StringBuilder
用途:循环内字符串拼接、动态构造 SQL/JSON 文本,避免 + 产生大量临时对象。
StringBuilder sb = new StringBuilder();
sb.append("a").append(1).append(true); // → "a1true"
sb.insert(0, ">>"); // → ">>a1true"
sb.delete(0, 2); // → "a1true"
sb.reverse(); // → "eurt1a"
sb.length(); // → 6
sb.toString(); // → 转为 String
3. StringBuffer
用途:多线程下需要可变字符串时(实际开发极少用,单线程一律用 StringBuilder)。API 与 StringBuilder 完全一致,方法加了 synchronized。
4. Integer / Long / Double / Boolean
用途:集合元素(List/Map 不能存基本类型)、字符串与数字互转、null 表示无值。
Integer.parseInt("123"); // → 123
Integer.valueOf("123"); // → Integer 对象
Integer.toString(123); // → "123"
Integer.toBinaryString(10); // → "1010"
Integer.max(1, 2); // → 2
Integer.MAX_VALUE; // → 2147483647
Long.parseLong("123456789012"); // → long
Double.parseDouble("3.14"); // → 3.14
Boolean.parseBoolean("true"); // → true
5. BigDecimal
用途:金额、利率、税费等任何不能丢精度的小数计算。禁止用 double 表示金额。
BigDecimal a = new BigDecimal("0.1"); // 字符串构造
BigDecimal b = new BigDecimal("0.2");
a.add(b); // → 0.3
a.subtract(b); // → -0.1
a.multiply(b); // → 0.02
a.divide(b, 2, RoundingMode.HALF_UP); // → 0.50(必须指定精度和舍入)
a.compareTo(b); // → -1(不要用 equals,0.1 ≠ 0.10)
a.setScale(2, RoundingMode.HALF_UP); // → 0.10
BigDecimal.ZERO; BigDecimal.ONE; // 常量
6. BigInteger
用途:超过 long 范围的整数运算(加密、大数阶乘、雪花 ID 等)。
BigInteger x = new BigInteger("999999999999999999999");
x.add(BigInteger.ONE);
x.multiply(BigInteger.TEN);
x.mod(BigInteger.valueOf(7)); // → 取模
x.pow(3); // → 立方
二、集合框架
1. ArrayList
用途:90% 的列表场景——查询数据返回、遍历、按索引访问。
List<String> list = new ArrayList<>();
list.add("a"); // 尾部添加
list.add(0, "b"); // 指定位置插入
list.get(0); // → "b"
list.set(0, "c"); // 替换
list.remove(0); // 按索引删
list.remove("a"); // 按值删
list.size(); // → 元素数量
list.contains("a"); // → 是否包含
list.indexOf("a"); // → 索引,找不到返回 -1
list.isEmpty();
list.clear();
List.of("a", "b", "c"); // → 不可变 List(Java 9+)
2. LinkedList
用途:频繁在头尾增删(队列、栈),或当作 Deque 使用。
LinkedList<String> ll = new LinkedList<>();
ll.addFirst("a"); ll.addLast("b");
ll.getFirst(); ll.getLast();
ll.removeFirst(); ll.removeLast();
ll.push("x"); ll.pop(); // 栈
ll.offer("y"); ll.poll(); // 队列
3. HashMap
用途:键值映射首选——缓存、分组统计、配置项、ID 映射对象。
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.get("a"); // → 1
map.getOrDefault("x", 0); // → 0
map.containsKey("a"); // → true
map.remove("a");
map.size();
map.keySet(); // → Set<String>
map.values(); // → Collection<Integer>
map.entrySet(); // → Set<Entry>,遍历用
map.putIfAbsent("a", 1); // 不存在才放
map.merge("a", 1, Integer::sum);// 计数神器:存在则累加
map.computeIfAbsent("k", k -> new ArrayList<>()).add("v"); // 一对多
map.forEach((k, v) -> {});
Map.of("a", 1, "b", 2); // 不可变 Map(Java 9+)
4. LinkedHashMap
用途:需要保持插入顺序(如导出 Excel 的列顺序),或实现 LRU 缓存(accessOrder=true)。
Map<String, Integer> m = new LinkedHashMap<>(); // 用法同 HashMap
// LRU 缓存:
new LinkedHashMap<K,V>(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry e) { return size() > 100; }
};
5. TreeMap
用途:需要 key 自动排序(按时间、按字典序),或范围查询。
TreeMap<String, Integer> tm = new TreeMap<>();
tm.put("b", 2); tm.put("a", 1);
tm.firstKey(); // → "a"
tm.lastKey(); // → "b"
tm.floorKey("ab"); // → "a"(≤ 给定值的最大 key)
tm.ceilingKey("ab"); // → "b"
tm.subMap("a", "c"); // → 范围视图
6. ConcurrentHashMap
用途:多线程共享的 Map(缓存、计数器、注册中心)。绝不用 HashMap 在多线程下。
ConcurrentHashMap<String, Integer> cm = new ConcurrentHashMap<>();
cm.put("a", 1);
cm.computeIfAbsent("k", k -> 0);
cm.merge("counter", 1, Integer::sum); // 线程安全计数
7. HashSet / TreeSet
用途:去重(HashSet)、排序去重(TreeSet)。
Set<String> set = new HashSet<>();
set.add("a"); set.add("a"); // 重复无效
set.contains("a"); // → true
set.remove("a"); set.size();
Set.of("a", "b"); // 不可变 Set
new TreeSet<>(list); // → 自动排序去重
8. Queue / Deque / ArrayDeque
用途:BFS、任务队列、撤销栈、滑动窗口。ArrayDeque 是 Stack 和 LinkedList 队列的更快替代。
Deque<Integer> dq = new ArrayDeque<>();
dq.offer(1); dq.poll(); // 队列:尾入头出
dq.push(1); dq.pop(); // 栈:头入头出
dq.peek(); // 看头部,不移除
9. Collections
用途:对集合排序、查找、反转、不可变包装。
Collections.sort(list);
Collections.sort(list, Comparator.reverseOrder());
Collections.reverse(list);
Collections.shuffle(list);
Collections.max(list);
Collections.min(list);
Collections.frequency(list, "a"); // → 出现次数
Collections.unmodifiableList(list); // 不可变包装
Collections.emptyList();
10. Arrays
用途:数组排序、转 List、复制、填充、调试打印。
int[] arr = {3, 1, 2};
Arrays.sort(arr);
Arrays.toString(arr); // → "[1, 2, 3]"
Arrays.asList("a", "b"); // → List(注意:底层定长,不能 add)
Arrays.copyOf(arr, 5); // 扩容/截断
Arrays.copyOfRange(arr, 1, 3);
Arrays.fill(arr, 0);
Arrays.equals(arr1, arr2);
Arrays.stream(arr); // → IntStream
三、IO / NIO
1. File
用途:判断文件存在、创建/删除、列目录、获取文件信息。
File f = new File("a.txt");
f.exists(); f.isFile(); f.isDirectory();
f.length(); // → 字节数
f.getName(); f.getAbsolutePath(); f.getParent();
f.createNewFile(); f.mkdirs(); // 创建文件/多级目录
f.delete(); f.renameTo(new File("b.txt"));
f.listFiles(); // → File[]
2. FileInputStream / FileOutputStream
用途:读写二进制文件(图片、视频)。文本文件优先用字符流。
try (FileInputStream in = new FileInputStream("a.bin")) {
byte[] buf = new byte[1024];
int len = in.read(buf);
}
try (FileOutputStream out = new FileOutputStream("a.bin")) {
out.write(new byte[]{1, 2, 3});
}
3. BufferedReader / BufferedWriter
用途:按行读写文本文件、读取大文件。
try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) {
String line;
while ((line = br.readLine()) != null) { /* ... */ }
}
try (BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"))) {
bw.write("hello"); bw.newLine();
}
4. Files / Paths(NIO,强烈推荐)
用途:一行代码读写文件、复制、移动、遍历目录——替代繁琐的 IO 流。
Path p = Paths.get("a.txt");
Files.exists(p);
Files.readString(p); // → 整个文件内容(Java 11+)
Files.readAllLines(p); // → List<String>
Files.writeString(p, "hello"); // 一行写入
Files.write(p, list); // 写入行列表
Files.copy(src, dest);
Files.move(src, dest);
Files.delete(p);
Files.createDirectories(Paths.get("a/b/c"));
Files.walk(Paths.get(".")).forEach(System.out::println);
Files.size(p);
5. Scanner
用途:命令行交互、读取标准输入。生产环境基本不用。
Scanner sc = new Scanner(System.in);
sc.nextLine(); sc.nextInt();
sc.hasNext();
四、并发编程
1. Thread / Runnable
用途:起一个独立执行线程(实际项目优先用线程池)。
new Thread(() -> System.out.println("run")).start();
Thread.sleep(1000);
Thread.currentThread().getName();
Thread.currentThread().interrupt();
2. ExecutorService / Executors
用途:所有需要异步执行任务的场景——HTTP 异步处理、批量调用、定时任务。
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.execute(() -> {}); // 无返回
Future<Integer> f = pool.submit(() -> 1); // 有返回
f.get(); // 阻塞拿结果
f.cancel(true);
pool.shutdown(); // 优雅关闭
pool.shutdownNow(); // 强制关闭
// 实际生产用 ThreadPoolExecutor 显式指定参数:
new ThreadPoolExecutor(4, 8, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100));
3. CompletableFuture
用途:异步编排、并行调用多个接口后聚合结果。
CompletableFuture.supplyAsync(() -> "hi")
.thenApply(s -> s + "!")
.thenAccept(System.out::println)
.exceptionally(e -> null);
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "A");
CompletableFuture<String> b = CompletableFuture.supplyAsync(() -> "B");
CompletableFuture.allOf(a, b).join(); // 等全部完成
a.thenCombine(b, (x, y) -> x + y); // 合并两个结果
4. CountDownLatch / CyclicBarrier / Semaphore
用途:主线程等待 N 个子任务完成(CountDownLatch)、限流(Semaphore)、批量同步(CyclicBarrier)。
CountDownLatch latch = new CountDownLatch(3);
// 子线程:latch.countDown();
latch.await(); // 主线程阻塞至归零
Semaphore sem = new Semaphore(5); // 限制 5 个并发
sem.acquire(); /* 业务 */ sem.release();
5. ReentrantLock
用途:需要 tryLock、可中断、公平锁等 synchronized 不支持的场景。
ReentrantLock lock = new ReentrantLock();
lock.lock();
try { /* ... */ } finally { lock.unlock(); }
lock.tryLock(1, TimeUnit.SECONDS);
6. AtomicInteger / AtomicLong
用途:无锁计数器(PV、UV、限流计数)。
AtomicInteger ai = new AtomicInteger(0);
ai.incrementAndGet(); // → 1,原子 ++i
ai.getAndIncrement(); // → 0,原子 i++
ai.addAndGet(5);
ai.compareAndSet(6, 100); // CAS
ai.get();
五、日期时间(Java 8+)
1. LocalDate
用途:只表示日期(生日、订单日期),不含时分秒。
LocalDate d = LocalDate.now(); // → 2026-05-24
LocalDate.of(2026, 1, 1);
LocalDate.parse("2026-01-01");
d.plusDays(7); d.minusMonths(1); d.plusYears(1);
d.getYear(); d.getMonthValue(); d.getDayOfWeek();
d.isAfter(other); d.isBefore(other);
d.withDayOfMonth(1); // → 当月第一天
2. LocalTime / LocalDateTime
用途:时分秒 / 完整日期时间。日志、订单时间、定时任务。
LocalDateTime dt = LocalDateTime.now();
LocalDateTime.of(2026, 1, 1, 12, 0);
dt.plusHours(2); dt.minusMinutes(30);
dt.toLocalDate(); dt.toLocalTime();
3. Instant
用途:时间戳(数据库存储、跨时区通信)。
Instant.now(); // → 当前 UTC 时间戳
Instant.ofEpochMilli(1700000000000L);
instant.toEpochMilli(); // → 毫秒
4. Duration / Period
用途:计算时间差。Duration 用于秒/纳秒,Period 用于年/月/日。
Duration.between(t1, t2).toMillis();
Duration.ofSeconds(30);
Period.between(birthday, today).getYears(); // → 年龄
5. DateTimeFormatter
用途:日期与字符串互转。线程安全(替代 SimpleDateFormat)。
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
dt.format(f); // → "2026-05-24 12:00:00"
LocalDateTime.parse("2026-05-24 12:00:00", f);
DateTimeFormatter.ISO_LOCAL_DATE_TIME; // 内置常量
6. Date / SimpleDateFormat
用途:老 API,线程不安全。新代码请用 LocalDateTime + DateTimeFormatter。仅在维护旧代码时接触。
六、函数式 & 流(Java 8+)
1. Stream
用途:集合的链式处理——过滤、映射、聚合、分组。日常开发出现频率极高。
list.stream()
.filter(s -> s.length() > 2)
.map(String::toUpperCase)
.sorted()
.distinct()
.limit(10)
.skip(2)
.collect(Collectors.toList());
list.stream().count();
list.stream().anyMatch(s -> s.startsWith("a"));
list.stream().allMatch(...); list.stream().noneMatch(...);
list.stream().findFirst(); // → Optional
list.stream().reduce(0, Integer::sum); // → 求和
list.stream().mapToInt(String::length).sum();
// 收集器
.collect(Collectors.toSet());
.collect(Collectors.toMap(User::getId, u -> u));
.collect(Collectors.groupingBy(User::getDept)); // 分组
.collect(Collectors.partitioningBy(u -> u.age>18)); // 二分
.collect(Collectors.joining(",")); // 拼字符串
2. Optional
用途:方法返回值可能为空时,强制调用方处理 null。
Optional<User> opt = Optional.ofNullable(user);
opt.isPresent(); opt.isEmpty();
opt.get(); // 不推荐,可能抛异常
opt.orElse(defaultUser);
opt.orElseGet(() -> loadDefault());
opt.orElseThrow(() -> new NotFoundException());
opt.ifPresent(u -> System.out.println(u));
opt.map(User::getName).orElse("匿名");
3. Function / Predicate / Consumer / Supplier
用途:lambda 的类型容器,写 API 时作为参数类型。
Function<String, Integer> len = String::length; // 输入到输出
Predicate<String> notEmpty = s -> !s.isEmpty(); // 输入到 boolean
Consumer<String> print = System.out::println; // 输入到无返回
Supplier<String> get = () -> "hi"; // 无输入到输出
BiFunction<Integer, Integer, Integer> add = Integer::sum;
七、反射与工具
1. Class / Method / Field
用途:框架核心(Spring、MyBatis)、动态调用、注解扫描。业务代码偶尔用于通用工具。
Class<?> c = User.class; // 或 Class.forName("com.x.User")
c.getName(); c.getSimpleName();
c.getDeclaredFields(); // 所有字段(含 private)
c.getDeclaredMethods();
Field f = c.getDeclaredField("name");
f.setAccessible(true);
f.get(userObj); f.set(userObj, "x");
Method m = c.getMethod("getName");
m.invoke(userObj);
c.getAnnotation(Deprecated.class);
2. Objects
用途:null 安全的 equals、hashCode、参数校验。
Objects.equals(a, b); // a/b 都可能为 null
Objects.hash(a, b, c); // 生成 hashCode
Objects.requireNonNull(arg, "arg 不能为空"); // 参数校验
Objects.isNull(x); Objects.nonNull(x);
Objects.toString(obj, "default");
3. Math
用途:数学运算——金额计算、随机算法、几何。
Math.max(a, b); Math.min(a, b);
Math.abs(-5); // → 5
Math.ceil(1.2); Math.floor(1.8); Math.round(1.5);
Math.pow(2, 10); // → 1024
Math.sqrt(16); // → 4.0
Math.random(); // → [0,1)
Math.PI; Math.E;
4. Random / ThreadLocalRandom
用途:生成随机数。多线程下用 ThreadLocalRandom 避免争用。
Random r = new Random();
r.nextInt(100); // → [0, 100)
r.nextDouble(); r.nextBoolean();
ThreadLocalRandom.current().nextInt(1, 10); // → [1, 10)
5. UUID
用途:生成唯一 ID——文件名、请求 ID、临时 token。
UUID.randomUUID().toString(); // → "550e8400-e29b-..."
UUID.randomUUID().toString().replace("-", "");
6. System
用途:读环境变量、JVM 参数、当前时间、退出程序。
System.currentTimeMillis(); // → 毫秒时间戳
System.nanoTime(); // → 纳秒(计时用)
System.getProperty("user.dir"); // JVM 属性
System.getenv("PATH"); // 环境变量
System.lineSeparator(); // 平台换行符
System.exit(0);
System.arraycopy(src, 0, dest, 0, len); // 高效数组复制
八、异常类
常见异常一览
// 运行时异常(不强制 try-catch)
throw new NullPointerException("user 为空");
throw new IllegalArgumentException("id 必须 > 0");
throw new IllegalStateException("订单已支付,不能取消");
throw new IndexOutOfBoundsException();
throw new ClassCastException();
throw new NumberFormatException();
throw new UnsupportedOperationException();
throw new ArithmeticException("除零");
// 受检异常(必须处理)
throw new IOException("文件读取失败");
throw new SQLException();
throw new InterruptedException();
// 自定义异常
public class BizException extends RuntimeException {
private final int code;
public BizException(int code, String msg) { super(msg); this.code = code; }
}
try-catch-finally:
try {
// 业务
} catch (BizException e) {
log.error("业务异常", e);
} catch (Exception e) {
log.error("未知异常", e);
} finally {
// 资源释放
}
// try-with-resources(推荐)
try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) {
// 自动 close
}
九、第三方常用库
1. Lombok
用途:消除 getter/setter/构造器/toString 等样板代码。
@Data // 自动生成 get/set/toString/equals/hashCode
@NoArgsConstructor @AllArgsConstructor
@Builder // 链式构造
@Slf4j // 自动注入 log 字段
public class User {
private Long id;
private String name;
}
// 使用
User u = User.builder().id(1L).name("x").build();
log.info("user={}", u);
2. Hutool(StrUtil / DateUtil / CollUtil)
用途:国产工具库,API 友好,一站式工具集。
StrUtil.isBlank(s); StrUtil.isNotBlank(s);
StrUtil.format("name={},age={}", "Tom", 18);
StrUtil.split("a,b,c", ',');
DateUtil.now(); // → "2026-05-24 12:00:00"
DateUtil.parse("2026-05-24");
DateUtil.offsetDay(date, 7);
DateUtil.betweenDay(d1, d2, true);
CollUtil.isEmpty(list);
CollUtil.join(list, ",");
3. Apache Commons Lang3
用途:最经典的 Java 工具库,StringUtils 几乎人人用过。
StringUtils.isBlank(s); // null/空/全空白 → true
StringUtils.isNotBlank(s);
StringUtils.defaultIfBlank(s, "默认");
StringUtils.join(list, ",");
StringUtils.equalsIgnoreCase(a, b);
CollectionUtils.isEmpty(coll);
CollectionUtils.isNotEmpty(coll);
4. Guava(Google)
用途:高质量集合工具、缓存、不可变集合、Multimap。
Lists.newArrayList("a", "b");
Maps.newHashMap();
ImmutableList.of("a", "b"); // 不可变
ImmutableMap.of("k", "v");
Multimap<String, String> mm = ArrayListMultimap.create();
mm.put("k", "v1"); mm.put("k", "v2"); // 一对多
// 本地缓存
Cache<String, User> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
cache.put("k", user); cache.getIfPresent("k");
5. Jackson(ObjectMapper)
用途:JSON 序列化/反序列化(Spring Boot 默认集成)。
ObjectMapper om = new ObjectMapper();
String json = om.writeValueAsString(user); // 对象转 JSON
User u = om.readValue(json, User.class); // JSON 转对象
List<User> list = om.readValue(json, new TypeReference<List<User>>(){});
JsonNode node = om.readTree(json); // 树模型
node.get("name").asText();
6. SLF4J + Logback
用途:日志记录。SLF4J 是门面,Logback 是实现。
private static final Logger log = LoggerFactory.getLogger(MyClass.class);
// 或 @Slf4j(Lombok)
log.debug("详细信息 id={}", id); // 占位符,不要用 + 拼接
log.info("用户登录: {}", username);
log.warn("重试 {} 次", count);
log.error("调用失败", e); // 异常作为最后一个参数
附:选型速查
| 场景 |
推荐 |
| 字符串拼接(循环) |
StringBuilder |
| 金额计算 |
BigDecimal(字符串构造 + 指定精度) |
| 列表 |
ArrayList,并发用 CopyOnWriteArrayList |
| 映射 |
HashMap,并发用 ConcurrentHashMap,有序用 LinkedHashMap / TreeMap |
| 文件读写 |
Files.readString / Files.writeString |
| 异步任务 |
CompletableFuture + 自定义 ThreadPoolExecutor |
| 日期时间 |
LocalDateTime + DateTimeFormatter |
| 集合处理 |
Stream + Collectors |
| null 处理 |
Optional / Objects.requireNonNull |
| JSON |
Jackson |
| 日志 |
SLF4J + Logback + Lombok @Slf4j |
| POJO |
Lombok @Data @Builder |
| 字符串工具 |
StringUtils(Commons)或 StrUtil(Hutool) |