Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 使用对象或整数作为HashMap键更好吗?_Java_String_Hash_Hashmap_Key - Fatal编程技术网

Java 使用对象或整数作为HashMap键更好吗?

Java 使用对象或整数作为HashMap键更好吗?,java,string,hash,hashmap,key,Java,String,Hash,Hashmap,Key,在java的HashMap中,对象的散列是如何工作的?我在想,与字符串相比,使用整数作为键是否更有效,或者这并不重要 如果我有: String str = "hello"; Object helloObject = new Object(); 如果是字符串,什么更好?使用整数键: HashMap<Integer, Object> hashes = new HashMap<Integer, Object>(); hashes.put(str.hashCode(), hel

在java的HashMap中,对象的散列是如何工作的?我在想,与字符串相比,使用整数作为键是否更有效,或者这并不重要

如果我有:

String str = "hello";
Object helloObject = new Object();
如果是字符串,什么更好?使用整数键:

HashMap<Integer, Object> hashes = new HashMap<Integer, Object>();
hashes.put(str.hashCode(), helloObject);
HashMap hashes=newhashmap();
put(str.hashCode(),helloObject);
还是使用字符串键

HashMap<String, Object> hashes = new HashMap<String, Object>();
hashes.put(str, helloObject);
HashMap hashes=newhashmap();
put(str,helloObject);

从插入和搜索的角度来看,什么更有效?

您不应该关心这方面的效率。您需要关心的是您拥有的用例。在适当的地方使用
Integer
s和
String
s


如果您希望了解其内部工作原理,请查看。它基本上都是关于
hashCode()
equals()
的实现。请注意,密钥也必须是不可变的。

请记住,具有相同哈希代码的两个字符串可能不相等

如果使用字符串的哈希代码而不是字符串本身,那么两个不同的字符串可能会产生相同的映射键,这可能会导致奇怪的行为

试试这个代码,看看我的意思

Map<Integer, String> map = new HashMap<Integer, String>();
map.put("FB".hashCode(), "FB");
map.put("Ea".hashCode(), "Ea");

System.out.println(map.get("FB".hashCode()));
因为

"FB".hashCode() == "Ea".hashCode() // is true

因此,您最好使用
字符串作为键。

视情况而定。如果您知道您将只对整数使用它,那么就使用Integer。如果您计划填充所有类型的数据/对象,那么请使用对象,并可能使用某种类型的值解析器


tl;dr:它将只填充整数吗?-->将其定义为整数映射,否则使用Object。

正确的第一件事应该是正确性,而不是效率:这段代码

HashMap<Integer, Object> hashes = new HashMap<Integer, Object>();
hashes.put(str.hashCode(), helloObject);
HashMap hashes=newhashmap();
put(str.hashCode(),helloObject);
不正确(除了效率低下*)

回想一下,散列码不是唯一的。唯一的要求是相同对象的哈希代码相同。但是,具有相同哈希代码的对象不一定相等。因此,将哈希映射的键从
String
更改为
Integer
会改变语义:根据哈希代码,两个完全不同的对象可能会被视为完全任意的同一个键



*如果您想知道为什么上面的代码段效率低下,那么会出现自动装箱:
hashCode()
返回一个原语
int
,编译器将其包装在
java.lang.Integer
中。这通常会导致在使用
字符串时没有创建其他对象的情况下创建不需要的对象,您只需确保HashKey Integer或String是唯一的。搜索是
大O符号中的O(1)
。它根据键直接指向它。这个O(1)是使用HashMap的要点。我确实想知道为什么没有一个答案提到关于搜索HashMap的
Big O表示法
。@user2860598我想知道你为什么用这样一个错误和混乱的例子提到它。“哈希键整数或字符串是唯一的”。“它根据键直接指向它”。如果可能的话,我会投你的反对票。
HashMap<Integer, Object> hashes = new HashMap<Integer, Object>();
hashes.put(str.hashCode(), helloObject);