Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法提高下面代码的性能?_Java - Fatal编程技术网

Java 有没有办法提高下面代码的性能?

Java 有没有办法提高下面代码的性能?,java,Java,代码正在比较2个列表。第一个列表来自api调用,第二个来自数据库。我使用2个循环迭代列表并比较它们,然后将公共项添加到新列表中。第一个列表包含约800个数据,第二个列表(来自db)包含150个数据。是否有任何方法可以提高此代码的性能。我不允许在AllowedCodes类中进行任何更改。使用嵌套循环是否会影响给定数据量的性能 public class AllowedCodes { private String codeValue=""; public Str

代码正在比较2个
列表
。第一个
列表
来自api调用,第二个来自数据库。我使用2个循环迭代列表并比较它们,然后将公共项添加到新列表中。第一个列表包含约800个数据,第二个列表(来自db)包含150个数据。是否有任何方法可以提高此代码的性能。我不允许在
AllowedCodes类
中进行任何更改。使用嵌套循环是否会影响给定数据量的性能

public class AllowedCodes {

    private String codeValue="";

    public String getCodeValue() {
        return codeValue;
    }

    public void setCodeValue(String codeValue) {
        this.codeValue = codeValue;
    }
}

public class CheckCodes {

    public static void main(String[] args) {

        List<AllowedCodes> old_codes_list=getListOfOldCodes();

        List<AllowedCodes> new_codes_list=new ArrayList<>();

        String sql = "This query gets the codes from database";

        PreparedStatement statement = connection.prepareStatement(sql);

        ResultSet result = statement.executeQuery();

        while(result.next()) {

            for(AllowedCodes a:old_codes){
               if(a.getCodeValue().equalsIgnoreCase(result.getCodeValue())){
                   new_codes_list.add(a);
               }
            }

        }



    }

}
公共类允许的代码{
私有字符串codeValue=“”;
公共字符串getCodeValue(){
返回代码值;
}
公共无效setCodeValue(字符串codeValue){
this.codeValue=codeValue;
}
}
公共类校验码{
公共静态void main(字符串[]args){
列出旧代码\u List=getListOfOldCodes();
List new_codes_List=new ArrayList();
String sql=“此查询从数据库获取代码”;
PreparedStatement=connection.prepareStatement(sql);
ResultSet result=statement.executeQuery();
while(result.next()){
对于(允许的代码a:旧代码){
if(a.getCodeValue().equalsIgnoreCase(result.getCodeValue())){
新代码列表。添加(a);
}
}
}
}
}

将列表复制到一个
HashMap
中,对小写时具有相同代码值的
允许代码进行分组:

Map<String, List<AllowedCodes>> map =
    old_codes.stream().collect(groupingBy(a -> a.getCodeValue().toLowerCase()));

对使用
哈希集
而不是
旧代码列表
。(以小写形式存储和比较代码以忽略原始大小写。)它必须是一个ArrayList。这是我从api调用中得到的响应。并且没有重复项。有没有办法降低时间复杂度?“这是我从api调用中得到的响应。”将其复制到
哈希集
。或者其他一些数据结构,如Trie。复制会花费一些成本,但是您可以用一个
集合替换线性
for
循环。包含(…)
,该集合以恒定时间运行(摊销)。(你将做1次线性运算,而不是数百次。)@LoneWolf:关于这方面的文章很多。它涉及根据项目的
getHashCode()
值的模数对项目进行分组,因此它不必对集合中的每个项目调用
equals()
。不过,您可能不需要担心实现细节,因为
contains()
是一个
O(1)
操作,所以创建一个映射并检查所有项就变成了一个
O(n)
复杂度操作,而不是
O(n²)
,以前从未使用过。谢谢,你可以使用流api完全避免while循环,对吗?只需在
.filter(…contains(…)
之后创建一个单行程序就可以了吗?它能与resultSet一起工作吗?请提供一个代码。我将尝试使用它。我是流式api新手。@LoneWolf这使用了您的问题所显示的代码:“
result.getCodeValue()
”。是的@Andy,您的代码帮助很大。我指的是StriplingWarrior,他说的代码是否有效。
while(result.next()) {
  String resultCodeValue = result.getCodeValue().toLowerCase();
  for (AllowedCodes a : map.getOrDefault(resultCodeValue, Collections.emptyList())) {
    new_codes_list.add(a);
  }
}