Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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
HashMap没有添加重复的键 import java.util.*; U类{ int x; U(整数x){ 这个.x=x; } } 公共类别G{ 公共U a=新U(22); 公共U b=新U(23); 整数y=22; 整数r=23; 作废{ Map set=newhashmap(); 集合。放置(a,y); 集合。放置(a,r); 集合。放置(b,y); System.out.print(set.size()+); } 公共静态void main(字符串[]args){ G m=新的G(); m、 a(); } }_Java_Collections_Hashmap_Scjp - Fatal编程技术网

HashMap没有添加重复的键 import java.util.*; U类{ int x; U(整数x){ 这个.x=x; } } 公共类别G{ 公共U a=新U(22); 公共U b=新U(23); 整数y=22; 整数r=23; 作废{ Map set=newhashmap(); 集合。放置(a,y); 集合。放置(a,r); 集合。放置(b,y); System.out.print(set.size()+); } 公共静态void main(字符串[]args){ G m=新的G(); m、 a(); } }

HashMap没有添加重复的键 import java.util.*; U类{ int x; U(整数x){ 这个.x=x; } } 公共类别G{ 公共U a=新U(22); 公共U b=新U(23); 整数y=22; 整数r=23; 作废{ Map set=newhashmap(); 集合。放置(a,y); 集合。放置(a,r); 集合。放置(b,y); System.out.print(set.size()+); } 公共静态void main(字符串[]args){ G m=新的G(); m、 a(); } },java,collections,hashmap,scjp,Java,Collections,Hashmap,Scjp,我总是对地图和列表感到困惑。 我知道,当map在集合中放置键时,它调用hashcode,如果bucket相同,则调用equal方法。但是,我了解到,如果类重写这两个方法,则只会不存储重复的键。例如,wrapper类:String实现它自己的hashcode和equal方法。此外,如果不这样做,将调用唯一的哈希代码,并在集合中存储重复的密钥 但在上面的示例中,类U并没有实现hashcode和equal方法。但是,Map不允许复制关键点 我检查了尺寸:2号 它应该是3,因为我的U类既没有实现hash

我总是对地图和列表感到困惑。 我知道,当map在集合中放置键时,它调用hashcode,如果bucket相同,则调用equal方法。但是,我了解到,如果类重写这两个方法,则只会不存储重复的键。例如,wrapper类:String实现它自己的hashcode和equal方法。此外,如果不这样做,将调用唯一的哈希代码,并在集合中存储重复的密钥

但在上面的示例中,类U并没有实现hashcode和equal方法。但是,Map不允许复制关键点

我检查了尺寸:2号 它应该是3,因为我的U类既没有实现hashcode也没有实现equal

请澄清我的问题


提前感谢

HashMap不允许重复密钥

如果您不提供
hashcode()
equals()
实现,它将
从超类扩展它(对于您的例子,它是
java.lang.Object
),并且该实现为同一对象提供相同的hashcode,并且在同一对象上返回
true

import java.util.*;

class U {
    int x;

    U(int x) {
        this.x = x;
    }
}

public class G {
    public U a = new U(22);
    public U b = new U(23);
    Integer y = 22;
    Integer r = 23;

    void a() {
        Map<U, Integer> set = new HashMap<U, Integer>();
        set.put(a, y);
        set.put(a, r);
        set.put(b, y);
        System.out.print(set.size() + " ");
    }

    public static void main(String[] args) {
        G m = new G();
        m.a();
    }
}

同样

您将同一个
U
实例用作键两次:

public boolean equals(Object obj) {
    return (this == obj);
}
您的
U
类没有实现您提到的
hashCode()
,因此默认实现是
Object#hashCode
,这显然是相同的,因为它是相同的实例。因此,映射将只包含第二个条目。但是,如果您尝试以下操作,您将得到两个单独的条目:

set.put(a, y);
set.put(a, r);

但通常,对于用作映射键的任何类,您都希望实现
equals()
hashCode()
,否则,如果不访问存储为该值的确切实例,就无法查找该值

按设计哈希映射不会添加重复的键。它将用该键替换映射中当前项的值。请参见

如果要添加重复键,请尝试以下操作:

set.put(new U(22), y);
set.put(new U(22), r);
Map Map=newhashmap();
put(1,newarraylist());
map.get(1)、add(1);
map.get(1)、add(2);

这可能是一个愚蠢的问题,但在没有访问它的引用的情况下向HashMap添加某些内容,这会不会有点违背其目的?@C.B.您通常希望使用的键不是通过标识,而是通过其内容相等。考虑使用字符串作为键:如果字符串的哈希代码对于每个实例都是完全唯一的,则必须跟踪存储在映射中的确切实例。但是,由于所有包含相同字符的字符串都具有相同的哈希代码,因此可以使用任何等效的字符串实例来查找它。
    Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();

    map.put(1, new ArrayList<Integer>());
    map.get(1).add(1);
    map.get(1).add(2);