List集合的进一步学习:性能优化

server/2024/12/2 9:44:04/

================================

||        持续分享系列教程,关注一下不迷路     ||

||                B站视频教程:墨轩大楼               ||

||                知识星球:墨轩编程自习室           ||

================================

        在Java集合框架中,选择合适的集合类型和使用正确的操作方法可以显著提高程序的性能。以下是一些常见的性能优化技巧,并附有详细的代码示例。

1. 选择合适的集合类型

根据具体的需求选择合适的集合类型是性能优化的第一步。例如:

  • 随机访问:如果需要频繁进行随机访问操作,应选择ArrayList
  • 频繁插入/删除:如果需要频繁进行插入和删除操作,应选择LinkedList
  • 线程安全:如果需要在多线程环境下使用,可以考虑Vector或使用Collections.synchronizedList包装ArrayList
2. 批量操作

批量操作通常比单个操作更高效。例如,使用addAll方法一次添加多个元素比多次调用add方法更高效。

示例代码
import java.util.ArrayList;
import java.util.List;public class BatchOperationExample {public static void main(String[] args) {List<String> list = new ArrayList<>();// 单个添加操作long startTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {list.add("Element" + i);}long endTime = System.nanoTime();System.out.println("Single add operations: " + (endTime - startTime) + " ns");// 清空列表list.clear();// 批量添加操作List<String> elements = new ArrayList<>();for (int i = 0; i < 1000000; i++) {elements.add("Element" + i);}startTime = System.nanoTime();list.addAll(elements);endTime = System.nanoTime();System.out.println("Batch add operations: " + (endTime - startTime) + " ns");}
}
3. 避免不必要的扩容

ArrayListVector在内部使用数组来存储元素。当数组容量不足时,会创建一个新的更大的数组,并将旧数组中的元素复制到新数组中。这个过程可能会导致性能下降。可以通过预分配足够的初始容量来避免这种情况。

示例代码
import java.util.ArrayList;
import java.util.List;public class InitialCapacityExample {public static void main(String[] args) {// 默认初始容量List<String> list1 = new ArrayList<>();long startTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {list1.add("Element" + i);}long endTime = System.nanoTime();System.out.println("Default initial capacity: " + (endTime - startTime) + " ns");// 预分配初始容量List<String> list2 = new ArrayList<>(1000000);startTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {list2.add("Element" + i);}endTime = System.nanoTime();System.out.println("Pre-allocated initial capacity: " + (endTime - startTime) + " ns");}
}
4. 使用迭代器进行批量删除

在遍历集合并删除元素时,使用迭代器比直接调用remove方法更高效。直接调用remove方法会导致集合重新计算索引,而使用迭代器则不会。

示例代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteratorRemoveExample {public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list.add(i);}// 使用迭代器删除long startTime = System.nanoTime();Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {if (iterator.next() % 2 == 0) {iterator.remove();}}long endTime = System.nanoTime();System.out.println("Using iterator remove: " + (endTime - startTime) + " ns");// 重置列表list.clear();for (int i = 0; i < 1000000; i++) {list.add(i);}// 直接调用remove方法startTime = System.nanoTime();for (int i = 0; i < list.size(); i++) {if (list.get(i) % 2 == 0) {list.remove(i--); // 注意索引调整}}endTime = System.nanoTime();System.out.println("Direct remove: " + (endTime - startTime) + " ns");}
}
5. 减少同步开销

在多线程环境下,尽量减少同步开销。例如,使用CopyOnWriteArrayList代替VectorCollections.synchronizedList包装的ArrayList

示例代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class SynchronizationExample {private static final int NUM_THREADS = 10;private static final int NUM_OPERATIONS = 10000;public static void main(String[] args) throws InterruptedException {testSynchronization(new ArrayList<>(), "ArrayList with Collections.synchronizedList");testSynchronization(new CopyOnWriteArrayList<>(), "CopyOnWriteArrayList");}private static void testSynchronization(List<Integer> list, String name) throws InterruptedException {if (list instanceof ArrayList) {list = Collections.synchronizedList(list);}ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);long startTime = System.nanoTime();for (int i = 0; i < NUM_THREADS; i++) {executor.submit(() -> {for (int j = 0; j < NUM_OPERATIONS; j++) {list.add(j);}});}executor.shutdown();executor.awaitTermination(1, TimeUnit.MINUTES);long endTime = System.nanoTime();System.out.println(name + ": " + (endTime - startTime) + " ns");}
}
6. 使用缓存

对于频繁访问的数据,可以考虑使用缓存来提高性能。例如,使用ConcurrentHashMap来存储和检索数据。

示例代码
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class CacheExample {private static final ConcurrentMap<Integer, String> cache = new ConcurrentHashMap<>();public static void main(String[] args) {// 初始化缓存for (int i = 0; i < 1000000; i++) {cache.put(i, "Value" + i);}// 从缓存中获取数据long startTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {String value = cache.get(i);}long endTime = System.nanoTime();System.out.println("Cache lookup: " + (endTime - startTime) + " ns");}
}

总结

通过选择合适的集合类型、批量操作、预分配初始容量、使用迭代器进行批量删除、减少同步开销以及使用缓存等方法,可以显著提高Java集合框架的性能。希望这些示例代码能够帮助您更好地理解和应用这些性能优化技巧。如果您有任何问题或需要进一步的帮助,请随时提问。


http://www.ppmy.cn/server/146678.html

相关文章

聊聊Flink:这次把Flink的触发器(Trigger)、移除器(Evictor)讲透

一、触发器(Trigger) Trigger 决定了一个窗口&#xff08;由 window assigner 定义&#xff09;何时可以被 window function 处理。 每个 WindowAssigner 都有一个默认的 Trigger。 如果默认 trigger 无法满足你的需要&#xff0c;你可以在 trigger(…) 调用中指定自定义的 tr…

基于卷积网络结构的火灾检测系统实现

1.摘要 本文实现了实现了一个完整的火灾检测工作流&#xff0c;从数据预处理、模型训练到最终的推理和报警功能。首先基于卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;设计实现了一个可分离卷积&#xff08;SeparableConv2D&#xff09;和残差连接的卷积神经网络模…

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…

封闭解(Closed-Form Solution)与复杂数值优化(Complex Numerical Optimization)的比较:中英双语

中文版 什么是封闭解&#xff1f; 在数学和统计学中&#xff0c;封闭解&#xff08;Closed-Form Solution&#xff09; 是指通过有限次基本运算&#xff08;如加减乘除、开方、对数、指数运算等&#xff09;即可明确表达的解。这意味着&#xff0c;当我们遇到一个数学问题或模…

[免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue大景区订票(购票)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue景区订票(购票)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息…

企业网站面临的爬虫攻击及安全防护策略

在当今数字化时代&#xff0c;企业网站不仅是展示企业形象的窗口&#xff0c;更是进行商业活动的重要平台。然而&#xff0c;企业网站在日常运营中面临着多种类型的爬虫攻击&#xff0c;这些攻击不仅会对网站的正常访问造成影响&#xff0c;还可能窃取敏感数据&#xff0c;给企…

#渗透测试#SRC漏洞挖掘#红蓝攻防#黑客工具之XSStrike介绍01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

网络安全 社会工程学 敏感信息搜集 密码心理学攻击 密码字典生成

网络安全 社会工程学 敏感信息搜集 密码心理学攻击 理解社会工程学的概念掌握获取敏感信息的方法提高自我信息保护的意识和方法理解密码心理学的概念理解密码特征分析掌握黑客猜解密码的切入方法掌握如何提高密码强壮性 敏感信息搜集 「注」由于对实验环境的限制&#xff0c;…