本文目录导读:

我来分享几个Java数据结构优化的实用案例:
HashMap优化案例
原始写法
// ❌ 不推荐 HashMap<String, Object> map = new HashMap<>();
优化版本
// ✅ 指定初始容量和负载因子 // 已知存储1000个元素,避免频繁扩容 HashMap<String, Object> map = new HashMap<>(1000, 0.75f); // 使用计算好的初始容量 int expectedSize = 1000; int initialCapacity = (int) (expectedSize / 0.75f + 1); HashMap<String, Object> map = new HashMap<>(initialCapacity);
ArrayList动态扩容优化
原始写法
// ❌ 大量add操作时频繁扩容
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
list.add(i);
}
优化版本
// ✅ 预分配容量 ArrayList<Integer> list = new ArrayList<>(100000); // 或者使用Arrays.asList List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
字符串拼接优化
原始写法
// ❌ 生成大量String对象
String result = "";
for (String s : array) {
result += s;
}
优化版本
// ✅ 使用StringBuilder
StringBuilder sb = new StringBuilder(array.length * 10);
for (String s : array) {
sb.append(s);
}
String result = sb.toString();
集合遍历优化
原始写法
// ❌ 频繁调用size()
for (int i = 0; i < list.size(); i++) {
// 操作
}
优化版本
// ✅ 缓存size值
int size = list.size();
for (int i = 0; i < size; i++) {
// 操作
}
// ✅ 使用增强for循环(如果不需要索引)
for (String item : list) {
// 操作
}
集合选择优化案例
场景:频繁的查找操作
// ❌ ArrayList不适合频繁查找
ArrayList<String> list = new ArrayList<>();
// 1000次查找操作
for (int i = 0; i < 1000; i++) {
list.contains("target"); // O(n)
}
// ✅ HashSet适合频繁查找
HashSet<String> set = new HashSet<>();
for (int i = 0; i < 1000; i++) {
set.contains("target"); // O(1)
}
原始类型集合优化
使用原始类型集合
// ✅ 避免自动装箱拆箱 // 使用第三方库如 Trove 或 Eclipse Collections // 或者自己实现原始类型集合 int[] array = new int[1000]; // 比ArrayList<Integer>更高效 // 如果需要动态大小,可以使用ArrayList<Integer>但要注意 // 大量小整数时,可以考虑使用IntArrayList (Eclipse Collections)
性能测试代码
// 测试不同数据结构的性能对比
public class DataStructureOptimization {
public static void main(String[] args) {
// 测试HashMap初始化优化
long start = System.nanoTime();
for (int i = 0; i < 10000; i++) {
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "test");
}
long time1 = System.nanoTime() - start;
start = System.nanoTime();
for (int i = 0; i < 10000; i++) {
HashMap<Integer, String> map = new HashMap<>(10);
map.put(1, "test");
}
long time2 = System.nanoTime() - start;
System.out.println("无初始容量: " + time1 + " ns");
System.out.println("有初始容量: " + time2 + " ns");
}
}
- 预估容量:为集合指定合适的初始容量
- 选择合适的数据结构:根据操作类型选择
- 避免自动装箱:大量运算时使用原始类型
- 使用StringBuilder:字符串拼接时
- 缓存计算结果:如size()、length()等
- 避免在循环中创建对象:减少GC压力
这些优化在不同场景下可以带来10%-50%的性能提升,具体效果取决于数据量和操作频率。