Java HashMap put方法不起作用[重复]

Posted

技术标签:

【中文标题】Java HashMap put方法不起作用[重复]【英文标题】:Java HashMap put method isn't working [duplicate] 【发布时间】:2018-08-25 15:33:48 【问题描述】:

我正在尝试使用HashMap 创建PhoneBook。 但是我看到我的addPhone 方法不会将新手机添加到我的PhoneBook pbdata.put(name, num); 我的addPhone 中的方法不会将数据放入HashMap data

谁能解释一下这里出了什么问题?

UPD 现在我明白这是一个错误,我使用了containsValue 方法而不是containsKey。如此简单! 但是这个问题与建议的已经存在的问题完全不同。我不是在问Is checking for key existence in HashMap always necessary? 我知道根据键或值搜索HashMap 的方法。这个问题实际上是由一个错误引起的。但是,我在这里收到了非常广泛且有用的答案。我相信这些答案,尤其是 davidxxx 的答案非常好,可能对很多人有用。

import java.util.HashMap;


public class PhoneBook 

        private HashMap<String, String> data;

        public PhoneBook() 
         
            data = new HashMap<String, String>(); 
         
        public void addPhone(String name, String num) 
         
            data.put(name, num); 
        


        //a
        public String getPhone(String name)
            if(data.containsValue(name))
                return data.get(name);
            
            else 
                return null;
        

        //b
        public void ToString()
            data.toString();
        

        public static void main(String[] args) 

            PhoneBook pb = new PhoneBook();
            pb.addPhone("shlomi", "12312413yuioyuio24");
            pb.addPhone("shlomi1", "1231345345241324");
            pb.addPhone("shlomi2", "12312445735671324");
            System.out.println(pb.getPhone("shlomi"));
            System.out.println(pb.getPhone("blat"));
            pb.ToString();
    

【问题讨论】:

【参考方案1】:

您提供作为data.containsValue(name) 键的名称而不是值。 如果您想根据类客户端的键返回值,您需要的是Map.containskey()

请注意,不需要处理映射中的存在,因为返回了 null,因为键不存在映射:

public String getPhone(String name)       
     return data.get(name);      


旁注

不是问题中的问题,而是要处理的任何问题。ToString() 对于方法来说确实不是一个好名字:

public void ToString()
    data.toString();

方法名称是区分大小写的,是的,但是定义与Object.toString() 方法略有不同的命名(这里是T 大写)并不是一个公平的理由。它使代码阅读具有误导性。 此外,您的方法什么也不返回。所以这很无奈:pb.ToString();

你应该声明的是:

@Override
public String toString()
    return data.toString();

添加@Override 会添加一个编译约束,以检查该方法是否在层次结构中定义。

现在您可以例如在标准输出中以这种方式写入您的PhoneBook 对象的toString() 表示:

System.out.println(pb);

【讨论】:

@Eliyahu 不客气 :) 我添加了一个额外的示例来使用客户端的 toString(),因为如果您不利用返回的字符串,仅调用 pb.ToString() 仍然无用。 【参考方案2】:

HashMap 将键映射到值,因此它包含键值对。

containsValue() 如果 map 将一个或多个键映射到指定的

,则返回 true

containsKey() 如果 map 包含指定 key

的映射,则返回 true

您的案例有 name 作为键和 num 作为值。在getPhone() 方法中,您有对应于name 的参数,因此您应该使用containsKey() 而不是containsValue()

【讨论】:

【参考方案3】:

data.containsValue(name) 检查HashMap 是否包含 name。由于您的 HashMap 包含名称 keys 和数字 values,因此您应该调用 data.containsKey(name)

public String getPhone(String name)
    if(data.containsKey(name)) 
        return data.get(name);
     else 
        return null;

或者干脆

public String getPhone(String name) 
    return data.get(name);

【讨论】:

以上是关于Java HashMap put方法不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

重复Java的结构(键,值)

HTML表单PUT方法[重复]

Java数据结构系列——HashMap的常见方法

关于java中HashMap的put方法中的参数问题

P8 Java 13中 HashMap的 put方法

Java中HashMap的put与get方法原理