为什么等于和==&引用;当我想使用for循环从arrayList获取数据时,它不起作用? import java.util.ArrayList; 公共班机{ 公共静态void main(字符串[]args){ ArrayList=新建ArrayList(); 对于(int i=0;i

为什么等于和==&引用;当我想使用for循环从arrayList获取数据时,它不起作用? import java.util.ArrayList; 公共班机{ 公共静态void main(字符串[]args){ ArrayList=新建ArrayList(); 对于(int i=0;i,java,Java,我有一个问题,当我想找到一个相等的n值时,为什么第二个循环返回false。当我使用“==”或“equals()”方法时也会发生同样的情况 当我使用集合方法“contains()”时,它正在工作,并返回“true” 第二个问题,使用“contains()”从列表中获取数据(例如我的变量“n”)的最快方法是,还是有更好(更快)的方法?即使找到匹配项,也没有中断循环。找到匹配项后,如果不匹配,则在下一次迭代中重置contains=false 你也可以简化它 import java.util.Array

我有一个问题,当我想找到一个相等的n值时,为什么第二个循环返回false。当我使用“==”或“equals()”方法时也会发生同样的情况

当我使用集合方法“contains()”时,它正在工作,并返回“true”


第二个问题,使用“contains()”从列表中获取数据(例如我的变量“n”)的最快方法是,还是有更好(更快)的方法?

即使找到匹配项,也没有中断循环。找到匹配项后,如果不匹配,则在下一次迭代中重置
contains=false

你也可以简化它

import java.util.ArrayList;

public class Main {
        public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
        Integer n = 5000000;
        boolean contains = true;
        for (int i = 0; i < 10000000; i++) {
            if (list.get(i).equals(n))
                contains = true;
            else
                contains = false;

        }
        System.out.println(contains);

        contains = list.contains(5000000);
        System.out.println(contains);
    }

}
boolean contains=false;
对于(int i=0;i<10000000;i++){
if(list.get(i).equals(n)){
包含=真;
打破
}
}
顺便说一下,ArrayList包含的方法的时间复杂度为O(n),其中n是元素数。您可以使用HashSet,它没有任何顺序,但它只包含方法时间复杂性O(1)

例如:

boolean contains = false;
for (int i = 0; i < 10000000; i++) {
    if (list.get(i).equals(n)) {
        contains = true;
        break;
    }
}
HashSet=newhashset();
对于(int i=0;i<10000000;i++){
增加(i);
}
整数n=5000000;
System.out.println(set.contains(n));

因为即使
i
等于
n
并且
contain
得到
true
值,您在下一次迭代中再次将
false
值分配给它,您也不应该使用
else

HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < 10000000; i++) {
    set.add(i);
}

Integer n = 5000000;
System.out.println(set.contains(n));
import java.util.ArrayList;
公共班机{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
对于(int i=0;i<10000000;i++){
列表.添加(i);
}
整数n=5000000;
布尔包含=假;
对于(int i=0;i<10000000;i++){
if(list.get(i).equals(n))
包含=真;
打破
}
System.out.println(包含);
包含=列表。包含(5000000);
System.out.println(包含);
}
}

因为当您在其中找到元素时,不会停止循环。在下一次迭代中,您的contains变量可能再次设置为false。添加一个
break
contains=true之后你是。如果你只需要知道元素在那里,你可以考虑使用一个集合或映射而不是一个列表。这会快得多。@chatton谢谢你的回答。我将从各种列表类型中了解数据访问。我认为当我寻找最快的方法时,遍历所有列表长度并不是一个好主意。“contains()”方法比循环快吗?或者可能有最快的方法吗?我总是觉得看源代码很有用。看看contains和indexOf方法。你必须初始化
boolean contains=false。否则,随着你的改变,你永远不可能变假。我犯了一个愚蠢的错误!谢谢大家的回答!现在对我来说很明显,我犯了一个愚蠢的错误。
import java.util.ArrayList;

    public class Main {
            public static void main(String[] args) {
            ArrayList<Integer> list = new ArrayList<>();
            for (int i = 0; i < 10000000; i++) {
                list.add(i);
            }
            Integer n = 5000000;
            boolean contains = false;
            for (int i = 0; i < 10000000; i++) {
                if (list.get(i).equals(n))
                    contains = true;
                    break;

            }
            System.out.println(contains);

            contains = list.contains(5000000);
            System.out.println(contains);
        }

    }