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

Java的列表、集合、数组的添加一个元素各自用的什么方法?

在Java中,列表(List)、集合(Set)和数组(Array)添加元素的方法有所不同,以下是具体说明及示例:


add() 添加元素

一、列表(List)

常用实现类包括ArrayListLinkedList,核心方法为add()

  1. 末尾添加
    add(Object o)

    List<String> list = new ArrayList<>();
    list.add("Java");  // 添加元素到末尾
    
  2. 指定位置插入
    add(int index, Object o)

    list.add(1, "Python");  // 在索引1处插入元素,原元素后移
    
  3. 批量添加
    addAll(Collection<?> c)Collections.addAll()

    List<String> list2 = Arrays.asList("C++", "Go");
    list.addAll(list2);  // 批量添加集合元素
    

二、集合(Set)

常用实现类如HashSetTreeSet,添加元素需满足唯一性

  1. 基本添加
    add(Object o)

    Set<String> set = new HashSet<>();
    set.add("Apple");  // 成功返回true,重复元素返回false
    
  2. 有序集合的添加
    TreeSet会自动按自然顺序排序:

    Set<Integer> sortedSet = new TreeSet<>();
    sortedSet.add(3);
    sortedSet.add(1);  // 最终顺序为1, 3
    

对比总结

数据结构添加方法特点
数组Arrays.copyOf()或转ArrayList固定长度,需手动扩容或转换容器
列表(List)add()addAll()支持动态扩容和指定位置插入
集合(Set)add()元素唯一,自动去重,无序(TreeSet有序)

示例完整代码
数组转列表并添加元素:

int[] arr = {1, 2, 3};
List<Integer> list = new ArrayList<>(Arrays.asList(arr));
list.add(4);
list.add(1, 99);  // 插入到索引1处
System.out.println(list);  // 输出[1, 99, 2, 3, 4]

集合去重示例:

Set<String> cities = new HashSet<>();
cities.add("Beijing");
cities.add("Shanghai");
cities.add("Beijing");  // 重复元素不会被添加
System.out.println(cities);  // 输出[Beijing, Shanghai]

如需动态处理大量元素,推荐优先使用ArrayList(列表)或HashSet(集合)。

三、树形结构(Tree)

Java 标准库未直接提供树结构,但可通过 TreeSetTreeMap 间接实现有序存储:

TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(5);  // 自动按升序排列
treeSet.add(3);  // 内部顺序变为3, 5

四、队列(Queue)

队列遵循 先进先出(FIFO) 原则,常用实现类为 LinkedListPriorityQueue

  1. 普通队列
    使用 add()offer() 方法在队尾添加元素:

    Queue<Integer> queue = new LinkedList<>();
    queue.add(10);  // 添加元素,队列满时抛异常
    queue.offer(20); // 添加元素,队列满时返回false
    
  2. 优先级队列
    PriorityQueue 根据元素自然顺序或自定义比较器排序:

    Queue<Integer> pq = new PriorityQueue<>();
    pq.add(5);  // 添加元素并自动排序
    pq.add(1);  // 内部顺序变为1, 5
    

五、链表(LinkedList)

LinkedList 同时实现了 ListDeque,支持灵活插入:

  1. 任意位置插入
    使用 add(int index, E element)
    LinkedList<String> linkedList = new LinkedList<>();
    linkedList.add(0, "First");  // 在索引0处插入
    linkedList.add(1, "Second");
    

六、向量(Vector)

向量是线程安全的动态数组,使用 addElement()add() 添加:

Vector<Integer> vector = new Vector<>();
vector.addElement(100);  // 传统方法
vector.add(200);         // 与ArrayList兼容

其他数据结构的添加方法

Java 中除了列表(List)、集合(Set)和数组(Array)之外,还有其他多种数据结构支持元素的添加操作。以下是其他常见数据结构及其添加元素的示例和方法:


双端队列(Deque)

双端队列支持从两端添加元素,实现类为 ArrayDeque

  1. 头部/尾部添加
    使用 addFirst()addLast()
    Deque<String> deque = new ArrayDeque<>();
    deque.addFirst("Front");  // 头部添加
    deque.addLast("End");     // 尾部添加
    

put()- 映射(Map)

映射存储键值对,常用实现类为 HashMapTreeMap

  1. 添加键值对
    使用 put() 方法:
    Map<String, Integer> map = new HashMap<>();
    map.put("Apple", 10);  // 键不存在时新增
    map.put("Banana", 20);
    

push() - 栈(Stack)

栈遵循 后进先出(LIFO) 原则,实现类为 Stack(已过时)或 Deque 模拟。

  1. 使用 Deque 模拟栈
    Deque<Integer> stack = new ArrayDeque<>();
    stack.push(1);  // 压栈
    stack.push(2);  // 栈顶元素变为2
    

数组(Array)

数组是固定长度的数据结构,添加元素通常需要创建新数组使用动态容器

  1. 直接赋值
    通过索引直接赋值,但需确保索引有效且数组已初始化:

    int[] arr = new int[3];
    arr[0] = 1;  // 直接赋值到索引0的位置
    
  2. 扩容后添加
    使用Arrays.copyOf()创建新数组并添加元素:

    int[] arr = {1, 2, 3};
    arr = Arrays.copyOf(arr, arr.length + 1);  // 扩容
    arr[arr.length - 1] = 4;  // 添加新元素
    
  3. 转换为ArrayList动态添加
    将数组转为ArrayList,利用其add()方法:

    String[] arr = {"a", "b"};
    List<String> list = new ArrayList<>(Arrays.asList(arr));
    list.add("c");  // 添加新元素
    arr = list.toArray(new String[0]);  // 转回数组
    

总结

数据结构添加方法示例类适用场景
队列(Queue)add(), offer()LinkedList任务调度、广度优先搜索
双端队列(Deque)addFirst(), addLast()ArrayDeque需要两端操作的场景
映射(Map)put()HashMap键值对存储、快速查找
栈(Stack)push()ArrayDeque函数调用栈、表达式求值
链表(LinkedList)add(index, element)LinkedList频繁插入/删除、中间操作
向量(Vector)addElement()Vector线程安全的动态数组需求

扩展说明

  • 堆(Heap):Java 中通过 PriorityQueue 实现堆结构,添加元素会自动调整堆结构。
  • 并发集合:如 ConcurrentHashMapCopyOnWriteArrayList,适用于多线程环境,但添加方法类似普通集合。

如果需要更具体的实现细节或线程安全方案,可进一步查看相关类的官方文档或源码实现。

http://www.xdnf.cn/news/587359.html

相关文章:

  • 【论文阅读】——AN EXPRESSIVE REPRESENTATION OF GENERAL 3D SHAPES
  • Linux环境基础开发工具->vim
  • 实现FAT12文件管理
  • 线性回归模型的参数估计
  • AutoMapper .net Framework 的 Model转换扩展方法
  • python学习 day5
  • 部署人工智能Qlib量化投资平台
  • 你通俗易懂的理解——线程、多线程与线程池
  • 架构实践中,指标体系如何科学建立?构建指标体系的五层结构模型是什么?不同架构风格下的指标体系有怎样的差异?
  • 腾讯2025年校招笔试真题手撕(二)
  • 欧拉降幂(JAVA)蓝桥杯乘积幂次
  • Windows 平台 TCP 通信开发指南
  • Redisson分布式锁案列和源码解读
  • WebBuilder快速开发平台:企业级开发的未来
  • 语义分割的image
  • linux arm架构下如何搭建内网穿透
  • linux 下 scp 传文件时保留文件夹中的原格式属性
  • vue3+element-plus+pinia完整搭建好看简洁的管理后台
  • 关于Python编程语言的详细介绍,结合其核心特性、应用领域和发展现状,以结构化方式呈现:
  • 邮箱验证码登录流程
  • [每日一题] 3362. 零数组变换 iii
  • MapReduce-Top N程序编写与运行
  • 修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题
  • 基于大模型的胫腓骨干骨折全周期预测与治疗方案研究报告
  • 五分钟学会如何封装Jsckson工具类
  • OpenCV CUDA 模块图像过滤------创建一个高斯滤波器函数createGaussianFilter()
  • Python中的并发编程
  • Java集合框架与三层架构实战指南:从基础到企业级应用
  • OceanBase 系统表查询与元数据查询完全指南
  • 使用web3工具结合fiscobcos网络部署调用智能合约