`
Donald_Draper
  • 浏览: 979838 次
社区版块
存档分类
最新评论

深刻理解IdentityHashMap

    博客分类:
  • JAVA
阅读更多
新建POJO
package test;

public class Cat {
	private String name;
	private Integer age;

	public Cat(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (!(obj instanceof Cat)) {
			return false;
		}
		Cat p = (Cat) 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;
	}
}

测试:
public class TestMap  {
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
		Map mp = new HashMap<String, String>();
		mp.put("1", "s");
		mp.put("2", "t");
		/*Collection ct = mp.values();
		System.out.println(ct.toString());*/
		mp.put("1", "t");
		Set<Map.Entry<String, String>> allSet = mp.entrySet();
		Iterator<Map.Entry<String, String>> iter = allSet.iterator();
		while (iter.hasNext()) {
			Map.Entry<String, String> me = iter.next();
			System.out.println(me.getKey() + " --> " + me.getValue());
		}
		//HashMap
		Map mpx = new HashMap<Cat, String>();
		mpx.put(new Cat("kitty",1), "kitty_1");
		mpx.put(new Cat("jime",2), "jime_2");
		mpx.put(new Cat("kitty",1), "kitty_2");
		Set<Map.Entry<Cat, String>> allSetx = mpx.entrySet();
		Iterator<Map.Entry<Cat, String>> iterx = allSetx.iterator();
		while (iterx.hasNext()) {
			Map.Entry<Cat, String> me = iterx.next();
			System.out.println(me.getKey() + " --> " + me.getValue());
		}
                System.out.println("==============IdentityHashMap:");
		//IdentityHashMap
		Map imp = new IdentityHashMap<Cat, String>();
		imp.put(new Cat("kitty",1), "kitty_1");
		imp.put(new Cat("jime",2), "jime_2");
		imp.put(new Cat("kitty",1), "kitty_2");
		Set<Map.Entry<Cat, String>> iSet = imp.entrySet();
		Iterator<Map.Entry<Cat, String>> iterxx = iSet.iterator();
		while (iterxx.hasNext()) {
			Map.Entry<Cat, String> me = iterxx.next();
			System.out.println(me.getKey() + " --> " + me.getValue());
		}
	}
}

控制台输出:
2 --> t
1 --> t
姓名:jime;年龄:2 --> jime_2
姓名:kitty;年龄:1 --> kitty_2
==============IdentityHashMap:
姓名:kitty;年龄:1 --> kitty_2
姓名:kitty;年龄:1 --> kitty_1
姓名:jime;年龄:2 --> jime_2
查看HashMap的Put(K,V)
public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
	    //比较的是哈希值,key
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

查看:IdentityHashMap.put(Object obj, Object obj1)
public Object put(Object obj, Object obj1)
    {
        Object obj2 = maskNull(obj);
        Object aobj[] = table;
        int i = aobj.length;
        int j;
        Object obj3;
        for(j = hash(obj2, i); (obj3 = aobj[j]) != null; j = nextKeyIndex(j, i))
	    //比较的两个对象
            if(obj3 == obj2)
            {
                Object obj4 = aobj[j + 1];
                aobj[j + 1] = obj1;
                return obj4;
            }

        modCount++;
        aobj[j] = obj2;
        aobj[j + 1] = obj1;
        if(++size >= threshold)
            resize(i);
        return null;
    }

总结:
1.简单说IdentityHashMap与常用的HashMap的区别是:
前者比较key时是“引用相等”而后者是“对象相等”,即对于k1和k2,当k1==k2时,
IdentityHashMap认为两个key相等,而HashMap只有在k1.equals(k2) == true 时才会认为两个key相等。
2.IdentityHashMap 允许使用null作为key和value. 不保证任何Key-value对的之间的顺序,
更不能保证他们的顺序随时间的推移不会发生变化。
3.IdentityHashMap有其特殊用途,比如序列化或者深度复制。或者记录对象代理。
举个例子,jvm中的所有对象都是独一无二的,哪怕两个对象是同一个class的对象
,而且两个对象的数据完全相同,对于jvm来说,他们也是完全不同的,
如果要用一个map来记录这样jvm中的对象,你就需要用IdentityHashMap,而不能使用其他Map实现

0
0
分享到:
评论

相关推荐

    JAVA中IdentityHashMap使用.rar

    在Java编程语言中,`IdentityHashMap`是`java....理解其工作原理和特性对于优化代码性能以及解决特定问题至关重要。在使用时,需要注意其非线程安全、无序性和不支持迭代器`remove()`等特点,以避免可能出现的问题。

    java集合-IdentityHashMap的使用

    IdentityHashMap是Java中的一种特殊的哈希表实现,它使用"引用相等"(而不是"对象相等")来判断键的唯一性。具体来说,当且仅当两个键引用同一个对象时,它们被认为是相等的。

    集合Map

    《深入理解Java集合框架:IdentityHashMap的特殊魅力》 在Java集合框架中,Map接口扮演着重要的角色,它用于存储键值对数据。而在众多的Map实现中,IdentityHashMap是一个特殊的成员,它的行为与我们常见的HashMap...

    Java中大集合

    Java中的集合框架是编程中不可或缺的部分,它提供了一种高效且灵活的方式来存储和操作对象。在Java中,集合主要包括List、Set和Map三大类。...理解并熟练运用这些集合工具,能显著提高Java编程的效率和代码质量。

    java中级面试题(自己汇总)

    本文总结了Java中级面试题,涵盖了集合、HashMap、HashSet、HashTable、ConcurrentHashMap、红黑树、Java 8对HashMap的优化、LinkedHashMap、TreeMap、IdentityHashMap等知识点。 集合 * List和Set都是继承自...

    picketlink-jbas-common-2.6.0.CR4.zip

    【标题】"picketlink-jbas-common-2.6.0.CR4.zip" 提供的是PicketLink框架的一个版本,该框架是Red...在实际编程中,理解并正确使用这些工具和数据结构,对于优化内存管理、提高程序效率以及构建安全的系统都至关重要。

    java集合与通用集合

    在Java高级编程中,理解并熟练掌握集合的使用至关重要。 首先,集合框架的核心是`Collection`接口,它是所有集合类的根接口。`Collection`有两个主要的子接口:`Set`和`List`,它们分别代表不同的数据结构。`Set`...

    java中集合的用法与区别.docx

    理解Java集合框架的关键在于掌握不同接口和实现类的特性,以及它们所依赖的数据结构,如数组、链表和哈希表。这将有助于我们根据具体需求选择合适的集合类型,从而编写更高效、更易维护的代码。在实际开发中,集合...

    jdk 的集合框架的主体结构

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组高级的数据结构,使得开发者能够方便地管理和操作数据。框架的核心是两个主要接口:`...理解和熟练使用集合框架是Java程序员必备的技能之一。

    2019阿里内推面经1

    在Java的集合框架中,哈希表是一种常用的数据结构,主要体现在`HashMap`和`HashTable`等实现类中。这两个类都是用来存储键值对的数据结构...理解它们之间的差异可以帮助我们更好地利用这些工具来优化程序的性能和功能。

    java的总结

    以上就是对Java的个人总结中的主要知识点的详细阐述,这些知识覆盖了面向对象、集合框架、输入输出等多个方面,对于理解和使用Java编程至关重要。在实际开发中,了解并熟练掌握这些概念将有助于编写出高效、可维护的...

    Java集合框架

    `IdentityHashMap`比较键时使用`==`而非`equals()`方法;`WeakHashMap`是一种特殊的`HashMap`,其键使用弱引用,一旦键不再被引用,就会被垃圾回收。`HashTable`是线程安全的`Map`实现,但不推荐在现代Java中使用,...

    Java基础核心总结.PDF

    Java的集合框架包括List(如ArrayList、LinkedList和Vector)、Set(如HashSet、TreeSet、LinkedHashSet和PriorityQueue)、Map(如HashMap、TreeMap、LinkedHashMap、Hashtable、IdentityHashMap、WeakHashMap)...

    java 运用映射的相关类(Map)

    除了上述实现类,还有WeakHashMap、IdentityHashMap等特殊用途的Map实现,它们分别处理弱引用和比较对象引用相等的情况。 在实际开发中,选择合适的Map实现类取决于具体需求,如是否需要有序、是否考虑线程安全、...

    Java期末复习-类集框架

    Java 类集框架是Java编程语言中用于存储和操作对象集合的核心组件。它提供了一系列接口和类,方便开发者处理各种数据结构,...理解和熟练掌握这些知识点对于Java程序员来说至关重要,它们是编写高效、健壮代码的基础。

    Java 集合框架高难度进阶版面试题集锦解析

    Java 集合框架是Java编程语言中一个重要的组成部分,它提供...理解这些集合框架的关键概念和它们之间的区别,对于解决实际开发中的问题和通过高级面试至关重要。熟练掌握这些知识点,可以有效提高代码质量和运行效率。

    1-Collections-Overview-Section-Java-Collections-S_overview

    WeakHashMap和IdentityHashMap则提供了特殊的键引用策略。 3. 工具类: - **Collections**: 提供了一系列静态方法,用于操作集合,如排序、查找、填充、反转等。 - **Arrays**: 用于处理数组,包含排序、比较、...

    java集合框架 解析

    java集合框架 3.6. LinkedHashSet类 4. Map接口 4.1. Map.Entry接口 4.2. SortedMap接口 4.3. AbstractMap抽象类 4.4. HashMap类和TreeMap类 4.4.1. HashMap类 4.4.2. TreeMap类 ...4.6. IdentityHashMap类

    Java 软件开发复习提纲.pdf

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems在1995年发布。它的设计目标是具有简单性、面向对象、健壮性、安全性、平台独立性等特性。...理解并掌握这些知识点对于成为一名合格的Java开发者至关重要。

Global site tag (gtag.js) - Google Analytics