java:ArrayList-如何检查索引是否存在?

java:ArrayList-如何检查索引是否存在?,java,arraylist,Java,Arraylist,我正在使用ArrayList并在特定索引处添加数据,如何检查特定索引是否存在 我应该简单地get()并检查值吗?或者我应该等待一个例外? 还有别的办法吗 更新 感谢您的回答,但因为我只是在特定索引中添加内容,列表的长度不会显示可用的内容。方法arrayList.size()列表中的项目数-因此,如果索引大于或等于size(),它就不存在 if(index >= myList.size()){ //index not exists }else{ // index exists } 如

我正在使用
ArrayList
并在特定索引处添加数据,如何检查特定索引是否存在

我应该简单地
get()
并检查值吗?或者我应该等待一个例外? 还有别的办法吗

更新
感谢您的回答,但因为我只是在特定索引中添加内容,列表的长度不会显示可用的内容。

方法
arrayList.size()
列表中的项目数-因此,如果索引大于或等于
size()
,它就不存在

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}

如果索引小于列表的大小,则它确实存在,可能具有
null
值。如果索引较大,则可以调用
ensureCapacity()
以使用该索引


如果要检查索引中的值是否为空,请调用
get()

您可以使用
size()
方法检查
数组列表的大小。这将返回可以检查数组大小的最大索引+1

package sojava;
import java.util.ArrayList;

public class Main {
    public static Object get(ArrayList list, int index) {
        if (list.size() > index) { return list.get(index); }
        return null;
    }

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(""); list.add(""); list.add("");        
        System.out.println(get(list, 4));
        // prints 'null'
    }
}

这就是你需要的

public boolean indexExists(final List list, final int index) {
    return index >= 0 && index < list.size();
}
public boolean indexists(最终列表,最终整数索引){
返回索引>=0&&index
为什么不使用普通的旧数组?我认为,对列表的索引访问是一种代码气味。

关于您的更新(这可能是另一个问题)。 您应该使用这些对象的数组,而不是ArrayList, 因此,您可以简单地检查空值:

Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
   // not available
}
else {
   // do something
}
最佳做法

如果你的数组中没有几百个条目,你应该考虑把它组织成一个类来去掉魔法数,3,8等等。


使用异常控制流是一种糟糕的做法。

当您收到十几条关于使用列表大小的建议时,这些建议适用于具有线性条目的列表,但似乎没有人阅读您的问题

如果您在不同的索引中手动添加条目,这些建议都不起作用,因为您需要检查特定的索引

使用if(list.get(index)==null)也不起作用,因为get()抛出异常而不是返回null

试试这个:

try {
    list.get( index );
} catch ( IndexOutOfBoundsException e ) {
    list.add( index, new Object() );
}

如果索引不存在,将在此处添加一个新条目。您可以更改它以执行不同的操作。

对索引是否存在进行快速而肮脏的测试。在您的实现中,将列表替换为您正在测试的列表

public boolean hasIndex(int index){
    if(index < list.size())
        return true;
    return false;
}
public boolean hasIndex(int-index){
如果(索引
或者对于二维数组列表

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}
public boolean hasRow(int行){
如果(行<_矩阵大小())
返回true;
返回false;
}

由于
java-9
有一种检查索引是否属于数组的标准方法-:

List ints=List.of(1,2,3);
System.out.println(Objects.checkIndex(1,ints.size());//1.
System.out.println(Objects.checkIndex(10,ints.size())//IndexOutOfBoundsException

通常我只是检查索引是否小于数组大小

if (index < list.size()) {
    ...
}
if(索引
如果您还担心索引为负值,请使用以下命令

if (index >= 0 && index < list.size()) {
    ...
}
if(索引>=0&&index
一种简单的方法:

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}

看一看集合,也许它更适合您的需要?然后您必须
get()
并检查
null
——但不要依赖异常。考虑使用<代码>哈希表< /代码>而不是可怕的!!我将使用HashTable thanks,它应该“大于或等于
size()
”,因为它是一个基于零的索引。同样值得一提的是,要使这个原子化,您可能需要执行size()命令锁定列表时,检查和相应的基于条件索引的查找。请注意,我将此答案标记为正确答案是因为所有者(Amarghosh)在对我的问题的评论中回答了我的问题。哈希表将更好地满足我的需要。如果您在arraylist中使用项目ID设置项目,该怎么办?例如,mylist.set(1,第1项);mylist.set(3,第3项)//跳过2我想HashMap更适合那个场景?这让我不太满意。。如果我想在索引已经存在的情况下执行列表中的某项操作,但如果不这样做,则准备它。。对于一个新列表,我将从
index=0
和我的
list.size()==0
开始。所以,我第一次检查它是否正确&我会准备清单来做一些事情。但是下一次在该索引处,我的索引仍然是
index=0
,现在我正在重新初始化列表中的元素,当时我应该在做一些事情。第一个想法是
&
第二个条件,如
列表。get(index)=null
,但这不起作用,这就是为什么会有这样的问题调用ensureCapacity(int)不会增加列表的大小,只会增加容量;i、 例如,“潜在大小”,所以越界索引查找仍然会失败。另外,为什么要调用ensureCapacity(int)?例如,如果列表的当前大小为5,并且您想要确定项#:100000000的值,那么这可能是一个非常昂贵的操作。我的意思是,小于size()的索引始终存在,大于等于size()的索引不存在,并且在列表变得足够大之前,不能使用它们(=调用集()。仅仅调用ensureCapacity是不够的事实上,我们需要通过添加元素来更改大小。关于ensureCapacity(int)实际作用的错误解释。它与ArrayList大小无关。不总是这样,因为他可能希望ArrayList随着时间的推移而增长,而数组不能这样做。谢谢你,需要使用这种技术来单元测试数组索引是否存在。记住避免使用
try/catch
进行此类工作,这将使你的程序速度降低50%甚至更多。。错误检查会像一条带子一样添加到现有代码中,以降低其速度。。最好在关键区域避免。在这种情况下,检查
length
是最好的选择,因为try { list.get( index ); } catch ( IndexOutOfBoundsException e ) { if(list.isEmpty() || index >= list.size()){ // Adding new item to list. } }