若map添加重复的key会怎样

若map添加重复的key会怎样,第1张

在使用map的时候,大家肯定会想到key-value,key用于检索value的内容。在正常情况下,可以不允许重复;但是其实重复在java中分为2中情况,一是内存地址重复,另一个是不同的地址但内容相等,而IdentityHashMap用于后者,即内容相等。更详细的解释如下:此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等(在正常 Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。

此类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。

例如:

class Person{

private String name

private int age

public Person(String name,int age){

this.name = name

this.age = age

}

public boolean equals(Object obj){

if(this==obj){

return true

}

if(!(obj instanceof Person)){

return false

}

Person p = (Person)obj

if(this.name.equals(p.name)&&this.age==p.age){

return true

}else{

return false

}

}

public int hashCode(){

return this.name.hashCode() * this.age

}

public String toString(){

return "姓名:" + this.name + ",年龄:" + this.age

}

}

HashMap情况:

public class IdentityHashMapDemo01{

public static void main(String args[]){

Map<Person,String>map = null // 声明Map对象

map = new HashMap<Person,String>()

map.put(new Person("张三",30),"zhangsan_1") // 加入内容

map.put(new Person("张三",30),"zhangsan_2") // 加入内容

map.put(new Person("李四",31),"lisi") // 加入内容

Set<Map.Entry<Person,String>>allSet = null // 准备使用Set接收全部内容

allSet = map.entrySet()

Iterator<Map.Entry<Person,String>>iter = null

iter = allSet.iterator()

while(iter.hasNext()){

Map.Entry<Person,String>me = iter.next()

System.out.println(me.getKey() + " -->" + me.getValue())

}

}

}

结果:相同的key内容,value会被覆盖

姓名:李四,年龄:31 -->lisi

姓名:张三,年龄:30 -->zhangsan_2

IdentityHashMap情况

public class IdentityHashMapDemo02{

public static void main(String args[]){

Map<Person,String>map = null // 声明Map对象

map = new IdentityHashMap<Person,String>()

map.put(new Person("张三",30),"zhangsan_1") // 加入内容

map.put(new Person("张三",30),"zhangsan_2") // 加入内容

map.put(new Person("李四",31),"lisi") // 加入内容

Set<Map.Entry<Person,String>>allSet = null // 准备使用Set接收全部内容

allSet = map.entrySet()

Iterator<Map.Entry<Person,String>>iter = null

iter = allSet.iterator()

while(iter.hasNext()){

Map.Entry<Person,String>me = iter.next()

System.out.println(me.getKey() + " -->" + me.getValue())

}

}

}

结果:相同的key内容(由于是new出来的,内存地址不同但内容相同),但value不会被覆盖

姓名:张三,年龄:30 -->zhangsan_2

姓名:张三,年龄:30 -->zhangsan_1

姓名:李四,年龄:31 -->lisi v>

map容器是允许插入相同键值得对象的。但是,如果该键在map中已经存在,再插入相同键值时,会保持该map不变的。(使用insert *** 作)

find *** 作返回指向元素的迭代器,如果不存在,则返回 end迭代器。

如int count = 0

map<string, int>::iterator it = word.find("hello")

if(it != word.end()) count = it->second

可以放在一起的

放在一起的方法有

1. 先创建一个list集合来存放map对象,然后在创建几个map对象来设置值

2.对map对象进行值的设置,然后把它添加到list中

3.创建一个resultMap的对象用来存最终结果

4.因为map的可以是set集合所以不会重复,就可以这样设置把所以出现在list中map的key值都设置到resultMap对象中初始值为0

5.然后再次重新遍历list中的所以map值与resultMap中对应的map的key相同的值相加,因为上一步对resultMap的初始化所以不会担心key不存在的情况,因此这里就可以实现累加效果

6.最后把resultMap值输出来就可以看到统计结果了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11623193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存