黑马程序员技术交流社区

标题: 集合问题 [打印本页]

作者: 田林    时间: 2012-9-25 22:39
标题: 集合问题
本帖最后由 屈俊材 于 2012-9-26 07:54 编辑

集合学完了,但对集合的底层实现和排序仍有些迷茫,不知道哪位大虾能帮忙整理一下思路?重点是底层怎么实现的。小弟不胜感激!
作者: 杨卫腾    时间: 2012-9-25 22:50
其实这些你看些书,比如《数据结构》总结下就可以了。
不用太深入,了解各自的优缺点,会使用就行了。
最好是自己写片日记总结。

总体上 掌握 Set 和 List 集合,还有Map集合,这些是开发常用的
集合。

作者: 王胜炎    时间: 2012-9-25 22:51
有时间你学下数据结构和算法就会很清楚了。
作者: 黑马杨晨    时间: 2012-9-25 22:54
集合:老毕教程上讲了大类,1,List集合和2,Set集合
List集合分为ArrayList和LinkedList:
ArrayList:底层是数组结构;
LinkedList:底层是链表结构;

set集合分为HashSet和TreeSet等,
HashSet:底层是Hash表结构;
TreeSet:底层是二叉树结构;
具体内容老毕视频上都有讲!
作者: 柳彬    时间: 2012-9-25 22:55
各种集合底层实现
ArrayList: object[]
代码片段:构造方式
  public ArrayList() {
        this(10);//默认一开始构造了size为10的Object数组
  }
public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }
优缺点:读快改慢
linkedList: Entry链表 ,单向链表
private transient Entry<E> header = new Entry<E>(null, null, null);
public LinkedList() {
        header.next = header.previous = header;
}
优缺点:读慢改快

HashMap:Entry[]
          public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR;
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        table = new Entry[DEFAULT_INITIAL_CAPACITY];//构建Entry数组
        init();
    }
public V get(Object key) { //获取的时候从数组中读取
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }
//put方法 put的时候需要首先遍历数组的,看是否有重复的key
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;
    }

TreeMap: 基于Entry的二叉树
        public V get(Object key) {
        Entry<K,V> p = getEntry(key);
        return (p==null ? null : p.value);
    }
put方法的部分代码块:根据比较大小决定是放在某个结点的左边还是右边,如果值相同直接覆盖。左边大右边小
    if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }


HashSet:  基于HashMap实现,因为map中的key是不能重复的
public HashSet() {
                map = new HashMap<E,Object>();
}
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
}


TreeSet:TreeMap
        public TreeSet() {
                this(new TreeMap<E,Object>());
   }
        public boolean add(E e) {
        return m.put(e, PRESENT)==null;
  }

作者: 程振    时间: 2012-9-25 23:10
      Set
     /   \
    /     \
HashSet  TreeSet

HashSet利用HashMap的key的唯一性来实现集合的元素唯一性,一般不对元素排序,想排序就使用TreeSet

TreeSet利用TreeMap的key的唯一性来实现集合的元素唯一性,想对集合元素排序就使用TreeSet,另外TreeMap里面还有
private void rotateLeft(Entry<K,V>) 左旋转
private void rotateRIght(Entry<K,V>) 右旋转

应该是使用的红黑树存储数据的。


集合的排序。。。这个没注意过,忘了怎么用了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2