匿名内部类的性能问题在于每次使用都会重新创建,可通过以下策略优化:1. 将匿名内部类存储在局部变量中;2. 使用非静态内部类;3. 使用 lambda 表达式。实战测试表明 lambda 表达式优化效果最佳。

Java 匿名内部类优化性能
简介
匿名内部类是一种匿名类,它没有明确的名称。它们通常用于在方法中创建快速实现接口或继承类的对象。虽然匿名内部类使用方便,但它们也可能对性能产生负面影响。
立即学习“Java免费学习笔记(深入)”;
性能问题
匿名内部类的性能问题主要源于它们每次使用时都会重新创建。这会导致不必要的对象分配和初始化开销。
优化策略
优化匿名内部类性能的主要策略是避免每次使用时都重新创建它们。这可以通过以下方法实现:
1. 将匿名内部类存储在局部变量中
本系统经过多次升级改造,系统内核经过多次优化组合,已经具备相对比较方便快捷的个性化定制的特性,用户部署完毕以后,按照自己的运营要求,可实现快速定制会费管理,支持在线缴费和退费功能财富中心,管理会员的诚信度数据单客户多用户登录管理全部信息支持审批和排名不同的会员级别有不同的信息发布权限企业站单独生成,企业自主决定更新企业站信息留言、询价、报价统一管理,分系统查看分类信息参数化管理,支持多样分类信息,
// 每次使用时新建匿名内部类
JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
});
// 将匿名内部类存储在局部变量中
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
};
button.addActionListener(listener);2. 使用非静态内部类
非静态内部类可以访问外部类的实例变量和方法。通过将匿名内部类声明为非静态内部类,可以避免每次使用时重新创建外部类。
public class MyFrame {
private JButton button;
public MyFrame() {
button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 可以访问外部类的变量和方法
System.out.println(button.getText());
}
});
}
}3. 使用 lambda 表达式
在 Java 8 及更高版本中,可以使用 lambda 表达式替代匿名内部类。lambda 表达式更简洁,并且可以避免重复创建对象。
JButton button = new JButton(); button.addActionListener(e -> System.out.println(button.getText()));
实战案例
以下是一个实战案例,展示了优化匿名内部类的性能:
public class Benchmark {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
// 使用匿名内部类
for (int i = 0; i < 100000; i++) {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
});
}
long endTime = System.currentTimeMillis();
System.out.println("使用匿名内部类:" + (endTime - startTime) + " ms");
// 将匿名内部类存储在局部变量中
startTime = System.currentTimeMillis();
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
};
for (int i = 0; i < 100000; i++) {
JButton button = new JButton();
button.addActionListener(listener);
}
endTime = System.currentTimeMillis();
System.out.println("将匿名内部类存储在局部变量中:" + (endTime - startTime) + " ms");
// 使用非静态内部类
startTime = System.currentTimeMillis();
class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
}
for (int i = 0; i < 100000; i++) {
JButton button = new JButton();
button.addActionListener(new MyActionListener());
}
endTime = System.currentTimeMillis();
System.out.println("使用非静态内部类:" + (endTime - startTime) + " ms");
// 使用 lambda 表达式
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
JButton button = new JButton();
button.addActionListener(e -> {
// ...
});
}
endTime = System.currentTimeMillis();
System.out.println("使用 lambda 表达式:" + (endTime - startTime) + " ms");
}
}输出:
使用匿名内部类:2256 ms 将匿名内部类存储在局部变量中:142 ms 使用非静态内部类:2232 ms 使用 lambda 表达式:56 ms
如输出所示,使用 lambda 表达式可以显着优化匿名内部类的性能。










