Java按照添加顺序的集合几种方法详解

 更新时间:2024年12月05日 10:23:28   作者:飞滕人生TYF  
这篇文章主要介绍了Java按照添加顺序的集合几种方法的相关资料,文中介绍了Java中五种常用的数据结构(ArrayList、LinkedList、LinkedHashSet、LinkedHashMap、Stream)及其特点,适合不同的应用场景,需要的朋友可以参考下

在 Java 中,若需要按照添加顺序存储和操作元素,有以下几种数据结构可供选择。这些结构在保留元素插入顺序的同时提供了不同的功能特性。

1. 使用 ArrayList

特点

  • 有序性ArrayList 会按添加顺序存储元素。
  • 允许重复:可以存储重复的元素。
  • 随机访问:支持快速的按索引访问操作,时间复杂度为 O(1)
  • 线程不安全:默认情况下非线程安全,需手动同步。

示例

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        System.out.println("ArrayList: " + list); // 输出: [Apple, Banana, Cherry]
    }
}

2. 使用 LinkedList

特点

  • 有序性LinkedList 按照插入顺序存储元素。
  • 允许重复:支持重复的元素。
  • 高效插入和删除:在头部或尾部插入、删除操作时间复杂度为 O(1),但随机访问性能较差(时间复杂度 O(n))。
  • 双向链表实现:支持队列、栈等功能操作。

示例

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        System.out.println("LinkedList: " + list); // 输出: [Apple, Banana, Cherry]
    }
}

3. 使用 LinkedHashSet

特点

  • 有序性LinkedHashSet 会按照元素的插入顺序存储。
  • 去重:不允许存储重复元素。
  • 底层实现:基于 HashMap 和双向链表。
  • 适用场景:需要保留插入顺序,同时需要去重的场景。

示例

import java.util.LinkedHashSet;

public class LinkedHashSetExample {
    public static void main(String[] args) {
        LinkedHashSet<String> set = new LinkedHashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 重复元素将被忽略

        System.out.println("LinkedHashSet: " + set); // 输出: [Apple, Banana, Cherry]
    }
}

4. 使用 LinkedHashMap

特点

  • 有序性LinkedHashMap 按照插入顺序存储键值对。
  • 允许重复值:键不能重复,但值可以重复。
  • 快速访问:支持通过键快速访问值(时间复杂度为 O(1))。
  • 底层实现:基于 HashMap 和双向链表。
  • 适用场景:需要保留键值对的插入顺序。

示例

import java.util.LinkedHashMap;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
        map.put(1, "Apple");
        map.put(2, "Banana");
        map.put(3, "Cherry");

        System.out.println("LinkedHashMap: " + map); // 输出: {1=Apple, 2=Banana, 3=Cherry}
    }
}

5. 使用 Stream 收集为有序集合

如果数据来源是无序的,例如 HashSet 或原始数组,Java 的 Stream API 提供了一种方式,将数据按插入顺序转换为有序集合。

示例:收集为 List

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamOrderedExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Cherry", "Apple", "Banana");

        List<String> orderedList = list.stream()
                                       .collect(Collectors.toList()); // 保持原始顺序

        System.out.println("Ordered List: " + orderedList); // 输出: [Cherry, Apple, Banana]
    }
}

示例:收集为 LinkedHashSet

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;

public class StreamToOrderedSet {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Apple");

        Set<String> orderedSet = list.stream()
                                     .collect(Collectors.toCollection(LinkedHashSet::new));

        System.out.println("Ordered Set: " + orderedSet); // 输出: [Apple, Banana, Cherry]
    }
}

6. 各种数据结构的性能对比

数据结构插入顺序允许重复时间复杂度:插入时间复杂度:查找时间复杂度:删除备注
ArrayList保持插入顺序允许O(1)(尾部)O(1)(按索引)O(n)(中间元素)适合频繁访问,但插入删除较慢
LinkedList保持插入顺序允许O(1)(头/尾)O(n)(随机访问)O(1)(头/尾)插入和删除效率高,适合队列场景
LinkedHashSet保持插入顺序不允许O(1)O(1)O(1)适合需要顺序且去重的场景
LinkedHashMap保持插入顺序键不能重复O(1)O(1)O(1)适合需要顺序且键值对存储的场景
Stream按数据源的顺序处理可控与数据源有关与数据源有关与数据源有关灵活,但主要用于一次性操作

总结

在 Java 中,以下集合可以按添加顺序存储数据:

  • ArrayList 和 LinkedList:适合需要频繁增删、按顺序访问的场景。
  • LinkedHashSet 和 LinkedHashMap:适合需要顺序存储并去重或键值对操作的场景。
  • Stream:用于一次性操作,将无序数据转为有序集合。

根据实际需求,选择适合的数据结构以满足性能和功能需求。例如,若需要保留插入顺序且去重,选择 LinkedHashSet;若需要高效随机访问,则选择 ArrayList

到此这篇关于Java按照添加顺序的集合几种方法的文章就介绍到这了,更多相关Java按照添加顺序的集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot整合Sharding-JDBC实现MySQL8读写分离

    SpringBoot整合Sharding-JDBC实现MySQL8读写分离

    本文是一个基于SpringBoot整合Sharding-JDBC实现读写分离的极简教程,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的可以了解一下
    2021-07-07
  • IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案

    IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案

    这篇文章主要介绍了IDEA中创建maven项目引入相关依赖无法下载jar问题及解决方案,本文通过图文并茂的形式给大家分享解决方案,需要的朋友可以参考下
    2020-07-07
  • java导出json格式文件的示例代码

    java导出json格式文件的示例代码

    本篇文章主要介绍了java导出json格式文件的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 浅谈@RequestMapping注解的注意点

    浅谈@RequestMapping注解的注意点

    这篇文章主要介绍了浅谈@RequestMapping注解的注意点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java实现将彩色PDF转为灰度PDF的示例代码

    Java实现将彩色PDF转为灰度PDF的示例代码

    本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,文中的示例代码讲解详细,感兴趣的小伙伴快跟随小编一起学习一下吧
    2022-03-03
  • 一文总结RabbitMQ中的消息确认机制

    一文总结RabbitMQ中的消息确认机制

    RabbitMQ消息确认机制指的是在消息传递过程中,发送方发送消息后,接收方需要对消息进行确认,以确保消息被正确地接收和处理,本文为大家整理了RabbitMQ中的消息确认机制,需要的可以参考一下
    2023-06-06
  • 详解maven BUILD FAILURE的解决办法

    详解maven BUILD FAILURE的解决办法

    这篇文章主要介绍了详解maven BUILD FAILURE的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Spring Security角色继承分析

    Spring Security角色继承分析

    这篇文章主要介绍了Spring Security角色继承分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot集成Neo4j的详细教程

    SpringBoot集成Neo4j的详细教程

    Spring Boot 提供了对 Neo4j 的良好支持,使得开发者可以更方便地使用图数据库,通过使用 Spring Data Neo4j,开发者可以轻松地进行数据访问、操作以及管理,本文将详细介绍如何在 Spring Boot 应用中集成 Neo4j,需要的朋友可以参考下
    2024-11-11
  • Spring学习笔记3之消息队列(rabbitmq)发送邮件功能

    Spring学习笔记3之消息队列(rabbitmq)发送邮件功能

    这篇文章主要介绍了Spring学习笔记3之消息队列(rabbitmq)发送邮件功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07

最新评论