A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾传文 中级黑马   /  2013-2-20 12:35  /  1530 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 顾传文 于 2013-3-1 09:33 编辑

Map中的key是不允许重复的,那么是采用什么机制来知道Key重复和避免重复的呢?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 鼓励一下

查看全部评分

5 个回复

倒序浏览
建议你多多阅读JDK的源码,碰到这种问题就找源码,这就是JAVA的好处
回复 使用道具 举报
看Map子类的底层数据结构,HashMap是依赖hashcode方法和equals方法来判断,TreeMap是根据比较方法来判断,compareTo方法,和比较器中的compare方法

评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 赞一个!

查看全部评分

回复 使用道具 举报

我来回答,包你满意

本帖最后由 zhangjinyu1991 于 2013-2-20 12:47 编辑

首先你查找Map接口的源码,你看里面全是方法,你要关注的是put()方法,你去找实现了Map接口的实现类,比如HashMap类
好,找到HashMap类的put()方法,找找看,一下就是:
  1. public V put(K key, V value) {
  2.         if (key == null)
  3.             return putForNullKey(value);
  4.         int hash = hash(key);
  5.         int i = indexFor(hash, table.length);
  6.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  7.             Object k;
  8.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { // 帅哥,看这里,对Key进行比较了哦
  9.                 V oldValue = e.value;
  10.                 e.value = value;
  11.                 e.recordAccess(this);
  12.                 return oldValue;
  13.             }
  14.         }

  15.         modCount++;
  16.         addEntry(hash, key, value, i);
  17.         return null;
  18.     }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 赞一个!

查看全部评分

回复 使用道具 举报
Map的HashMap实现类底层使用哈希表结构
它要求键元素类型必须重写hashCode()和equals()来保证唯一性,如果hashCode()相等,再使用equals()比较,如果hashCode()不相等,就        不再使用equals()比较。
Map的TreeMap实现类底层使用二叉树结构,有两种实现唯一性的方法。
1.要求元素类型有自然顺序,只要实现了Comparable<T>接口的类就有了自然顺序,必须实现接口的compareTo()方法写入自己想比较的条件来进行比较.
2.如果元素没有自然顺序比较,可以创建TreeSet()时提供一个比较器,即:Comparator接口,实现接口中的compare()方法,写入比较条件

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马