Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的哈希映射中的值与放入的值不同?_Java_Hashmap - Fatal编程技术网

Java 为什么我的哈希映射中的值与放入的值不同?

Java 为什么我的哈希映射中的值与放入的值不同?,java,hashmap,Java,Hashmap,我有一个哈希映射,它似乎在改变我存储在其中的值。几乎我所有的键都映射正确;但是,在entrySet()中,大约有4或5个键的值与实际放置的值完全不同。我完全不知所措 public static void main(String args[]){ HashMap<Character, Integer> map = make_map(); System.out.print(map.entrySet()); } public static HashMap<Characte

我有一个哈希映射,它似乎在改变我存储在其中的值。几乎我所有的键都映射正确;但是,在
entrySet()
中,大约有4或5个键的值与实际放置的值完全不同。我完全不知所措

public static void main(String args[]){
  HashMap<Character, Integer> map = make_map();
  System.out.print(map.entrySet());

}

public static HashMap<Character,Integer> make_map(){
  HashMap<Character, Integer> map = new HashMap<>();


  map.put('a',100000);
  map.put('b',110000);
  map.put('c',100100);
  map.put('d',100110);
  map.put('e',100010);

  map.put('f',110100);
  map.put('g',110110);
  map.put('h',110010);
  map.put('i',010100);
  map.put('j',010110);

  map.put('k',101000);
  map.put('l',111000);
  map.put('m',101100);
  map.put('n',101110);
  map.put('o',101010);

  map.put('p',111100);
  map.put('q',111110);
  map.put('r',111010);
  map.put('s',011100);
  map.put('t',011110);

  map.put('u',101001);
  map.put('v',111001);
  map.put('w',010111);
  map.put('x',101101);

  map.put('y',101111);
  map.put('z',101011);
  map.put(' ',000000);



  return map;

} 

正如您所看到的,“t”和“s”的意图不如前面提到的其他。发生了什么?

您看到了这个结果,因为您的值以
0
开头,表示为八进制数,以8为基数。

您看到了这个结果,因为您的值以
0
开头,表示为八进制数,以8为基数。

正如您所发现的,在整数前面放一个前导零存在问题;Java将其视为一个八进制数,即基数8

这是第一个问题。你输入的数字不是你想要的基数2,而是基数8

这很容易解决;当您将这些数字放入地图时,您只需确保它们被解析为二进制

map.put('a', Integer.parseInt("100000", 2));
打印这些数字将为您提供完整的整数表示。这是第二个问题,;打印出集合不会以标准数字类型表示之外的任何其他形式转换或格式化数据

如果要将它们打印为十六进制值,则需要使用
Integer.tobinarysting

这也可以通过Java8的流API轻松实现

map.entrySet().forEach((entry) -> System.out.printf("%s=%s ", entry.getKey(), Integer.toBinaryString(entry.getValue())));

正如您所发现的,在整数前面放一个前导零有一个问题;Java将其视为一个八进制数,即基数8

这是第一个问题。你输入的数字不是你想要的基数2,而是基数8

这很容易解决;当您将这些数字放入地图时,您只需确保它们被解析为二进制

map.put('a', Integer.parseInt("100000", 2));
打印这些数字将为您提供完整的整数表示。这是第二个问题,;打印出集合不会以标准数字类型表示之外的任何其他形式转换或格式化数据

如果要将它们打印为十六进制值,则需要使用
Integer.tobinarysting

这也可以通过Java8的流API轻松实现

map.entrySet().forEach((entry) -> System.out.printf("%s=%s ", entry.getKey(), Integer.toBinaryString(entry.getValue())));

以0开头的数字文字被解析为八进制数(以8为基数)。也许你应该使用一个
HashMap
。这个副本解释了为什么会出现这样的结果,但并没有提供任何解决方案来解决这个问题。从0开始的数字文本被解析为八进制数(以8为基数)。也许您应该使用一个
HashMap
。这个副本解释了为什么会出现这样的结果,但并没有提供任何解决方案来解决这个问题。