在 Java 中,集合对象的下标(索引)操作主要针对有序集合(如 List
接口的实现类),因为无序集合(如 Set
)没有索引概念,下面详细说明不同场景下的下标操作方法,并附代码示例。
List 集合的下标操作(最常用)
List
是有序集合,元素按插入顺序排列,可通过整型索引(从 0 开始)直接访问元素。
获取指定位置的元素
List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); // 获取索引 1 的元素(从 0 开始) String element = list.get(1); // 返回 "B"
遍历集合并获取下标
-
方法 1:传统 for 循环
for (int i = 0; i < list.size(); i++) { System.out.println("下标: " + i + ", 元素: " + list.get(i)); }
-
方法 2:增强 for 循环 + 计数器
int index = 0; for (String s : list) { System.out.println("下标: " + index++ + ", 元素: " + s); }
-
方法 3:Java 8 Stream API
IntStream.range(0, list.size()) .forEach(i -> System.out.println("下标: " + i + ", 元素: " + list.get(i)));
-
方法 4:ListIterator(支持双向遍历)
ListIterator<String> iterator = list.listIterator(); while (iterator.hasNext()) { int index = iterator.nextIndex(); // 获取下一个元素的索引 String element = iterator.next(); System.out.println("下标: " + index + ", 元素: " + element); }
Set 集合的“伪下标”操作
Set
是无序集合(如 HashSet
),没有下标概念,若需获取元素位置,需手动计数或转换为 List:
遍历时使用计数器
Set<String> set = new HashSet<>(Arrays.asList("X", "Y", "Z")); int count = 0; for (String s : set) { System.out.println("计数: " + count++ + ", 元素: " + s); } // 注意:计数顺序不等于插入顺序(HashSet 无序)
转换为 List 后再操作
List<String> listFromSet = new ArrayList<>(set); // 转换为 List System.out.println(listFromSet.get(0)); // 获取第一个元素
Map 集合的键值对索引
Map
通过 Key 访问 Value,不直接使用数字下标,但可通过 keySet()
或 entrySet()
获取有序键值对:
遍历 Key 并获取索引
Map<String, Integer> map = new LinkedHashMap<>(); // LinkedHashMap 保留插入顺序 map.put("Apple", 10); map.put("Banana", 20); List<String> keys = new ArrayList<>(map.keySet()); for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); System.out.println("下标: " + i + ", Key: " + key + ", Value: " + map.get(key)); }
直接遍历 EntrySet
int index = 0; for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println("计数: " + index++ + ", Key: " + entry.getKey() + ", Value: " + entry.getValue()); }
⚠️ 注意事项
-
下标越界错误
List.get(index)
中index
需满足:index >= 0 && index < list.size()
,否则抛出IndexOutOfBoundsException
。 -
集合类型的选择
- 需要下标操作 → 使用
ArrayList
或LinkedList
(List
接口)。 - 无需下标 → 使用
Set
或Map
。
- 需要下标操作 → 使用
-
无序集合的“下标”不可靠
HashSet
/HashMap
的遍历顺序不固定,计数结果可能与预期不符,需有序访问时改用:LinkedHashSet
/LinkedHashMap
(按插入顺序)TreeSet
/TreeMap
(按自然排序顺序)
-
Java 8 的优雅方案
使用IntStream
或forEach
+计数器简化代码:List<String> list = Arrays.asList("A", "B", "C"); IntStream.range(0, list.size()) .mapToObj(i -> "下标: " + i + ", 值: " + list.get(i)) .forEach(System.out::println);
集合类型 | 是否支持下标 | 推荐方法 |
---|---|---|
List |
✅ 是 | list.get(index) + for 循环 |
Set |
❌ 否 | 转换为 List 或遍历时手动计数 |
Map |
❌ 否 | 通过 Key 访问 Value 或遍历 Entry |
Array |
✅ 是 | array[index] (基本数组) |
📌 关键点:
- 仅
List
和数组可直接通过数字下标访问元素。- 其他集合需通过转换或计数器间接实现类似功能。
- 始终优先考虑集合的有序性和性能(如
ArrayList
随机访问快,LinkedList
插入删除快)。
引用说明 参考 Oracle 官方文档 Java Collections Framework 和《Effective Java》中的集合最佳实践,代码示例基于 JDK 8+ 语法验证。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/12521.html