我正在尝试理解以下代码,acct1
和acct2
是代表“银行帐户”的对象。
HashMap map = new HashMap();
map.put(acct1.hashCode(), acct1);
map.put(acct2.hashCode(), acct2);
for (Object o : map.values())
{
System.out.println(o);
}
for (Object o : map.keySet())
{
System.out.println(o);
}
根据BankAccount
API,方法hashCode()
会返回int
,这应该是帐户的哈希值。
那么这不意味着keySet()
创建的集合包含整数吗?如果是这样,为什么第二个for-each
迭代器将其成员声明为Object
。当我尝试将Object
切换为int
时,我遇到了编译错误。
答案 0 :(得分:1)
map.put(...)隐式地对整数进行自动装箱,而整数也是一个对象,所以第二个就好了。如果你显式地转换为Integer而不是int你的Object(int是一个基本类型并且会产生编译错误)它可以工作:
@Test
public void mytest(){
Object acct1 = new Object();
Object acct2 = new Object();
HashMap map = new HashMap();
map.put(acct1.hashCode(), acct1);
map.put(acct2.hashCode(), acct2);
for (Object o : map.values())
{
System.out.println(o);
}
for (Object o : map.keySet())
{
System.out.println(o);
System.out.println((Integer)o);
}
}
编辑: 请注意,需要在for-each中使用Object,因为编译器不知道哪个特定对象存储为键,因此它使用Object,即"类的根层次结构。每个类都将Object作为超类" (javadoc)。
如果要在for-each中使用Integer,则需要向编译器提示这是一个Map< Integer,Object>,只需使用泛型语法。这段代码将编译:
@Test
public void mytest(){
Object acct1 = new Object();
Object acct2 = new Object();
HashMap<Integer, Object> map = new HashMap<>();
map.put(acct1.hashCode(), acct1);
map.put(acct2.hashCode(), acct2);
for (Object o : map.values())
{
System.out.println(o);
}
for (Integer o : map.keySet())
{
System.out.println(o);
}
}