自己写一个Map

public class WhalesonMap<K,V> {

   Entry<K,V> [] tab;

   private int CAPACITY = 1 << 4;//6

   @AllArgsConstructor
   @NoArgsConstructor
   @Data
   public class Entry<K,V>{

       private K key;

       private V value;

       private Entry<K,V> next;

   }

   public void put(K key, V value){

       if(tab == null){
           initialize();
       }
       int keyHashCode = toHash( key );
       int index = indexFor(keyHashCode);

       for (Entry<K,V> entry = tab[index]; entry != null; entry = entry.next){
           if(entry.key.equals(key)){

               entry.key = key;
           }
       }
       addEntry(key,value,index);

   }

   public V get(K k){
       int hash = toHash(k);
       int index = indexFor(hash);
       Entry<K,V> tempEntry = tab[index];
       if(tempEntry == null){
           throw new NullPointerException("No exist k in tab");
       }
       return tempEntry.getValue();
   }

   private void addEntry(K key, V value, int index) {
       Entry<K,V> entry = new Entry<>(key,value,tab[index]);
       tab[index] = entry;
   }

   private int indexFor(int keyHashCode) {
       //也可以用数组长度取模
       return keyHashCode % tab.length ;
   }

   public void initialize(){
       tab = new Entry[CAPACITY];
   }

   public int toHash(K k){
       return k.hashCode();
   }
}
<think>我们注意到用户的问题是关于“Map的add方法”的。但需要澄清的是:Map接口本身没有名为“add”的方法。Map中用于添加元素的标准方法是`put(key,value)`。用户可能受到其他集合(如List的add方法)的影响而产生混淆。根据引用[1]和[3]中的Java示例,以及引用[2]中的Go示例,我们可以推断用户实际上是想了解如何向Map添加元素并遍历Map。下面将分别用Java和Go两种语言进行说明。###Java中Map添加元素与遍历在Java中,使用`put(key,value)`方法向Map添加元素。遍历Map的常见方式有:1.**遍历键值对(Entry)**:使用`Map.entrySet()`获取键值对集合,然后遍历。2.**遍历键**:使用`Map.keySet()`获取键集合,再通过键获取值。3.**遍历值**:使用`Map.values()`,但注意这样只能获取值,无法获取键。####示例代码(Java):```javaimportjava.util.HashMap;importjava.util.Map;publicclassMapExample{publicstaticvoidmain(String[]args){//创建MapMap<String,Integer>map=newHashMap<>();//添加元素:使用put方法map.put("apple",10);map.put("banana",20);map.put("orange",15);//方法1:遍历键值对(推荐)System.out.println("===遍历键值对===");for(Map.Entry<String,Integer>entry:map.entrySet()){Stringkey=entry.getKey();Integervalue=entry.getValue();System.out.println(key+":"+value);}//方法2:遍历键,再通过键获取值System.out.println("===遍历键===");for(Stringkey:map.keySet()){Integervalue=map.get(key);System.out.println(key+":"+value);}//方法3:遍历值(不包含键)System.out.println("===遍历值===");for(Integervalue:map.values()){System.out.println("Value:"+value);}}}```###Go中Map添加元素与遍历在Go语言中,使用`map[key]=value`语法添加元素。遍历Map使用`forrange`循环。####示例代码(Go):```gopackagemainimport"fmt"funcmain(){//创建Mapm:=make(map[string]int)//添加元素m["apple"]=10m["banana"]=20m["orange"]=15//遍历Mapfmt.Println("===遍历键值对===")forkey,value:=rangem{fmt.Printf("%s:%d\n",key,value)}//仅遍历键fmt.Println("===遍历键===")forkey:=rangem{fmt.Println("Key:",key)}//仅遍历值(使用匿名变量忽略键)fmt.Println("===遍历值===")for_,value:=rangem{fmt.Println("Value:",value)}}```###关键点总结|**操作**|**Java方法**|**Go方法**||--------------|----------------------|-------------------------||**添加元素**|`map.put(key,value)`|`map[key]=value`||**遍历**|`entrySet()`+for循环|`forkey,value:=rangemap`|>**注意**:在遍历过程中修改Map(添加或删除元素)可能导致未定义行为。在Java中,直接使用`Iterator`进行删除是安全的(引用[4][5])。在Go中,遍历时删除元素是安全的,但添加元素可能导致运行时错误。###相关问题1.如何在遍历Map时安全地删除元素(Java和Go)?2.Map的键有什么限制?例如Java中键对象必须实现哪些方法?3.如何实现线程安全的Map操作(如ConcurrentHashMap)?[^1]:Java遍历Map五种方法[^2]:Go语言Map操作示例[^3]:List集合转Map并遍历输出</think>在 Java 中,Map 接口本身**没有名为 `add` 的方法**。添加元素到 Map 的标准方法是使用 `put(key, value)`。以下是如何正确添加元素并遍历 Map 的详细解释和示例: ### 添加元素到 Map 的方法 Map 使用 `put(key, value)` 方法添加元素: - 如果键不存在:添加新键值对 - 如果键已存在:更新对应的值 ```java Map<String, Integer> map = new HashMap<>(); // 添加元素 map.put("apple", 10); // 添加新键值对 map.put("banana", 20); // 添加新键值对 map.put("apple", 15); // 更新"apple"的值(10→15) ``` ### 遍历 Map 的三种常用方式 #### 1. 遍历键值对(推荐) ```java for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + ": " + value); } // 输出: // apple: 15 // banana: 20 ``` #### 2. 单独遍历键 ```java for (String key : map.keySet()) { Integer value = map.get(key); // 通过键获取值 System.out.println(key + " -> " + value); } ``` #### 3. 单独遍历值 ```java for (Integer value : map.values()) { System.out.println("Value: " + value); } // 输出: // Value: 15 // Value: 20 ``` ### 完整示例代码 ```java import java.util.HashMap; import java.util.Map; public class MapExample { public static void main(String[] args) { // 创建Map并添加元素 Map<String, Integer> fruitMap = new HashMap<>(); fruitMap.put("Apple", 5); fruitMap.put("Orange", 8); fruitMap.put("Banana", 12); fruitMap.put("Apple", 7); // 更新Apple的值 // 遍历方式1:键值对遍历 System.out.println("=== 键值对遍历 ==="); for (Map.Entry<String, Integer> entry : fruitMap.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } // 遍历方式2:键遍历 System.out.println("\n=== 键遍历 ==="); for (String fruit : fruitMap.keySet()) { System.out.println(fruit + " -> " + fruitMap.get(fruit)); } } } ``` ### 输出结果: ``` === 键值对遍历 === Apple: 7 Orange: 8 Banana: 12 === 键遍历 === Apple -> 7 Orange -> 8 Banana -> 12 ``` ### 重要注意事项 1. **Map 没有 `add()` 方法** 添加元素始终使用 `put(key, value)` 2. **遍历时修改 Map** 直接遍历时修改会抛出 `ConcurrentModificationException`[^5]。安全修改方式: ```java // 使用迭代器安全删除 Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); if ("Apple".equals(entry.getKey())) { iterator.remove(); // 安全删除 } } ``` 3. **键的唯一性** Map 的键是唯一的,重复 `put()` 会覆盖旧值 ### 相关问题 1. 如何在遍历 Map 时安全删除元素? 2. Java 中 Map 和 List 的主要区别是什么? 3. 如何实现按键或值排序的 Map(如 TreeMap)? [^1]: Java遍历Map方法 [^2]: Map操作示例 [^5]: Map遍历时删除元素的安全方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值