Java 如果我没有';你没把它放进去吗?

Java 如果我没有';你没把它放进去吗?,java,hashmap,Java,Hashmap,首先我想说我是地图界面的新手,昨天开始学习,我发现了这个程序 public class maptest{ public static void main(String[] args) { Map<String, Integer> m = new HashMap<String, Integer>(); String argss[]={"i","came","i","left","i","saw"}; for (String a :

首先我想说我是地图界面的新手,昨天开始学习,我发现了这个程序

    public class maptest{


    public static void main(String[] args) {
    Map<String, Integer> m = new HashMap<String, Integer>();
    String argss[]={"i","came","i","left","i","saw"};
    for (String a : argss) {
        Integer freq = m.get(a);
        m.put(a, (freq == null) ? 1 : freq + 1);
     }

     System.out.println(m.size() + " distinct words:");
     System.out.println(m);

     }
     }
公共类映射测试{
公共静态void main(字符串[]args){
Map m=新的HashMap();
字符串argss[]={“i”、“come”、“i”、“left”、“i”、“saw”};
for(字符串a:argss){
整数频率=m.get(a);
m、 put(a,(freq==null)?1:freq+1;
}
System.out.println(m.size()+“不同的单词:”);
系统输出打印项次(m);
}
}
它的输出是

4个不同的词: {saw=1,left=1,come=1,i=3}

我想知道我还没有在地图上放任何东西,我刚刚声明了一个字符串数组,所以我怎么能使用它呢

m、 获得(a)

因为我的映射中没有任何内容。我只能通过put方法将某些内容放入映射。

执行示例 第一步详细信息(get) 在第一步中,
m.get(a)
如果没有与
a
关联的值,则只返回
null
。换句话说,如果你从未遇到过一个单词,你还没有任何频率,因此你在这里得到
null

Integer freq = m.get(a); // returns null if a is not associated
但是,如果已经遇到了这个词,我们确实在映射中添加了非空的内容(频率)。因此,您可以获得与该键关联的频率

注意:a
null
值可能意味着“
null
a
关联”(不仅“
a
不在映射中”)。但是,我们从不将
null
作为任何键的值(请参阅下一节)

第二步详细信息(put) 这是使用*:如果
freq
null
,则在映射中放入1;如果
freq
不为null,则放入
freq+1

m.put(a, (freq == null) ? 1 : freq + 1);
我们在映射中输入的值与
a
当前持有的键相关联,替换以前的任何值。稍后对
get()
的调用将返回我们刚刚输入的新值



(*)这样的构造:
条件?value\u if\u true:value\u if\u false

在for循环中,如果元素在映射中,则可以预先测试,如果元素不在映射中,则将频率为0的元素放入其中

for (String a : argss) {
    if(m.get(a) == null) {
        m.put(a,0);
    }
    Integer freq = m.get(a);
    m.put(a, freq + 1);
 }
这个循环

for (String a : argss) {
  Integer freq = m.get(a); 
  m.put(a, (freq == null) ? 1 : freq + 1);
}
在freq中以null开头,但put随后使用三元表达式将null转换为1,其作用类似于if-

// m.put(a, (freq == null) ? 1 : freq + 1);
if (freq == null) {
  m.put(a, 1);
} else {
  m.put(a, freq + 1);
}
编辑

从(emphasis mine)-
返回指定键映射到的值,或null(如果此映射不包含键的映射)

null
是“非值”的概念。如果您想防范它,您可以测试映射是否包含具有给定键的值。这种方法是逐行的 m、 获得(a);您正在获取值。对于第一种情况,它为null

现在通过电话线 m、 put(a,(freq==null)?1:freq+1

您正在输入一个值(来自字符串数组),如果freq==null,则在值中添加1。
如果不为空,则将频率值增加1

对于HashMap,空值是可能的。确保没有值与键关联的方法是
containsKey(key)
方法返回false。@anonymous这是真的,但我没有说
null
value意味着没有键。我刚才说另一个暗示是真的。我认为这与OP的问题无关。我相信OP只是想知道在没有添加键的情况下如何使用
get()
。我将您的单词
解释为如果没有与
关联的值,则返回null,因为键在映射中不存在。只有当key不在HashMap中时,才会出现与key相关联的值。@anonymous我没有说
如果且仅当
@TruePS你说的那么它会得到“a”-请注意,
a
只是变量名。它实际上保存了数组中的一个值(每个循环都有一个不同的值。每个唯一的字都有一个值(因为这里freq为null,所以发生这种情况时,代码会将值1放在这里)。对于“i”你得到了3,因为你首先输入1,然后接下来的两倍freq表示之前的输入值,你再加1两次,使之为3。你的问题到底是什么?我不明白你没有做到什么。@Joffrey我不知道输出是如何来的,我没有得到两行我们获取和输入值的地方。@Shivan它是如何得到的区分那个词是否不同。@TruePS也许我的回答会对此有所帮助。如果你不明白什么,请随时询问。它是如何区分不同的词和非不同的词的。编辑以尝试为你澄清这一点。谢谢你的评论,但我只想知道上面程序的工作。这个程序是如何被编辑的在映射中,当我们再次插入同一个键时,它会覆盖上一个键。这就是为什么它只打印“i”的单个值,而不是打印3次。我知道m.size是4,但i=3,come=1等是如何打印的。m.get(“come”)将给出null.m.put(a,(freq==null)?1:freq+1);所以如果null,它将增加1。现在对于i;在开始m.get(“i”)=null时,它将增加1,所以m.put(“i”,1)现在m.get(“i”)将给出1。现在m.put(“i”,2):2,因为增加1,以此类推。
// m.put(a, (freq == null) ? 1 : freq + 1);
if (freq == null) {
  m.put(a, 1);
} else {
  m.put(a, freq + 1);
}