如何提高循环性能

时间:2019-01-02 12:21:11

标签: java

这段代码非常快,但是我想不使用HashMap来使其更快。

我有一个帐户列表,目前正在循环查看它们是否检查account.getAccountNumber().equals(accountNumber)

是否有一种方法可以使用Java 8进行改进?

public Account getAccountFromCustomer(String customerID, String accountNumber) {
    List<Account> accounts = getAccountsFromCustomer(customerID);
    for(Account account : accounts) {
        if(account.getAccountNumber().equals(accountNumber)) {
            return account;
        }
    }
    return null;
}

2 个答案:

答案 0 :(得分:2)

也许我理解错了,但是如果我使用parallel可以改善性能:

@Test
public void testIt(){
    Integer accountNumberLookingFor = 50001;

    List<Account> accounts = new ArrayList<>();
    for (int i = 0 ; i < 100000; i++){
        accounts.add(new Account(i));
    }

    Stopwatch stopwatch = Stopwatch.createStarted();
    accounts.stream().filter(account -> account.accountNumber.equals(accountNumberLookingFor)).findFirst().orElse(null);
    System.out.println("Time of execution in milliseconds:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));


    stopwatch = Stopwatch.createStarted();
    accounts.stream().parallel().filter(account -> account.accountNumber.equals(accountNumberLookingFor)).findFirst().orElse(null);
    System.out.println("Time of execution in milliseconds:" + stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));

}

private class Account{
    Integer accountNumber;

    private Account(Integer accountNumber){
        this.accountNumber = accountNumber;
    }

    @Override
    public String toString(){
        return "Account number: ".concat(String.valueOf(accountNumber));
    }

}

导致:

Time of execution in milliseconds without parallel:50  
Time of execution in milliseconds with parallel:9

答案 1 :(得分:1)

我不熟悉本示例中使用的类,但是从算法的角度看,您似乎正在执行以下操作:

// Create an unordered list.
getAccountsFromCustomer();
// Run through it
for(Account account : accounts) {
  if matches()...
}

此算法的速度为O(n)

如果将结果放在有序列表中,则可以使用二进制搜索。您将需要一种O(n*log n)算法来创建该列表(不仅在列表的末尾添加帐户名,而且还按字母顺序排序),然后使用二进制搜索在其中查找帐户名该列表(效果O(log n)

显然,您需要两个独立的功能:

  • 一个创建列表的函数(此函数仅调用一次)。
  • 一个用于查找帐号的功能(每次需要查找该帐户时,都会根据其帐号调用此功能)。