| name | Java编程 |
| description | 当进行Java开发、性能优化、并发编程或设计模式应用时,分析代码质量和最佳实践。 |
| license | MIT |
Java编程技能
概述
Java是企业级应用开发的主流语言,从Java 8到Java 21的演进引入了大量现代特性。不同版本的Java在特性支持、性能、和编程范式上有显著差异。选择合适的特性和避免性能陷阱对于构建高质量应用至关重要。
核心原则: 好的Java代码应该清晰高效、资源管理清楚、并发安全、充分利用语言特性。坏的Java代码会内存泄漏、性能低下、难以维护。
何时使用
始终:
- Java项目代码审查
- 性能优化和调优
- 并发编程和线程安全分析
- 内存管理和GC优化
- 设计模式应用
- 框架集成和最佳实践
触发短语:
- "Java性能优化"
- "并发编程最佳实践"
- "Stream API用法"
- "Lambda表达式应用"
- "内存泄漏检测"
- "Java 8/11/21特性"
Java编程技能功能
核心语言特性
- 类和接口设计
- 继承和多态
- 异常处理机制
- 泛型编程
- 注解和元数据
Java 8特性(函数式编程)
- Lambda表达式
- 函数式接口
- Stream API
- Optional类型
- 方法引用
Java 11及以后特性
- var局部变量类型推导
- 文本块(Text Blocks)
- 密封类(Sealed Classes)
- 记录类(Records)
- 模式匹配(Pattern Matching)
并发编程
- Thread和Runnable
- 同步机制(synchronized, Lock)
- 并发容器(ConcurrentHashMap等)
- 线程池和ExecutorService
- 内存模型和volatile
集合框架
- List, Set, Map使用
- 迭代器和遍历
- Collections工具类
- 性能特性(时间复杂度)
- 自定义集合
I/O和资源管理
- try-with-resources
- Stream和Reader/Writer
- NIO和非阻塞I/O
- 文件操作
- 资源泄漏防护
常见问题
性能问题
并发问题
-
问题: 竞态条件
-
原因: 多线程访问共享数据没有同步
-
解决: 使用synchronized、Lock或线程安全容器
-
问题: 死锁
-
原因: 获取锁的顺序不一致
-
解决: 规定统一的锁获取顺序
-
问题: 内存可见性问题
-
原因: 没有使用volatile或happens-before关系
-
解决: 正确使用同步机制建立happens-before关系
资源泄漏
- 问题: 文件没有关闭
- 原因: 异常时没有释放资源
- 解决: 使用try-with-resources自动管理
代码示例
Java 8 - Lambda和Stream
import java.util.*;
import java.util.stream.*;
public class Java8Features {
public void lambdaDemo() {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.forEach(System.out::println);
}
public void streamApiDemo() {
List<String> words = Arrays.asList("hello", "world", "java", "stream");
long count = words.stream()
.filter(w -> w.length() > 3)
.count();
System.out.println("Count: " + count);
Map<String, Integer> wordLengths = words.stream()
.collect(Collectors.toMap(
Function.identity(),
String::length
));
}
public void optionalDemo() {
Optional<String> optional = Optional.of("Java");
optional.ifPresent(System.out::println);
optional.orElse();
optional.map(String::toUpperCase)
.orElse();
}
}
Java 11/ 17特性
public class ModernJavaFeatures {
public void varDemo() {
var name = "Java";
var numbers = List.of(1, 2, 3);
var map = new HashMap<String, Integer>();
for (var num : numbers) {
System.out.println(num);
}
}
public String textBlockDemo() {
String json = """
{
"name": "John",
"age": 30,
"city": "New York"
}
""";
return json;
}
public record Person(String name, int age, String email) {
public Person {
if (age < 0) ();
}
}
}
并发编程
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class ConcurrencyDemo {
private AtomicInteger counter = new AtomicInteger(0);
public void threadPoolDemo() {
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
final int taskId = i;
executor.execute(() -> {
System.out.println("Task " + taskId + " running");
counter.incrementAndGet();
});
}
executor.shutdown();
try {
executor.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public void countDownLatchDemo() throws InterruptedException {
CountDownLatch latch = new ();
( ; i < ; i++) {
i;
(() -> {
System.out.println( + taskId + );
{
Thread.sleep();
System.out.println( + taskId + );
} {
latch.countDown();
}
}).start();
}
latch.await();
System.out.println();
}
{
counter.incrementAndGet();
}
();
{
(lock) {
counter.incrementAndGet();
}
}
}
资源管理和异常处理
import java.io.*;
import java.nio.file.*;
public class ResourceManmentation {
public String readFileModern(String filename) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
return reader.lines()
.collect(Collectors.joining("\n"));
}
}
public void multipleResourcesDemo() throws IOException {
try (
FileReader reader = new FileReader("input.txt");
FileWriter writer = new FileWriter("output.txt")
) {
char[] buffer = new char[1024];
int bytesRead;
while ((bytesRead = reader.read(buffer)) != -1) {
writer.write(buffer, 0, bytesRead);
}
}
}
{
String connectionString;
{
.connectionString = connStr;
System.out.println( + connStr);
}
{
System.out.println();
}
{
System.out.println( + sql);
}
}
-> {
System.out.println( + taskId + );
counter.incrementAndGet();
});
}
executor.shutdown();
}
Exception {
( ()) {
conn.execute();
}
}
}
集合框架性能考虑
import java.util.*;
public class CollectionPerformance {
public void collectionChoiceDemo() {
List<String> list = new ArrayList<>(100);
list.add("item1");
list.add("item2");
Set<String> set = new HashSet<>(100);
set.add("item1");
set.add("item2");
Map<String, Integer> map = new HashMap<>(100);
map.put("key1", 1);
map.put("key2", 2);
Map<String, Integer> concurrent = new ConcurrentHashMap<>();
concurrent.putIfAbsent("key", 1);
}
public void iterationDemo(List<String> items) {
for (int i = 0; i < items.size(); i++) {
System.out.println(items.get(i));
}
(String item : items) {
System.out.println(item);
}
(Iterator<String> it = items.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
items.forEach(System.out::println);
}
}