asp做的药店网站模板,同城版网站建设,网站域名批量查询,商城首页网站HashMap基于哈希算法工作#xff0c;根据Java文档HashMap具有以下四个构造函数#xff0c; 建设者 描述 HashMap () 构造一个空的 具有默认初始容量#xff08;16#xff09;和默认加载因子#xff08;0.75#xff09;的HashMap 。 HashMap (int initialCapaci… HashMap基于哈希算法工作根据Java文档HashMap具有以下四个构造函数 建设者 描述 HashMap () 构造一个空的 具有默认初始容量16和默认加载因子0.75的HashMap 。 HashMap (int initialCapacity) 构造一个空的 具有指定初始容量和默认加载因子0.75的HashMap 。 HashMap (int initialCapacity, float loadFactor) 构造一个空的 具有指定初始容量和负载因子的HashMap 。 HashMap ( Map ? extends K ,? extends V m) 构造一个新的 HashMap具有与指定相同的映射 Map 。 让我们编写一个简单的Java程序以检查Map在内部如何工作 创建一个简单的Map并为其添加一个键和值 public static void main(String[] args) {MapInteger, String map new HashMap();map.put(1, Java);} 我们刚刚创建了简单映射将键作为整数将值作为字符串并添加了“ 1”作为键和“ Java”作为值。 通过使用eclipse调试功能我们可以查看地图中的内容 它创建了16个块0-15并插入了第一个块其键为整数“ 1”值为字符串“ Java”。 请选中红色框其余所有都用null初始化的框。 2.将第二个键和值添加到同一地图 public static void main(String[] args) {MapInteger, String map new HashMap();map.put(1, Java);map.put(2, Angular);} 让我们再次在Eclipse调试中查看地图 现在地图包含了两个键1,2和两个值“ Java”“ Angular”但这些键分别分别精确地添加到了第一个块和第二个块为什么 因为我们知道Map是基于哈希算法工作的所以每当我们插入要映射的键时它都会根据hashCode的值调用Objecthashcode方法它将把键插入该块中。 在上述情况下Integer类使用其原始int值覆盖hashCode这就是为什么1java存储在第一个块中而2Angular存储在第二个块中的原因。 3.让我们对自己的班级做同样的实验 创建一个简单的Employee类如下所示 private static class Employee{
int id;
String name;Employee(int id, String name){
this.id id;
this.name name;
}
} 使用此类作为地图的键并进行相同的检查 public static void main(String[] args) {
MapEmployee, String map new HashMap(10);
map.put(new Employee(1, Ramesh), Java);
map.put(new Employee(2, Sathish), Angular);
} 我们添加了两个键作为Employee对象将Values作为字符串添加让我们看看这次存储在哪个块中的键 这次它存储在第8个块和第14个块中为什么由于Employee对象的hashCode而给出简单答案以确认这一点让Employee的hashCode重写为常数值并检查映射。 如果我们的分析正确则必须将所有密钥存储在同一块中。 相应地更新Employee类 private static class Employee{
int id;
String name;
Employee(int id, String name){
this.id id;
this.name name;
}
Override
public int hashCode() {
return 10;
}
} 我们不需要对地图进行任何更改现在让我们看看密钥的存储位置 是的只有第10个块充满了两个对象为什么 因为两个雇员对象都返回相同的hashCode即10。 但是Map如何识别这两个对象不是重复的 我们从内部知道MapKey是entrySetjava.util.Set它调用equals方法来验证密钥是否重复。 同时从Map中检索值时首先将检查给定键的hashCode并基于该哈希码将转到该块在找到该块之后它将调用equals以获取确切值。 因此完全不建议将hashCode重写为constant 。 当我们覆盖hashCode时我们也不应忘记覆盖equals方法 即hashCode/ equals合约。 翻译自: https://www.javacodegeeks.com/2017/11/java-hashmap-detail-explanation.html