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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高欢欢 中级黑马   /  2012-7-13 09:01  /  1402 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高欢欢 于 2012-7-13 23:13 编辑

    当一个新的对象加入到 set集合中时,set的add()方法是如何判断这个对象是否已经存在于集合中的呢?

3 个回复

正序浏览
collction 集合分为:list和set
list特征:元素是有序的,元素可以重复,该集合体系有索引。
set特征:元素是无序的,元素不可以重复。

list又可以分为:
ArrayList:底层的数据结构是数组结构,特点:查询速度很快,但是增删速度稍慢,因为其带有索引,每增删一次,它的角标就要随之改变;
        它是线程不同步的;其默认大小为10的空列表,如果不够则会按照50%延长。判断元素是否相同的依据是:元素的equlas方法。
LinkedList:底层使用的链表数据结构。特点:查询速度稍慢,但是增删速度很快。
vector:底层的数据结构是数组结构。特点:它是线程同步;其默认大小为10的空列表,如果不够则会按照100%延长。

set又可分为:
HashSet:底层数据结构是哈希表。判读元素是否相同的依据是:元素的hashCoad和equals方法。
如果元素的hashCoad值相同才会判断equals是否为true,如果元素的hashCoad值不相同不会掉用equals方法。如果元素相同,则会用新的元素去覆盖原来的元素。

TreeSet:底层数据结构是二叉树。可以对Set集合中的元素进行排序,判读元素是否相同的依据是:compareTo方法。

HashSet中存放的元素没有顺序,当使用HashSet的时候,它的hashCode方法会得到调用,判断增加的元素和已经存放集合中元素hashCode值是否相等,
不相等则直接存放,相等则进行equals方法比较,比较的值true则表示集合中已经存放了该元素,否则存放。
HashSet可以允许空元素是因为在HashSet中可以确定只有一个空元素即不重复,这样集合就可以确认每个元素的位置,最终可以等到有效的访问,所以允许空元素。

TreeSet集合因为在存放的同时会绑定个比较器,存放进来的每一个元素都有在比较器中进行比较,最终确定该元素在集合中的有效位置。
不能存放空元素,因为空元素不具备比较性,当存放到TreeSet中的时候,不能被比较器进行有效的比较。所有TreeSet不允许存放空元素。
回复 使用道具 举报
JDK 1.6中HashSet的add(E e)方法源码:
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

HashMap中put(K k,V 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;
            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;
    }
从HashMap.put(K k,V v)中可以看出,当K已经存在时,将返回null。

回复 使用道具 举报
比如你要将对象A添加到一个SET中
add()方法会在添加之前将这个待添加的对象的哈希值与集合中其他对象的哈希值做比较,如果有相同,则认为是重复对象,不添加,如果没有,则认为是一个新的对象,添加
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马