有谁知道使用IdentityHashMap如何进行序列化或是深层复制吗?

19 篇文章 0 订阅
4 篇文章 0 订阅


package newFeatures8;

import java.util.IdentityHashMap;

/**
 * 
 * @author ljh
 *java API 中说此类的典型用法是拓扑保留对象图形转换,如序列化或深层复制。
 *要执行这样的转换,程序必须维护用于跟踪所有已处理对象引用的“节点表”。
 *节点表一定不等于不同对象,即使它们偶然相等也如此。此类的另一种典型用法是维护代理对象。
 *例如,调试设施可能希望为正在调试程序中的每个对象维护代理对象。
 *@description 
 * 其实我也很想知道使用IdentityHashMap如何进行序列化或是深层复制
 * 其他的博主也是一笔带过,只是说了一下与HashMap的区别
 */

/*
 * 两者最主要的区别是IdentityHashMap使用的是==比较key的值,而HashMap使用的是equals()
HashMap使用的是hashCode()查找位置,IdentityHashMap使用的是System.identityHashCode(object)
IdentityHashMap理论上来说速度要比HashMap快一点
另外一点呢就是IdentityHashMap中key能重复,但需要注意一点的是key比较的方法是==,
所以若要存放两个相同的key,就需要存放不同的地址,下面用代码来说明:*/


/*
 * 举个例子,jvm中的所有对象都是独一无二的,哪怕两个对象是同一个class的对象,
 * 而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,如果要用一个map来记录这样jvm中的对象,
 * 你就需要用IdentityHashMap,而不能使用其他Map实现。
 * */
public class IdentityHashMapDemo {
	public static void main(String[] args) {
		IdentityHashMap<String,String> identityHashMap=new IdentityHashMap<>();
		
		identityHashMap.put("2", "李四");
		identityHashMap.put("3", "王五");
		identityHashMap.put("4", "赵六");
		identityHashMap.put("5", "田七");
		identityHashMap.put("1", "张三");//有相同键时,使用get方法获取的是第一个
		identityHashMap.put(new String("1"), "田七");
		System.out.println(identityHashMap.toString());
	}
}


### 回答1: HashMapHashMap是一种基于哈希表的Map接口的非同步实现,它允许null键和null值。它不保证映射的顺序,特别是它不保证该顺序恒久不变。应用场景:HashMap通常用于查找表中的元素,因为它以常数时间复杂度进行查找操作。LinkedHashMap:LinkedHashMap是一种基于哈希表和链表的Map接口的非同步实现,允许null键和null值。它保留插入映射的顺序,或者根据构造函数中指定的顺序,对其进行访问或遍历。应用场景:LinkedHashMap主要用于实现缓存,以便将最近使用的元素存储在映射中,并可以在将来的访问中快速访问。IdentityHashMapIdentityHashMap是一种基于哈希表的Map接口的非同步实现,它根据对象的==运算符而不是equals()方法对键进行比较,允许使用null键和null值。应用场景:IdentityHashMap用于跟踪对象的身份,而不是它们的值。ConcurrentHashMap:ConcurrentHashMap是一种基于分段锁定和哈希表的Map接口的非同步实现,它允许多个修改并发进行,而不会引起数据不一致的情况。应用场景:ConcurrentHashMap可以在多线程环境中高效地读取和修改映射,因此它在并发编程中非常有用。 ### 回答2: HashMapHashMapJava中最常用的数据结构之一,它是基于哈希表实现的,具有快速的查找和插入操作的能力。HashMap中存储的键值对是无序的,不保证插入顺序和访问顺序一致。适合于大部分普通的键值对存储场景。 LinkedHashMap:LinkedHashMapHashMap的子类,除了具有HashMap的特点外,还额外维护了一个双向链表,用于记录插入顺序。因此,LinkedHashMap可以保证插入顺序和访问顺序一致。适合于需要按照插入顺序进行迭代的场景。 IdentityHashMapIdentityHashMap实现了基于引用相等性的哈希表,即使用"=="判断键的相等性而非equals方法。IdentityHashMap适合于需要精确控制键的相等性的场景,比如在并发环境下需要使用多个线程同时修改键,而保持键的唯一性。 ConcurrentHashMap:ConcurrentHashMapHashMap的线程安全版本,是Java集合框架中的一员。它通过分段锁(Segment)的方式实现了高度的并发性能,允许多个线程同时进行读操作,而不会阻塞。ConcurrentHashMap适合于高并发场景中需要进行频繁的读写操作的情况,比如并发缓存。 综上所述,HashMap适用于大部分键值对存储场景;LinkedHashMap适合于需要保持插入顺序的场景;IdentityHashMap适合于需要精确控制键的相等性的场景;ConcurrentHashMap适用于高并发的读写操作场景。 ### 回答3: HashMapHashMap是一种无序的数据结构,它使用键值对的方式存储数据。它的特点是效率高,可以快速的插入、删除和查找元素。HashMap适合用于不需要保持元素顺序的场景,例如缓存、索引等。 LinkedHashMap:LinkedHashMap继承自HashMap,它在HashMap的基础上保留了插入元素的顺序。它使用链表来维护插入元素的顺序,所以可以按照插入的顺序输出元素。LinkedHashMap适合用于需要保持元素插入顺序的场景,例如LRU缓存。 IdentityHashMapIdentityHashMap是一种特殊的HashMap,它使用对象的身份(即对象的引用)作为键的判断依据,而不是依靠 equals() 方法。它的特点是可以处理相同的键对象,因为它使用引用相等性来判断键的唯一性。IdentityHashMap适合用于需要处理相同键对象的场景,例如对象的标识映射。 ConcurrentHashMap:ConcurrentHashMap是一种线程安全的HashMap实现,它支持高并发的读写操作。它通过将数据分成多个段(segment)来实现并发控制,每个段有自己的锁来保护并发访问。ConcurrentHashMap适合用于需要高并发读写的场景,可以用于替代传统的同步机制(例如synchronized或ReentrantLock)。 综上所述,不同的Map实现有不同的特点和适用场景。选择合适的Map实现要根据具体的业务需求和性能要求进行考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值