面试题答案
一键面试选择WeakHashMap
- 选择理由:
- TreeMap:TreeMap是基于红黑树实现的有序映射,它能保证元素按照键的自然顺序或自定义顺序排序。然而,它不会自动清理不再被强引用的键值对。即使商品对象在系统其他地方不再被强引用,TreeMap中的对应记录仍然会占据内存,不符合题目中自动清理以节省内存的要求。
- WeakHashMap:WeakHashMap的键是弱引用类型。当键(即商品对象)在系统的其他地方不再被强引用时,垃圾回收器可以回收该键所占用的内存,同时WeakHashMap中的对应键值对也会被自动移除,满足自动清理以节省内存的需求。虽然WeakHashMap本身不保证顺序,但我们可以通过额外的机制来实现按浏览时间顺序存储。
- 实现相关功能:
- 存储浏览记录:
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
中的键是弱引用),从而达到节省内存的目的。
- 通过
- 存储浏览记录: