下面展示3中遍历循环方式耗时比较
public static void main(String[] args) {
/* 用户信息集合 */
List<UserInfo> userInfoList = new ArrayList<>();
/* 订单信息集合 */
List<OrderInfo> orderInfoList = new ArrayList<>();
/* 手动向集合中添加十万条数据 */
for (int i = 0; i < 100000; i++) {
String userId = i + "";
String name = "用户" + i;
String gender = "female";
UserInfo userInfo = new UserInfo(userId, name, gender);
Long orderId = Long.valueOf(createNum(6));
Long skuId = Long.valueOf(createNum(8));
OrderInfo orderInfo = new OrderInfo(userId, orderId, skuId, new BigDecimal("66"));
userInfoList.add(userInfo);
orderInfoList.add(orderInfo);
}
long start = System.currentTimeMillis();
//采用原始的双层for循环查询累计耗时:200005毫秒
//test1(userInfoList,orderInfoList);
//采用remove的双层for循环查询累计耗时:96088毫秒
//test2(userInfoList,orderInfoList);
//采用hashmap的双层for循环查询累计耗时:68毫秒
test3(userInfoList,orderInfoList);
long end = System.currentTimeMillis();
System.out.println("双层for循环查询累计耗时:" + (end - start) + "毫秒");
}
原始的for循环
/**
* 原始方法
* @param userInfoList
* @param orderInfoList
*/
public static void test1(List<UserInfo> userInfoList,List<OrderInfo> orderInfoList){
for (UserInfo userInfo : userInfoList) {
int count=0;
for (OrderInfo orderInfo : orderInfoList) {
if (userInfo.getUserId().equals(orderInfo.getUserId())) {
count++;
}
}
userInfo.setCount(count);
}
}
remove方式
public static void test2(List<UserInfo> userInfoList,List<OrderInfo> orderInfoList){
userInfoList.stream().forEach(user ->{
int count=0;
for(int m=0;m<orderInfoList.size();m++){
if(user.getUserId().equals(orderInfoList.get(m).getUserId())){
count++;
orderInfoList.remove(m);
m--;
}
}
user.setCount(count);
});
}
map方式(空间换时间)
public static void test3(List<UserInfo> userInfoList,List<OrderInfo> orderInfoList){
List<UserInfo> list = new ArrayList<UserInfo>();
final Map<String, UserInfo> gradeInfoMap = userInfoList.stream()
.collect(
Collectors.toMap(UserInfo::getUserId, Function.identity()));
list = orderInfoList.stream().map(h -> {
UserInfo userInfo = gradeInfoMap.get(h.getUserId());
int count = userInfo.getCount();
count++;
userInfo.setCount(count);
return userInfo;
}).collect(Collectors.toList());
System.out.println(list.get(10000).getCount());
}
实体类
@Data
public class OrderInfo {
/**
* 用户Id
*/
private String userId;
/**
* 订单号
*/
private Long orderId;
/**
* 商品sku
*/
private Long skuId;
/**
* 商品价格
*/
private BigDecimal price;
public OrderInfo(String userId, Long orderId, Long skuId, BigDecimal price) {
this.userId = userId;
this.orderId = orderId;
this.skuId = skuId;
this.price = price;
}
}
@Data
public class UserInfo {
/**
* 用户Id
*/
private String userId;
/**
* 用户名
*/
private String name;
/**
* 用户性别
*/
private String gender;
private int count;
public UserInfo(){
}
public UserInfo(String userId, String name, String gender) {
this.userId = userId;
this.name = name;
this.gender = gender;
}
}