集合查找性能优化

集合查找性能优化:

public class OptimizeCollectionDemo {

    public static void main(String[] args) {

        List<Ticket> tickets = new ArrayList<>();

        List<Integer> ids = new ArrayList<>();

        for (int i = 0; i < 100000; i++) {
            Ticket ticket = new Ticket();
            ticket.setId(i);
            ticket.setName("ticket" + i);
            ticket.setType("movie");
            tickets.add(ticket);

            if (i != 99) {
                ids.add(i);
            }
        }


        // method 1
        long start = System.currentTimeMillis();

        tickets = tickets.stream().filter(u -> ids.contains(u.getId())).collect(Collectors.toList());

        System.out.println("consumer times: " + (System.currentTimeMillis() - start));
//        consumer times: 30403 10万数据级耗时30秒
        System.out.println("size: " + tickets.size());


        // method2
        start = System.currentTimeMillis();
        Map<Integer, Ticket> map = tickets.stream().collect(Collectors.toMap(Ticket::getId, ticket -> ticket));
        Set<Ticket> newTickets = new HashSet<>(100000);
        ids.forEach(x->{
            newTickets.add(map.get(x));
        });
        System.out.println("consumer times: " + (System.currentTimeMillis() - start));
//        consumer times: 50   10万数量级耗时50毫秒
        System.out.println("size: "+newTickets.size());

        // 总结:method 1 算法是先遍历tickets,然后对每个元素在ids中遍历查找,相当于for循环嵌套,所以时间复杂度是O(n^2)
        // method 2 算法是先遍历tickets并把每个元素转成Map,然后再遍历ids并查找map中的key,由于map查找key的时间复杂度是O(1),所以总的时间复杂度是O(n)+O(n)=O(2n)相当于O(n),但是中间会有Map转换,会消耗内存。

        // 所以如果存在循环遍历查找元素,可以考虑把List转成Map,这样提高查询性能。这就应了List适合遍历,Map适合查找。

    }




    @Data
    static class Ticket {
        private Integer id;
        private String name;

        private String type;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值