网站如何吸引电脑网页怎么下载视频

当前位置: 首页 > news >正文

网站如何吸引,电脑网页怎么下载视频,学了dw 就可以做网站了吗,定制微信免费下载在 Java 开发中#xff0c;集合类是处理数据的核心工具。合理选择集合#xff0c;不仅可以提高代码效率#xff0c;还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点#xff0c;帮助你在实际开发中找到最佳解决方案。 一、List#xff1a;有序存… 在 Java 开发中集合类是处理数据的核心工具。合理选择集合不仅可以提高代码效率还能让代码更简洁。本篇文章将重点探讨 List、Set 和 Map 的适用场景及优缺点帮助你在实际开发中找到最佳解决方案。 一、List有序存储的/最佳选择

  1. ArrayList快速查询与动态数组 应用场景当你需要频繁查询元素或者存储的元素数目动态变化时ArrayList 是首选。例如分页展示用户数据。 代码示例 ListString users new ArrayList(); users.add(Alice); users.add(Bob); System.out.println(users.get(1)); // 输出 Bob 底层结构ArrayList 使用一个 动态数组 来存储元素。初始时数组的大小是固定的当元素超过数组的容量时会自动扩展数组的大小。 优点 查询效率高数组支持按索引快速访问元素时间复杂度为 O(1)因此 get() 操作非常高效。 内存局部性数组存储在连续的内存空间中CPU 缓存友好可以利用 CPU 的缓存机制提高访问效率。
    缺点 插入和删除效率低当插入或删除元素时尤其是在中间位置时必须移动数组中的大量元素时间复杂度为 O(n)。 扩容操作代价高数组扩容时需要分配新的数组并将旧数组元素复制到新数组操作的时间复杂度为 O(n)。 2. LinkedList高效增删的双向链表 应用场景需要频繁在列表中间或首尾插入、删除数据时例如实现任务队列。 代码示例 LinkedListString tasks new LinkedList(); tasks.addFirst(Task1); tasks.addLast(Task2); tasks.removeFirst(); 底层结构LinkedList 使用 双向链表每个元素都有两个指针一个指向前一个元素一个指向下一个元素。这样可以在常数时间内插入或删除元素。 优点 插入和删除高效无论是在链表的头部、中部还是尾部插入和删除元素的时间复杂度都为 O(1)因为只需要改变相关节点的指针。 内存使用灵活每个元素的内存可以分散存储不需要连续的内存块。 【比如在中间插入】 假设需要在链表中的某个位置 node 前插入新节点 newNode 将 newNode 的 next 指向 node将 newNode 的 prev 指向 node.prev。 更新 node.prev.next 为 newNode更新 node.prev 为 newNode。 这只涉及 4 次指针操作与链表的长度无关因此在已定位到目标节点后插入操作的时间复杂度为 O(1)。 缺点 查询效率低为了查找元素必须从头节点或尾节点开始遍历链表时间复杂度为 O(n)。 内存开销大每个元素都需要额外存储指向前后元素的指针相较于数组占用更多的内存。 二、Set无重复集合的首选
  2. HashSet高效去重 应用场景当需要存储一组不允许重复的元素且对顺序没有要求时例如用户注册时验证用户名的唯一性。 代码示例 SetString usernames new HashSet(); usernames.add(Alice); usernames.add(Bob); usernames.add(Alice); // 重复的元素会被忽略 System.out.println(usernames.size()); // 输出 2 底层结构HashSet 使用 哈希表HashMap【哈希表在文末有补充讲解】来存储元素。哈希表通过将元素的哈希码映射到表中的桶来进行存储确保元素是唯一的。 优点 去重高效哈希表能够快速判断元素是否已存在因为它通过哈希值进行查找时间复杂度为 O(1)。 查询效率高哈希表的查找时间复杂度为 O(1)因此 contains() 和 add() 操作非常高效。
    缺点 无序存储哈希表并不维护元素的顺序因此 HashSet 中的元素是无序的。 哈希冲突不同的元素可能具有相同的哈希值哈希冲突会影响性能但通常情况下哈希表的设计会尽量减少冲突的概率。 2. LinkedHashSet有序去重 应用场景当需要去重的同时保留插入顺序例如记录用户最近浏览的商品。 代码示例 SetString products new LinkedHashSet(); products.add(Laptop); products.add(Phone); products.add(Laptop); // 再次添加无效 System.out.println(products); // 输出 [Laptop, Phone] 底层结构LinkedHashSet 使用一个 哈希表 来存储元素并通过一个 双向链表 来维护元素的插入顺序。 优点 有序存储由于链表的存在LinkedHashSet 能够保持元素的插入顺序访问时能够按照插入的顺序遍历元素。 去重高效与 HashSet 一样哈希表提供了快速的查找和去重机制。
    缺点性能略低于 HashSet由于还需要维护链表LinkedHashSet 的操作稍微比 HashSet 慢但差距通常不大。 3. TreeSet排序与去重兼备 应用场景当需要去重的同时对元素进行排序例如实现排行榜或数据字典。 代码示例 TreeSetInteger scores new TreeSet(); scores.add(50); scores.add(80); scores.add(70); System.out.println(scores); // 输出 [50, 70, 80] 底层结构TreeSet 使用 红黑树 来存储元素。红黑树是一种自平衡的二叉搜索树能够确保树的深度保持在对数级别。 优点 有序存储TreeSet 会自动对元素进行排序默认按自然顺序排序compareTo(Object obj)或者通过传入 Comparator 自定义排序。 查找、插入和删除的时间复杂度为 O(log n)由于红黑树的结构特性所有操作的时间复杂度为对数级别。
    缺点性能较低相比哈希表红黑树的插入、删除和查找操作的时间复杂度为 O(log n)因此在大量数据操作时性能略逊色于 HashSet 和 LinkedHashSet。 三、Map键值对存储的首选 Map 是存储键值对的集合类每个键唯一对应一个值。常用于快速查找和关联关系的存储。
  3. HashMap高效的键值映射 应用场景需要高效查找时例如存储用户 ID 和用户信息的映射。 代码示例 MapInteger, String userMap new HashMap(); userMap.put(1, Alice); userMap.put(2, Bob); System.out.println(userMap.get(1)); // 输出 Alice 底层结构HashMap 使用 哈希表 来存储键值对通过键的哈希码来确定存储位置。 优点 查找和插入高效查找、插入和删除操作的时间复杂度为 O(1)通过哈希值直接定位位置。 支持键值对的存储每个键对应唯一的值适合各种映射操作。
    缺点 无序存储哈希表中的元素是无序的因此遍历时无法保证顺序。 2. LinkedHashMap有序的键值映射 应用场景需要既保持插入顺序又能高效查找例如实现最近访问页面的缓存。 代码示例 MapInteger, String accessLog new LinkedHashMap(); accessLog.put(1, HomePage); accessLog.put(2, ProfilePage); accessLog.put(3, SettingsPage); System.out.println(accessLog); // 输出 {1HomePage, 2ProfilePage, 3SettingsPage} 底层结构LinkedHashMap 使用 哈希表 存储元素并通过 双向链表 维护元素的插入顺序。 优点 有序存储保持了元素的插入顺序遍历时能够按照插入顺序输出。 高效查找与 HashMap 一样查询和插入操作的时间复杂度为 O(1)。
    缺点内存开销较大需要额外的内存来存储链表指针。 3. TreeMap有序的键值存储 应用场景需要按键排序存储键值对例如实现字典或排行榜。 代码示例 MapInteger, String sortedMap new TreeMap(); sortedMap.put(3, C); sortedMap.put(1, A); sortedMap.put(2, B); System.out.println(sortedMap); // 输出 {1A, 2B, 3C} 底层结构TreeMap 使用 红黑树 来存储键值对按照键的自然顺序或通过指定的 Comparator进行排序。 优点 有序存储自动对键进行排序适用于需要顺序访问键值对的场景。 高效的查找、插入和删除操作时间复杂度为 O(log n)。 缺点性能略低于 HashMap 和 LinkedHashMap由于红黑树需要维护平衡操作的时间复杂度为对数级别性能不如哈希表
  4. Properties 应用场景 Properties 常用于管理应用程序的配置信息如数据库连接信息、语言国际化资源等。 它可以方便地加载和存储键值对到 .properties 文件中支持流式操作。
    代码示例 import java.io.*; import java.util.Properties; ​ public class PropertiesExample {public static void main(String[] args) throws IOException {Properties properties new Properties();// 设置键值对properties.setProperty(database.url, jdbc:mysql://localhost:3306/mydb);properties.setProperty(database.user, root);properties.setProperty(database.password, password); ​// 保存到文件try (FileOutputStream output new FileOutputStream(config.properties)) {properties.store(output, Database Configuration);} ​// 从文件加载try (FileInputStream input new FileInputStream(config.properties)) {properties.load(input);} ​// 打印所有属性properties.forEach((key, value) - System.out.println(key : value));} } 底层结构 Properties 的基础是 Hashtable 底层采用线程安全的哈希表结构。 键和值均为字符串类型String以适应配置文件的存储和解析需求。 提供了 load() 和 store() 方法用于流式操作方便配置文件的读写。
    优点 简单直观内置方法支持直接操作配置文件减少手动解析的复杂性适合存储和管理小规模配置。 线程安全继承自 Hashtable所有操作均是同步的适合简单的多线程环境。 与文件系统集成良好提供了流式操作接口方便将键值对直接保存为 .properties 文件或从文件中加载。
    缺点 性能较低由于继承自同步的 Hashtable在现代高并发场景下不推荐使用性能落后于 HashMap。 局限性仅支持 String 类型的键值对若需要存储复杂对象需额外序列化。 不适合大规模配置适合小型项目或简单模块的配置管理大型系统建议采用更复杂的配置管理工具如 Apache Commons Configuration 或 Spring。
    总结 集合类底层数据结构主要优点主要缺点ArrayList动态数组查询效率高支持随机访问插入删除效率低扩容代价大LinkedList双向链表插入删除效率高内存灵活查询效率低占用内存大HashSet哈希表查询和去重效率高无序存储受哈希冲突影响LinkedHashSet哈希表 双向链表有序存储去重效率高内存占用较高TreeSet红黑树有序存储按自然顺序或自定义顺序排序性能略低于哈希表操作复杂度为 O(log n)HashMap哈希表查找和插入效率高支持键值对映射无序存储受哈希冲突影响LinkedHashMap哈希表 双向链表有序存储按插入顺序遍历键值对内存开销较高TreeMap红黑树有序存储按键自然顺序或自定义顺序排序性能略低于哈希表操作复杂度为 O(log n)Properties哈希表继承自 Hashtable专为存储键值对配置设计支持读写 .properties 文件性能较低继承自同步的 Hashtable不适合高并发 知识点补充
  5. 什么是哈希表 哈希表是一种用来存储 键值对 的工具它能非常快速地找到数据。你可以把它想象成一个 带编号的储物柜每个柜子都有一个编号索引你把东西存进去时会根据物品的特点计算出一个编号然后直接放进对应的柜子里。取东西时也用相同的方法计算编号直接找到对应的柜子打开拿走。 例子 假如你有一本字典查找某个单词键对应的解释值。 传统查找方法逐页翻阅耗时长。 使用哈希表计算单词的编号直接跳到对应的位置查看解释速度非常快。
    总结类比 键是 “单词”值是 “解释”。 哈希表通过哈希函数快速找到这个单词在哪页。 2. 哈希表是如何存数据的 哈希表的核心在于 哈希函数。这个函数就像一个计算器可以把一个键比如一个字符串变成一个数字哈希值。哈希值用来确定数据存储的位置。 步骤 计算位置用哈希函数把键变成一个数字然后对储物柜的总数取模%确定放在哪个柜子里。假如储物柜有 10 个Alice 的哈希值是 4242 % 10 2所以数据放到第 2 个柜子。 存储值把数据放到计算出的柜子里。