java(八)集合(4)

TreeMap

1、TreeMap的底层是通过红黑树实现的。那么关于红黑树的概念和特性都有哪些?红黑树:又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。他的节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡,(AVL树,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1)红黑树所要有的性质是:1)节点只有黑和红两种选择且根节点必须为黑,2)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的,3)如果一个节点为红的,那么他的两个儿子都是黑的,4)对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。红黑树的性质使得他的高度为logn的高度,则使得红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。如下图所示,即是一颗红黑树(下图引自wikipedia:http://t.cn/hgvH1l):

java(八)集合(4)_第1张图片

2、树的旋转:平衡二叉树要保持二叉树插入和删除时的平衡状态,所以就会涉及到树节点插入和删除时的旋转操作。红黑树比普通平衡二叉树要求更严格,红黑树旋转涉及到修改树中节点颜色及指针结构。

1)左旋:

java(八)集合(4)_第2张图片                     java(八)集合(4)_第3张图片                

图片来自:http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html

当在某个结点pivot上,做左旋操作时,我们假设它的右孩子y不是NIL[T],pivot可以为任何不是NIL[T]的左子结点。左旋以pivot到Y之间的链为“支轴”进行,它使Y成为该子树的新根,而Y的左孩子b则成为pivot的右孩子。

2)右旋,类似于左旋。

java(八)集合(4)_第4张图片

3、TreeMap:继承AbstractMap,实现NavigableMap、Cloneable、Serializable三个接口。其中AbstractMap表明TreeMap为一个Map即支持key-value的集合。红黑树的插入和删除相当于二叉查找树的插入并在此基础上做了修复● 插入修复情况1:如果当前结点的父结点是红色且祖父结点的另一个子结点(叔叔结点)是红色。插入修复情况2:当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的右子。插入修复情况3:当前节点的父节点是红色,叔叔节点是黑色,当前节点是其父节点的左子。详情http://blog.csdn.net/v_JULY_v/article/details/6105630

TreeSet

1、定义:TreeSet是一个有序的提供有序的Set集合,具有Set的属性和方法,基于TreeMap实现,TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法,TreeSet基础AbstractSet,实现NavigableSet支持一系列额导航方法、实现Cloneable意味着可以被克隆、实现Serializable接口,支持序列化。

2、构造函数:

// 默认构造函数。使用该构造函数,TreeSet中的元素按照自然排序进行排列。
TreeSet()

// 创建的TreeSet包含collection
TreeSet(Collection collection)

// 指定TreeSet的比较器
TreeSet(Comparator comparator)

// 创建的TreeSet包含set
TreeSet(SortedSet set)
TreeSet API

boolean                   add(E object)//将指定的元素添加到此 set(如果该元素尚未存在于 set 中)
boolean                   addAll(Collection collection)//将指定 collection 中的所有元素添加到此 set 中
void                      clear()                             //移除此 set 中的所有元素
Object                    clone()                             //返回 TreeSet 实例的浅表副本。属于浅拷贝
boolean                   contains(Object object)//如果此 set 包含指定的元素,则返回 true
E                         first()//返回此 set 中小于等于给定元素的最大元素不存在返回null
boolean                   isEmpty() //如果此 set 不包含任何元素,则返回 true
E                         last()    //返回此 set 中当前最后一个(最高)元素
E                         pollFirst()//获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
E                         pollLast()//获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
E                         lower(E e)//返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
E                         floor(E e)//返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null
E                         ceiling(E e)//返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
E                         higher(E e)//返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 nu
boolean                   remove(Object object)//将指定的元素从 set 中移除(如果该元素存在于此 set 中)
int                       size()//返回 set 中的元素数(set 的容量)
Comparator     comparator()//返回元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null
Iterator               iterator()//
Iterator               descendingIterator()//返回此 set 中所包含元素的逆序视图
SortedSet              headSet(E end)//返回此 set 的部分视图,其元素严格小于 toElement
NavigableSet           descendingSet()//返回此 set 中所包含元素的逆序视图
NavigableSet           headSet(E end, boolean endInclusive)//返回此 set 的部分视图,其元素严格小于 toElement
SortedSet              subSet(E start, E end)//返回此 set 的部分视图
NavigableSet           subSet(E start, boolean startInclusive, E end, boolean endInclusive)
NavigableSet           tailSet(E start, boolean startInclusive)//返回此 set 的部分视图
SortedSet              tailSet(E start)
3、TreeSet继承关系:

java.lang.Object
   ↳     java.util.AbstractCollection
         ↳     java.util.AbstractSet
               ↳     java.util.TreeSet

public class TreeSet extends AbstractSet        
    implements NavigableSet, Cloneable, java.io.Serializable{}
java(八)集合(4)_第5张图片

Vector

1、Vector实现List接口,继承AbstractList类,可以将其看做队列支持相关的添加、删除、修改、遍历等功能。Vector实现RandmoAccess接口,即提供了随机访问功能,提供提供快速访问功能,Vector可以直接访问元素。Vector 实现了Cloneable接口,支持clone()方法,可以被克隆。Vector与ArrayList一样,通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

2、构造函数:

Vector共有4个构造函数
// 默认构造函数
Vector()

// capacity是Vector的默认容量大小。当由于增加数据导致容量增加时,每次容量会增加一倍。
Vector(int capacity)

// capacity是Vector的默认容量大小,capacityIncrement是每次Vector容量增加时的增量值。
Vector(int capacity, int capacityIncrement)

// 创建一个包含collection的Vector
Vector(Collection collection)
synchronized boolean        add(E object)
             void           add(int location, E object)
synchronized boolean        addAll(Collection collection)
synchronized boolean        addAll(int location, Collection collection)
synchronized void           addElement(E object)
synchronized int            capacity()
             void           clear()
synchronized Object         clone()
             boolean        contains(Object object)
synchronized boolean        containsAll(Collection collection)
synchronized void           copyInto(Object[] elements)
synchronized E              elementAt(int location)
             Enumeration elements()
synchronized void           ensureCapacity(int minimumCapacity)
synchronized boolean        equals(Object object)
synchronized E              firstElement()
             E              get(int location)
synchronized int            hashCode()
synchronized int            indexOf(Object object, int location)
             int            indexOf(Object object)
synchronized void           insertElementAt(E object, int location)
synchronized boolean        isEmpty()
synchronized E              lastElement()
synchronized int            lastIndexOf(Object object, int location)
synchronized int            lastIndexOf(Object object)
synchronized E              remove(int location)
             boolean        remove(Object object)
synchronized boolean        removeAll(Collection collection)
synchronized void           removeAllElements()
synchronized boolean        removeElement(Object object)
synchronized void           removeElementAt(int location)
synchronized boolean        retainAll(Collection collection)
synchronized E              set(int location, E object)
synchronized void           setElementAt(E object, int location)
synchronized void           setSize(int length)
synchronized int            size()
synchronized List        subList(int start, int end)
synchronized  T[]        toArray(T[] contents)
synchronized Object[]       toArray()
synchronized String         toString()
synchronized void           trimToSize()
Vector与Collection关系
java(八)集合(4)_第6张图片
Vector的数据结构成员变量:elementData , elementCount, capacityIncrement。
(01) elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。
1)Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;若使用默认构造函数,则Vector的默认容量大小是10。
2) 当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 >0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。
3) Vector的克隆函数,即是将全部元素克隆到一个数组中。
数据访问:

1)通过迭代器遍历

Integer value = null;
int size = vec.size();
for (int i=0; i
2)随机访问

Integer value = null;
int size = vec.size();
for (int i=0; i
3)for循环
Integer value = null;
for (Integer integ:vec) {
    value = integ;
}
4)Enumeration遍历
Integer value = null;
Enumeration enu = vec.elements();
while (enu.hasMoreElements()) {
    value = (Integer)enu.nextElement();
}



 


你可能感兴趣的:(java升级)