1. 数组初始化方式优化
- 延迟初始化:在实际需要使用数组时才进行初始化,避免在程序启动或不必要的时候占用大量内存。
public class DelayedArrayInitialization {
private int[] largeArray;
public void processData() {
if (largeArray == null) {
largeArray = new int[1000000];
}
// 使用 largeArray 进行数据处理
}
}
- 按需分配大小:根据实际数据量来确定数组大小,避免分配过大的数组空间造成浪费。例如,在读取文件内容时,先预估文件行数,再分配合适大小的数组。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class SizedArrayInitialization {
public String[] readLinesFromFile(String filePath) throws IOException {
int lineCount = estimateLineCount(filePath);
String[] lines = new String[lineCount];
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
for (int i = 0; i < lineCount; i++) {
lines[i] = br.readLine();
}
}
return lines;
}
private int estimateLineCount(String filePath) throws IOException {
// 这里简单示例返回一个固定值,实际应用可根据文件内容准确预估
return 1000;
}
}
2. 利用内存回收机制优化
- 尽早释放引用:当数组不再使用时,将引用设为
null
,以便垃圾回收器(GC)能尽快回收其占用的内存。
public class EarlyRelease {
public void createAndReleaseArray() {
int[] largeArray = new int[1000000];
// 使用 largeArray 进行操作
largeArray = null;
// 此时 largeArray 所占用的内存可被 GC 回收
}
}
- 主动触发垃圾回收(谨慎使用):在某些特定场景下,可调用
System.gc()
尝试主动触发垃圾回收,但这并不保证 GC 一定会执行,且频繁调用可能会影响性能。
public class ManualGC {
public void createAndReleaseArray() {
int[] largeArray = new int[1000000];
// 使用 largeArray 进行操作
largeArray = null;
System.gc();
}
}
3. 与其他数据结构结合优化
- 使用
ArrayList
替代固定大小数组(适用于大小不确定的情况):ArrayList
内部是基于数组实现,但它能动态调整大小,避免了频繁创建和销毁数组的开销。
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public List<Integer> processData() {
List<Integer> dataList = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
dataList.add(i);
}
return dataList;
}
}
- 结合
WeakHashMap
等弱引用数据结构:如果数组中的元素不需要强引用,可以使用 WeakHashMap
来存储数组引用,当数组没有其他强引用时,能被 GC 及时回收。
import java.util.WeakHashMap;
public class WeakHashMapExample {
private static WeakHashMap<String, int[]> weakMap = new WeakHashMap<>();
public void createAndStoreArray(String key) {
int[] largeArray = new int[1000000];
weakMap.put(key, largeArray);
}
}