MST

星途 面试题库

面试题:Java TreeMap与WeakHashMap在复杂业务场景下的选择

假设你正在开发一个电商系统,有一个模块用于存储商品的浏览记录,要求按照浏览时间顺序存储,并且当商品对象在系统其他地方不再被强引用时,浏览记录可以被自动清理以节省内存。在这种情况下,你会选择TreeMap还是WeakHashMap?请详细阐述你的选择理由以及如何实现相关功能。
35.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

选择WeakHashMap

  1. 选择理由
    • TreeMap:TreeMap是基于红黑树实现的有序映射,它能保证元素按照键的自然顺序或自定义顺序排序。然而,它不会自动清理不再被强引用的键值对。即使商品对象在系统其他地方不再被强引用,TreeMap中的对应记录仍然会占据内存,不符合题目中自动清理以节省内存的要求。
    • WeakHashMap:WeakHashMap的键是弱引用类型。当键(即商品对象)在系统的其他地方不再被强引用时,垃圾回收器可以回收该键所占用的内存,同时WeakHashMap中的对应键值对也会被自动移除,满足自动清理以节省内存的需求。虽然WeakHashMap本身不保证顺序,但我们可以通过额外的机制来实现按浏览时间顺序存储。
  2. 实现相关功能
    • 存储浏览记录
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Map;
      import java.util.WeakHashMap;
      
      class Product {
          private String id;
          // 其他商品属性
      
          public Product(String id) {
              this.id = id;
          }
      
          public String getId() {
              return id;
          }
      }
      
      public class ProductViewRecord {
          private Map<Product, Long> viewRecordMap = new WeakHashMap<>();
          private List<Product> viewOrderList = new ArrayList<>();
      
          public void recordView(Product product) {
              if (viewRecordMap.containsKey(product)) {
                  viewRecordMap.put(product, System.currentTimeMillis());
              } else {
                  viewRecordMap.put(product, System.currentTimeMillis());
                  viewOrderList.add(product);
              }
          }
      
          public List<Product> getViewOrder() {
              return viewOrderList;
          }
      }
      
    • 在上述代码中,WeakHashMap用于存储商品及其浏览时间戳。同时,使用一个ArrayList来记录商品的浏览顺序。每次记录商品浏览时,先判断WeakHashMap中是否已有该商品记录,若有则更新时间戳,若没有则添加到WeakHashMap并加入ArrayList
    • 获取按浏览时间顺序的记录
      • 通过getViewOrder方法返回ArrayList,该列表中的商品顺序即为浏览时间顺序。由于WeakHashMap会自动清理不再被强引用的商品键值对,当商品对象在其他地方不再被强引用时,对应的浏览记录会被自动清理,同时ArrayList中的引用也不会阻止商品对象被回收(因为WeakHashMap中的键是弱引用),从而达到节省内存的目的。