我有这张地图
private final Map<StockItem, Integer> list;
我正在使用一种方法通过生成一个返回StockItem类型的键来查找此映射中的值。
这是方法
public static StockItem MakeKey(String name, double price, int quantityStock){
return new StockItem(name,price,quantityStock);
}
代码工作正常,查找工作正常,我的问题是这是如何发生的?因为make Key方法返回一个全新的对象,该对象包含可能包含在列表中的完全相同的数据。它会经历每次迭代然后调用.equals来比较每个对象吗?
这里是StockItem类,我使用的是TreeMap
public class StockItem implements Comparable<StockItem> {
private final String name;
private int quantity;
private double price;
private int reserveItems = 0;
public StockItem(String name, double price) {
this.name = name;
this.price = price;
quantity = 0;
}
public StockItem(String name, double price, int quantityStock) {
this.name = name;
this.price = price;
quantity = quantityStock;
}
public void reserveItem(int amountReserved){
this.reserveItems = amountReserved + this.reserveItems;
}
public void unReserveItem(int unreserve){
reserveItems = reserveItems - unreserve;
}
public int getReservedAmount(){
return reserveItems;
}
public String getName() {
return name;
}
public int quantityInStock() {
return quantity;
}
public double getPrice() {
return price;
}
public void adjustStock(int quantity) {
this.quantity = this.quantity + quantity - this.reserveItems;
}
public final void setPrice(double price) {
if (price > 0.0)
this.price = price;
}
public static StockItem MakeKey(String name, double price, int quantityStock){
return new StockItem(name,price,quantityStock);
}
@Override
public int compareTo(StockItem o) {
if (this == o){
return 0;
}
if (o != null){
return this.name.compareTo(o.getName());
}
throw new NullPointerException();
}
public String toString(){
return "Item Name: " + this.name + " Item Price: " + this.price;
}
}
任何帮助都会非常感谢你。
答案 0 :(得分:0)
没有 TreeMap
的 Comparator
(例如在您的示例中)根据其对象的 compareTo
方法是否认为项目相等来进行查找:
排序映射使用其compareTo
(或compare
)方法执行所有键比较,因此从排序映射的角度来看,此方法认为相等的两个键是相等的。< /p>
由于 StockItem
的 compareTo
在 name
值相等时返回 true,并且由于“key”项包含 name
值,因此按键查找地图返回相应的项目,因为“关键”对象被地图认为等于整个对象。
关于它如何工作以及它是否遍历每个对象的问题的答案可以从 TreeMap
的 Javadocs 中确定:
基于红黑树的 NavigableMap 实现。
[...]
此实现为 containsKey
、get
、put
和 remove
操作提供有保证的 log(n) 时间成本。算法改编自 Cormen、Leiserson 和 Rivest 的算法简介。
如前所述,查找是使用 red–black tree 执行的。其工作原理的细节超出了本答案合理适合的范围。然而,get
方法被定义为 log(n) time cost 的事实告诉我们,它不会迭代列表中的所有元素,因为对所有元素的迭代将是一个更昂贵的 n时间成本。