Java 在ArrayList中查找数组的索引

Java 在ArrayList中查找数组的索引,java,arrays,list,find,indexof,Java,Arrays,List,Find,Indexof,是否可以在ArrayList中找到数组的索引 方法indexOf似乎不起作用。例如,对于给定的大小为2的数组列表,此代码打印“-1” List nodes=new ArrayList(); add(新整数[]{1,1}); System.out.println(nodes.indexOf(新整数[]{1,1})); 在本例中,您需要理解Java是通过引用而不是通过值进行比较的。以下代码显示正确的解决方案: List<Integer[]> nodes = new ArrayLi

是否可以在ArrayList中找到数组的索引

方法
indexOf
似乎不起作用。例如,对于给定的大小为2的数组列表,此代码打印“-1”

List nodes=new ArrayList();
add(新整数[]{1,1});
System.out.println(nodes.indexOf(新整数[]{1,1}));

在本例中,您需要理解Java是通过引用而不是通过值进行比较的。以下代码显示正确的解决方案:

    List<Integer[]> nodes = new ArrayList<>();
    Integer[] a = new Integer[] {1,1};
    nodes.add(a);
    System.out.println(nodes.indexOf(a)); //0
    System.out.println(a == a); //true
    System.out.println(a == new Integer[] {1,1}); //false
    System.out.println(Arrays.equals(a, new Integer[]{1, 1})); //true
List nodes=new ArrayList();
整数[]a=新整数[]{1,1};
节点。添加(a);
System.out.println(nodes.indexOf(a))//0
System.out.println(a==a)//真的
System.out.println(a==新整数[]{1,1})//假的
System.out.println(Arrays.equals(a,新整数[]{1,1}))//真的
比较的普通对象是使用equals()方法。(等a.equals(b))用于数组和某些类需要静态方法。

基本Java数组的
equals()
实现执行引用相等检查。也就是说,只有当引用指向数组的同一实例时,才认为它们相等

您可以编写自己的索引查找方法,该方法使用
Arrays.equals()
静态方法,如下所示:

List<Integer[]> nodes = new ArrayList<Integer[]>();
nodes.add(new Integer[] {1,1});
Integer[] lookingFor = new Integer[] {1,1};
int index = -1;
for (int i = 0; i < nodes.size(); i++) {
    Integer[] array = nodes.get(i);
    if (Arrays.equals(lookingFor, array)) {
        index = i;
        break;
    }
}
System.out.println(index); // 0
List nodes=new ArrayList();
add(新整数[]{1,1});
整数[]查找=新整数[]{1,1};
int指数=-1;
对于(int i=0;i
indexOf方法“返回最低的索引i,以便(o==null?get(i)==null:o.equals(get(i)),或者如果没有这样的索引,则返回-1”,如Java API中所述。对于数组,array1.equals(array2)与array1==array2相同,因此得到-1,因为这两个数组具有不同的引用。

不,您不能这样做
new Integer[]{1,1}
是一个整数对象,您的代码将创建一个整数对象来分隔相同的对象

做你想做的事

 // You need to save a reference of your array in a variable
 Integer[] arr = new Integer[]{1, 1};

 // Add it to your list
 nodes.add(arr);  

 // Finally retrieve the index 
 System.out.println(nodes.indexOf(arr));  

打印变量
arr
的索引时,它将引用之前创建的同一个整数数组对象

您尝试查找未添加到列表中的对象的索引
newinteger[]{1,1}
创建一个新的Integer对象数组,该数组不会保存在您第一次指定它的位置。它不完全相同,因此不在您的列表中。(这就像问你的邻居约翰在哪里工作,但名单上只包括来自邻近城市的约翰,他不在名单上)。但是,您可能希望在书籍的帮助下改进Java的基础知识。关于它(equals)写在前面的章节中。谢谢!这正是我所需要的。
 // You need to save a reference of your array in a variable
 Integer[] arr = new Integer[]{1, 1};

 // Add it to your list
 nodes.add(arr);  

 // Finally retrieve the index 
 System.out.println(nodes.indexOf(arr));