8.13.1 集合框架, 数据结构

Collection集合选取规则:(Vector现在用的不多了所以不考虑)
if(数据唯一,无序(输入顺序)){
        if(需要排序){  选用TreeSet
  }
        else{ 
 选用HashSet  
}
}
else{
        if(查询多){
  选用ArrayList
  }
        if(增删多){  选用LinkedList
  }
}
如果你知道是Set,但是不知道是哪个Set,就用HashSet。
如果你知道是List,但是不知道是哪个List,就用ArrayList。
List集合存储元素特点:
1.有序(List集合中存储有下标):存进去是这样的顺序,取出来还是按照这个顺序取出。
2.可重复
ArrayList集合底层默认初始化容量是 10. 扩大之后的容量是原容量的1.5倍.
Vector集合底层默认初始化容量也是10.扩大之后的容量是原容量的2倍.
HashMap和HashSet初始化容量都是 16,默认加载因子是0.75(在数组元素占75%时扩容)
 
如果优化ArrayList和Vector?
    尽量减少扩容操作,因为扩容需要数组拷贝。数组拷贝很耗内存。
    一般推荐在创建集合的时候指定初始化容量。
        //List l = new ArrayList(500);
Set集合存储元素特点:无序不可重复
get方法:根据key算出hash值,再去查找相对应得分支,找到key.equals==true的那个对象的value返回(可以类比查字典!)
put方法:根据可以算出hash值,再去相应分支,判断key.equals,全部为false则插入,否则说明已经存在该元素了,如果hash值没有分支,则再数组中新建一个链表存储新的分支。
Set集合:HashSet
    1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构。
    2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素
    是一个单向链表。每个单向链表都有一个独一无二的hash值,代表数组的
    下标。在某个单向链表中的每一个节点上的hash值是相等的。hash值实际上
    是key调用hashCode方法,在通过"hash function"转换成的值。
    3.如何向哈希表中添加元素:
        先调用被存储的key的hashCode方法,经过某个算法得出hash值,如果在
        这个哈希表中不存在这个 hash值,则直接加入元素。如果该hash值已经
        存在,继续调用key之间的equals方法,如果equals方法返回false,则将
        该元素添加。如果equals方法返回true,则放弃添加该元素。
    4.HashSet其实是HashMap中的key部分。HashSet有什么特点,HashMap中的key 应该具有相同的特点。
SortedSet; 无序不可重复,但是存进去的元素可以按照元素大小顺序自动排列.
    SortedSet集合存储元素为什么可以自动排序? 
        因为被存储的元素实现了Comparable接口,
        SUN编写TreeSet集合在添加元素的时候,会
        调用compareTo方法完成比较.

 
Colllection集合的UML关系图:
 
Map集合的UML关系图:
单向链表数据结构特点(和数组比较)
双向链表数据结构:
哈希表数据结构:
 
posted @ 2017-08-24 15:35  ~~晴天~^.^  阅读(278)  评论(0编辑  收藏  举报