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

【Java】常见数据结构及方法

1. 数组(Array)

项目说明
初始化方式int[] arr1 = new int[5];(指定长度)
int[] arr2 = {1,2,3,4,5};(直接赋值)
常用方法通过索引访问:arr[i](获取)、arr[i] = value(修改)
arr.length(获取长度)
遍历方式1. 普通 for 循环:
for(int i=0; i<arr.length; i++) { ... }
2. 增强 for 循环:
for(int num : arr) { ... }
特点固定大小,相同类型元素,随机访问快(O (1)),增删效率低

2. ArrayList

项目说明
初始化方式List<String> list = new ArrayList<>();(空集合)
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));(带初始元素)
常用方法add(E e):添加元素
get(int index):获取指定位置元素
remove(int index):删除指定位置元素
size():获取长度
contains(Object o):判断是否包含元素
clear():清空集合
遍历方式1. 普通 for 循环:
for(int i=0; i<list.size(); i++) { list.get(i); }
2. 增强 for 循环:
for(String s : list) { ... }
3. 迭代器:
Iterator<String> it = list.iterator();
while(it.hasNext()) { it.next(); }
特点基于动态数组,查询快(O (1)),增删中间元素慢(O (n)),线程不安全

3. LinkedList

项目说明
初始化方式LinkedList<String> linkedList = new LinkedList<>();
LinkedList<Integer> linkedList = new LinkedList<>(Arrays.asList(1,2,3));
常用方法继承 List 方法 + 特有方法:
addFirst(E e):头部添加
addLast(E e):尾部添加
removeFirst():删除头部
removeLast():删除尾部
getFirst()/getLast():获取首尾元素
遍历方式同 ArrayList(普通 for 循环 / 增强 for 循环 / 迭代器)
特点基于双向链表,增删首尾快(O (1)),查询慢(O (n)),可作为队列 / 栈使用

4. HashSet

项目说明
初始化方式Set<String> set = new HashSet<>();
Set<Integer> set = new HashSet<>(Arrays.asList(1,2,3));
常用方法add(E e):添加元素(重复元素不生效)
remove(Object o):删除元素
contains(Object o):判断是否包含
size():获取元素个数
clear():清空集合
遍历方式1. 增强 for 循环:
for(String s : set) { ... }
2. 迭代器:
Iterator<String> it = set.iterator();
while(it.hasNext()) { ... }
特点基于哈希表,无序,元素不可重复,查询 / 添加 / 删除效率高(O (1)),线程不安全

5. TreeSet

项目说明
初始化方式Set<Integer> treeSet = new TreeSet<>();(自然排序)
Set<String> treeSet = new TreeSet<>(Comparator.reverseOrder());(自定义排序)
常用方法同 HashSet + 排序相关:
first():获取第一个元素(最小)
last():获取最后一个元素(最大)
subSet(E from, E to):获取子集合
遍历方式同 HashSet(增强 for 循环 / 迭代器),遍历结果按排序规则输出
特点基于红黑树,元素有序(自然排序或自定义排序),查询 / 添加 / 删除效率 O (log n)

6. HashMap

项目说明
初始化方式Map<String, Integer> map = new HashMap<>();
Map<String, Integer> map = new HashMap<>(Map.of("a",1, "b",2));(Java 9+)
常用方法put(K key, V value):添加键值对
get(Object key):根据键获取值
remove(Object key):删除键值对
containsKey(Object key):判断是否包含键
keySet():获取所有键
values():获取所有值
entrySet():获取键值对集合
遍历方式1. 遍历键:
for(String key : map.keySet()) { map.get(key); }
2. 遍历键值对:
for(Map.Entry<String, Integer> entry : map.entrySet()) {
entry.getKey(); entry.getValue();
}
特点基于哈希表,键不可重复(重复会覆盖),无序,允许 null 键 / 值,效率高,线程不安全

7. TreeMap

项目说明
初始化方式Map<String, Integer> treeMap = new TreeMap<>();(按键自然排序)
Map<String, Integer> treeMap = new TreeMap<>(Comparator.reverseOrder());(自定义排序)
常用方法同 HashMap + 排序相关:
firstKey()/lastKey():首尾键
subMap(K from, K to):获取子映射
遍历方式同 HashMap,遍历键时按排序规则输出
特点基于红黑树,按键有序,查询 / 添加 / 删除效率 O (log n),不允许 null 键

8. Queue(以 LinkedList 为例)

项目说明
初始化方式Queue<String> queue = new LinkedList<>();
常用方法offer(E e):添加元素(失败返回 false)
poll():移除并返回头部(空返回 null)
peek():返回头部(空返回 null)
size():获取元素个数
遍历方式增强 for 循环或迭代器(同 Collection),但通常不推荐遍历(破坏队列结构)
特点遵循 FIFO(先进先出),适合实现队列场景

8.5 Deque 双端队列

项目说明
常用实现类ArrayDeque(基于动态数组,效率高,无容量限制)
LinkedList(基于链表,适合频繁插入删除)
初始化方式Deque<String> deque = new ArrayDeque<>();
Deque<Integer> deque = new LinkedList<>();
常用方法尾部操作(类似队列)
addLast(E e)/offerLast(E e):尾部添加元素
removeLast()/pollLast():移除并返回尾部元素
getLast()/peekLast():返回尾部元素

头部操作(类似栈)
addFirst(E e)/offerFirst(E e):头部添加元素
removeFirst()/pollFirst():移除并返回头部元素
getFirst()/peekFirst():返回头部元素

通用操作
size():获取元素个数
isEmpty():判断是否为空
clear():清空队列
遍历方式1. 增强 for 循环(顺序遍历):
for(String s : deque) { ... }
2. 迭代器:
Iterator<String> it = deque.iterator();
while(it.hasNext()) { ... }
3. 反向迭代器:
Iterator<String> reverseIt = deque.descendingIterator();
while(reverseIt.hasNext()) { ... }
特点1. 允许在两端进行元素的添加、删除和访问
2. 可灵活实现队列(用尾部添加、头部移除)或栈(用头部添加、头部移除)
3. ArrayDeque效率通常高于LinkedList和传统Stack
4. 线程不安全,如需线程安全可使用ConcurrentLinkedDeque
典型应用场景1. 实现栈(替代Stack类)
2. 实现双端队列
3. 需要在两端操作元素的场景(如滑动窗口、缓存等)

9. Stack(推荐用 ArrayDeque 替代)

项目说明
初始化方式Deque<Integer> stack = new ArrayDeque<>();
常用方法push(E e):入栈
pop():出栈并返回顶部元素
peek():返回顶部元素
isEmpty():判断是否为空
遍历方式增强 for 循环或迭代器(但通常按栈规则操作,不直接遍历)
特点遵循 LIFO(后进先出),适合实现栈场景,ArrayDeque 效率高于传统 Stack 类
http://www.xdnf.cn/news/1402453.html

相关文章:

  • EVidenceModeler v2.1 安装与使用--生信工具58
  • 嵌入式开发学习 C++:day02
  • mysql(自写)
  • 10. 函数和匿名函数(二)
  • 数值分析——误差的来源与分类、误差的基本概念(绝对误差、相对误差、有效数字)
  • 国标调查:引领汽车消费市场健康发展的理性指南
  • 奥普新汽车声学测试方案书
  • 基于单片机温控风扇ds18b20系统Proteus仿真(含全部资料)
  • 矿物类型分类实战:从数据预处理到多模型对比
  • 计算机体系结构之流水线与指令级并行
  • 离线大文件与断点续传:ABP + TUS + MinIO/S3
  • Android FrameWork - 开机启动 SystemServer 进程
  • Science:机器学习模型进行遗传变异外显率预测
  • 项目管理的关键成功因素
  • 全栈开源,高效赋能——启英泰伦新官网升级上线!
  • 链表(1)
  • 继电器的作用、选型和测量-超简单解读
  • Preprocessing Model in MPC 3 - 基于同态加密的协议 - Over Rings 环
  • Rust 泛型:抽象与性能的完美融合(零成本抽象的终极指南)
  • 20250830_Oracle 19c CDB+PDB(QMS)默认表空间、临时表空间、归档日志、闪回恢复区巡检手册
  • 【MLLM】从BLIP3o到BLIP3o-NEXT:统一生成与理解
  • Elasticsearch logsdb 索引模式和 TSDS 的业务影响
  • WSL使用指南
  • STM32 之BMP280的应用--基于RTOS的环境
  • 【MLLM】多模态理解Ovis2.5模型架构和训练流程
  • Codeforces Round 1033 (Div. 2) and CodeNite 2025 vp补题
  • 【自然语言处理与大模型】如何进行大模型多模态微调
  • 互联网大厂Java面试:从基础到微服务的深度解析
  • folium地图不显示加载不出来空白问题解决
  • 将 Logits 得分转换为概率,如何计算