11.TreeSet源码解析

1.简介
TreeSet大致的结构和HashSet相似,底层组合的是TreeMap,所以继承了TreeMap能够排序的功能,也可以按照key的排序顺序进行迭代。TreeSet在复用TreeMap的功能时,主要有两种实现思路。

2.复用思路一
底层直接使用HashMap提供的能力,如TreeSet的add方法,其源码如下所示。

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{
     
	private transient NavigableMap<E,Object> m;
	
	public boolean add(E e) {
     
    	return m.put(e, PRESENT)==null;
	}
}

3.复用思路二
TreeSet定义了接口的规范,TreeMap负责实现,如迭代TreeSet的元素,其源码如下所示。

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{
     
	private transient NavigableMap<E,Object> m;

	public Iterator<E> iterator() {
     
        return m.navigableKeySet().iterator();
    }
}

public interface NavigableSet<E> extends SortedSet<E> {
     
    E lower(E e);

    Iterator<E> iterator();
}

这种是思路一的实现方式,TreeSet组合TreeMap,直接选择TreeMap的底层能力进行包装,但TreeSet实际执行的思路却完全相反,源码如下所示。KeySet源码是在TreeMap中,可以看出TreeMap实现了TreeSet定义的各种特殊方法。

static final class KeySet<E> extends AbstractSet<E> implements NavigableSet<E> {
     
	private final NavigableMap<E, ?> m;
	
	KeySet(NavigableMap<E,?> map) {
     
	 	m = map; 
	}
	
	public E lower(E e) {
      
		return m.lowerKey(e);
	}
	
	public Iterator<E> iterator() {
     
	   if (m instanceof TreeMap)
	       return ((TreeMap<E,?>)m).keyIterator();
	   else
	       return ((TreeMap.NavigableSubMap<E,?>)m).keyIterator();
	}
}

你可能感兴趣的:(从头开始学Java源码)