0

0

Java ArrayList:正确获取并添加元素索引的教程

心靈之曲

心靈之曲

发布时间:2025-09-20 17:18:01

|

566人浏览过

|

来源于php中文网

原创

Java ArrayList:正确获取并添加元素索引的教程

本文详细讲解了如何在Java中正确地遍历ArrayList并将其元素的索引值添加到另一个列表中。通过分析indexOf()方法的常见误用,本文将展示正确的实现方式,并提供清晰的代码示例,帮助开发者避免在处理列表索引时遇到的常见陷阱。

理解 ArrayList.indexOf() 方法

java中,arraylist 提供了一个 indexof(object o) 方法,用于返回指定元素在列表中第一次出现的索引,如果列表中不包含该元素,则返回 -1。初学者在使用此方法时常常会产生误解,尤其是在尝试获取遍历过程中当前元素的索引时。

考虑以下代码片段,它试图遍历一个列表 a,并将其元素的索引添加到另一个列表 b 中:

import java.util.ArrayList;
import java.util.List;

public class IndexMisuseExample {
    public static void main(String[] args) {
        List a = new ArrayList<>();
        a.add(2);
        a.add(5);
        a.add(1);

        List b = new ArrayList<>();

        for (int i = 0; i < a.size(); i++) {
            // 尝试将索引值添加到列表b
            b.add(a.indexOf(i));
        }

        System.out.println("array b: " + b);
    }
}

运行上述代码,输出结果是 array b: [-1, 2, 0]。这与期望的 [0, 1, 2] 大相径庭。

错误原因分析

之所以会出现 [-1, 2, 0] 这样的输出,是因为 a.indexOf(i) 的行为并非如预期。让我们逐步分析循环的每一次迭代:

  1. i = 0:
    • a.indexOf(0) 尝试在列表 a 中查找值 0。
    • 列表 a (当前为 [2, 5, 1]) 中不包含 0。
    • 因此,a.indexOf(0) 返回 -1,并被添加到列表 b 中。
  2. i = 1:
    • a.indexOf(1) 尝试在列表 a 中查找值 1。
    • 列表 a 中包含 1,它位于索引 2 处。
    • 因此,a.indexOf(1) 返回 2,并被添加到列表 b 中。
  3. i = 2:
    • a.indexOf(2) 尝试在列表 a 中查找值 2。
    • 列表 a 中包含 2,它位于索引 0 处。
    • 因此,a.indexOf(2) 返回 0,并被添加到列表 b 中。

循环结束后,列表 b 的内容就成了 [-1, 2, 0]。问题在于,a.indexOf(i) 查找的是 i 这个在列表 a 中的索引,而不是当前循环迭代的索引 i 本身。

立即学习Java免费学习笔记(深入)”;

正确获取并添加索引

如果目标是获取循环迭代过程中当前的索引值(即 0, 1, 2, ...)并将其添加到另一个列表中,那么最直接、最简洁的方法是直接使用循环变量 i。因为 i 在每次迭代中就代表了当前元素的索引。

以下是实现预期结果的正确代码:

import java.util.ArrayList;
import java.util.List;

public class CorrectIndexExample {
    public static void main(String[] args) {
        List a = new ArrayList<>();
        a.add(2);
        a.add(5);
        a.add(1);

        List b = new ArrayList<>();

        // 正确地将索引值添加到列表b
        for (int i = 0; i < a.size(); i++) {
            b.add(i); // 直接添加当前的循环索引值
        }

        System.out.println("array b: " + b);
    }
}

运行这段代码,输出将是 array b: [0, 1, 2],这正是我们所期望的结果。

考拉新媒体导航
考拉新媒体导航

考拉新媒体导航——新媒体人的专属门户网站

下载

另一种方法探讨:a.indexOf(a.get(i))

虽然直接添加 i 是最推荐的方法,但有时也会看到 b.add(a.indexOf(a.get(i))) 这样的写法。这种方法也能在特定情况下得到 [0, 1, 2] 的结果,但它不够直接,并且存在潜在的问题。

让我们分析 a.indexOf(a.get(i)):

  1. a.get(i): 首先,这会获取列表 a 中位于索引 i 处的元素值。
  2. a.indexOf(value): 然后,它会查找这个获取到的 value 在列表 a 中第一次出现的索引。

当列表 a 中的元素都是唯一的时,a.indexOf(a.get(i)) 确实会返回 i。例如:

  • i = 0: a.get(0) 是 2。a.indexOf(2) 返回 0。
  • i = 1: a.get(1) 是 5。a.indexOf(5) 返回 1。
  • i = 2: a.get(2) 是 1。a.indexOf(1) 返回 2。

然而,如果列表 a 包含重复元素,这种方法就会产生非预期的结果。例如:

List c = new ArrayList<>();
c.add(2);
c.add(5);
c.add(2); // 重复元素

List d = new ArrayList<>();

for (int i = 0; i < c.size(); i++) {
    d.add(c.indexOf(c.get(i))); // 使用 indexOf(get(i))
}

System.out.println("array d: " + d); // 输出: [0, 1, 0]

在这个例子中,当 i=2 时,c.get(2) 是 2。但 c.indexOf(2) 会返回 0 (因为 2 第一次出现在索引 0 处),而不是 2。这显然不符合我们想要获取当前遍历索引的目的。

因此,b.add(a.indexOf(a.get(i))) 这种写法不仅效率较低(进行了两次列表操作),而且在存在重复元素时会导致逻辑错误。

总结与最佳实践

  • 区分查找值与获取索引:ArrayList.indexOf(Object o) 方法是用来查找特定在列表中第一次出现的索引。它不是用来获取当前循环迭代的索引。
  • 直接使用循环变量:当你的目标是获取一个列表在遍历过程中每个元素的索引值本身(即 0, 1, 2, ...)时,最简单、最准确且最高效的方法是直接将循环变量(例如 for (int i = 0; ...) 中的 i)添加到目标列表中。
  • 避免冗余和错误:尽量避免使用 a.indexOf(a.get(i)) 这种间接且有潜在错误的方法来获取当前索引,尤其是在处理可能包含重复元素的列表时。

通过清晰地理解 indexOf() 的功能以及循环变量的用途,开发者可以避免常见的逻辑错误,并编写出更简洁、更高效的Java代码。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

19

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

567

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

209

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.9万人学习

Java 教程
Java 教程

共578课时 | 52.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号