Java集合和树

Collection:List,Set,Queue;Map;Iterator(依附于Collection对象,主要用于遍历Collection集合中的元素)

foreach(遍历数组和集合),Iterator修改迭代变量没有意义,集合不会被改变

Set:HashSet,LinkedHashSet,TreeSet,EnumSet(都是线程不安全的)

HashSet:除了排序外都比TreeSet要好

LinkedHashSet:HashSet的子类,使用链表维护元素的插入顺序(如果没有重写compareTo方法),遍历比HashSet快,其他比HashSet慢(链表开销)

TreeSet:调用compareTo方法使元素按升序排列(红黑树算法),compareTo返回0则认为相等

EnumSet:性能最好,但只能保存同一个枚举类的枚举值作为集合元素


List:ArrayList,LinkedList,Vector

ArrayList:数组形式实现,随机访问(get)性能好

LinkedList:链表形式实现,迭代器遍历,插入删除性能好,此外还提供了双端队列和栈的功能

Vector:以数组形式实现,线程安全但很少用


Map:HashMap,LinkedHashMap,HashTable,TreeMap,EnumMap

HashMap:性能比HashTable好,线程不安全,(判断key是否一样通过equals()和hashCode),推荐使用,底层由数组和链表实现,当一个map填满了75%(负载因子)的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中;JDK1.8中如果链表长度大于8会把链表转化为红黑树。

HashTable:线程安全,不允许加入null,(判断key是否一样通过equals()和hashCode)

LinkedHashMap:HashMap的子类,使用双向链表维护元素的插入顺序,性能略低于HashMap,迭代遍历快

TreeMap:调用compareTo方法使key按升序排列,compareTo返回0则认为key相等

EnumMap:性能最好,但只能保存同一个枚举类的枚举值作为key


ConcurrentHashMap:线程安全,原子操作,比hashtable效率高,对数据分块加锁

当多线程对ConcurrentHashMap 操作时,不是完全锁住map, 而是锁住相应的segment 。这样提高了并发效率。缺点:当遍历ConcurrentMap中的元素时,需要获取所有的segment 的锁,使用遍历时慢。锁的增多,占用了系统的资源。使得对整个集合进行操作的一些方法(例如 size() 或 isEmpty() )的实现更加困难,因为这些方法要求一次获得许多的锁,并且还存在返回不正确的结果的风险。


树的种类


  • 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;
  • 有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
    • 二叉树:每个节点最多含有两个子树的树称为二叉树;
      • 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
      • 满二叉树:对于上述的完全二叉树,如果去掉其第d层的所有节点,那么剩下的部分就构成一个满二叉树(此时该满二叉树的深度为d-1);
    • 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;
    • B树
平衡二叉树,又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1.。
常用算法有: 红黑树 AVL 树、 Treap 等。

你可能感兴趣的:(Java集合和树)