Java HashMap put方法不起作用

Java HashMap put方法不起作用,java,hashmap,Java,Hashmap,我正在尝试使用HashMap创建一个电话簿。 但是,我看到我的addPhone方法没有将新电话添加到我的电话簿pb,即data.putname,num;我的addPhone中的方法不会将数据放入HashMap数据中 谁能解释一下这里出了什么问题吗 UPD 现在我明白这是一个错误,我使用了containsValue方法而不是containsKey。太简单了! 但这个问题与已经存在的问题完全不同。我不是在问,在HashMap中检查密钥是否存在总是必要的吗?我知道根据键或值搜索HashMap的方法。这

我正在尝试使用HashMap创建一个电话簿。 但是,我看到我的addPhone方法没有将新电话添加到我的电话簿pb,即data.putname,num;我的addPhone中的方法不会将数据放入HashMap数据中

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

UPD 现在我明白这是一个错误,我使用了containsValue方法而不是containsKey。太简单了! 但这个问题与已经存在的问题完全不同。我不是在问,在HashMap中检查密钥是否存在总是必要的吗?我知道根据键或值搜索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();
    }
}
data.containsValuename检查HashMap是否包含值名称。由于HashMap包含名称键和数字值,因此应该调用data.containsKeyname

或者干脆

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

您提供的名称是data.containsValuename的键,而不是值。 如果要根据类客户端的键返回值,则需要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会添加一个编译约束,用于检查该方法是否在层次结构中定义

现在,您可以通过以下方式在标准输出中写入电话簿对象的toString表示:

System.out.println(pb);

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

containsValue如果map将一个或多个键映射到指定值,则返回true

containsKey如果映射包含指定键的映射,则返回true


您的案例的名称为key,num为value。在方法getPhone中,您有一个对应于name的参数,因此您应该使用containsKey而不是containsValue

@Eliyahu欢迎您:我添加了一个额外的示例,从客户端使用toString,因为它只调用pb。如果不利用返回的字符串,toString仍然是无用的。
System.out.println(pb);