
也就是说,你只要把一个map2里的数据按照key一个一个都加到map1里去就行了,但是这样会破坏map1
如果是想保持原来的不变,可以先新建一个空的hashmap,把map1和map2的数据都加进去就可以了
HashMap map3 = new HashMap()
for (Object key : map1.keySet())
map3.put(key, map1.get(key))
for (Object key : map2.keySet())
map3.put(key, map2.get(key))
可以根据具体的类型加上泛型模板
分享
一般是不能HashMap HashSet 的底层数据结构的实现是:维护了一张 HashTable 。容器中的元素全部存储在Hashtable 中。他们再添加元素的时候,是如何判断是否存在有重复元素的呢? 每一个被添加的元素都有一个 hashCode(哈希值),他们先比较哈希值,是否相同? 不相同的元素,添加进入 HashTable. 如果hashCode相同的话, 再去比较 equals()方法,如果也相同的话,JVM就认为数据已经存在了,就不会添加数据!
TreeMap TreeSet底层是数据结构的实现是:维护了一棵二叉树。 容器中添加元素的时候,他们有是怎么判断是否有相同元素的?我们都直到 TreeMap TreeSet 她们 都是 有序的存储数据。 为了维护 数据的唯一性。 再存入数据的时候,他们会调用元素中 实现的 Comparable 的 compareTo() 方法(代码1)。 或者 集合本身创建的时候 传入了 迭代器(代码2). 具体的实现是:调用比较方法,返回-1 的时候,添加到左子树,返回1 的时候 添加到 右子树。返回0 有相同数据 不添加该元素!
在java中,有一种key值可以重复的map,就是IdentityHashMap。在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 。在正常的Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2))。
IdentityHashMap类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。该类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定,该协定在比较对象时强制使用 equals 方法。
在使用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>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)