HashMap / Hashtable未在for循环中返回int作为键值

时间:2018-11-11 00:14:57

标签: java hashmap hashtable

当我尝试在for循环中访问map.get(c)时(如版本2所示),它返回空值并将上限设置为空,从而导致空指针异常。另一方面,如果我创建结束变量并为其分配map.get(c)值(如版本1中所示),则可以正常工作。所以,你能解释一下为什么吗?

版本1:效果很好

    int count=0;
    int st=0;
    string s = "abcabcbb";

    Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

    char[] str = s.toCharArray();
    for(int i=0; i<str.length; i++){
        char c = str[i];
        if(map.get(c)==null){
            map.put(c, i);

            if(count < map.get(c) - st + 1){
                count = map.get(c) - st + 1;
            };
        }


        else {
            int end = map.get(c);     // End variable --> returns int value as expected

            for(int j=st; j<=end; j++){
                map.remove(str[j]);
                st = j+1;
            }
            map.put(c,i);
        }

    }

    System.out.println(count);

版本2:提供了空指针异常

    int count=0;
    int st=0;
    string s = "abcabcbb";

    Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

    char[] str = s.toCharArray();
    for(int i=0; i<str.length; i++){
        char c = str[i];
        if(map.get(c)==null){
            map.put(c, i);

            if(count < map.get(c) - st + 1){
                count = map.get(c) - st + 1;
            };
        }


        else {
            //int end = map.get(c);     // End variable commented

            for(int j=st; j<=map.get(c); j++){   // replaced end w map.get(c) --> returns null instead of int
                map.remove(str[j]);
                st = j+1;
            }
            map.put(c,i);
        }

    }

    System.out.println(count);

谢谢您的帮助! 罗汉。

1 个答案:

答案 0 :(得分:1)

for循环运行直到不满足其条件为止(在您的情况下,直到j <= map.get(c)false)。此条件也未缓存,如以下代码的输出所示:

public static void main(String[] args) {
    for (int i = 0; i < getCondition(); i++) {

    }
}

private static int getCondition() {
    System.out.println("Test");
    return 3;
}

输出:

Test
Test
Test
Test

因此,将为for循环的每次迭代调用map.get(c)。如果您恰巧从c中删除键为map的条目,则Map#get返回的值为null,这就是NullPointerException的原因。 / p>