java数据结构
主要分为实现Collection的集合类和实现Map接口的键值对。
Collection家族的主要成员:
- ArrayList:
- 大多的java应用都是用数据结构存储数据然后传递最后解析的过程,因此ArrayList是一个较多的选择。
- ArraylList的实现就是一个数组,以Array.copy的方式来扩增数组长度。
- 指定index的读取是优势,插入和删除都会涉及数组的copy是劣势
- LinkedList:
- 双向链表
- 插入和删除只需要遍历链表是优势,随机读取(即get(i))是劣势
- 遍历链表应该用迭代器,但是在迭代过程中不能改变链表的长度,否则会抛出ConCurrentModificationException
- 1.5后的LinkedList实现Queue接口,若遍历时需要改变队列长度,可用队列poll的方式遍历
- Set:
- 用Map实现,即值都存储在Map的Key中
- HashSet不保证写入Set的顺序,TreeSet可保证,他们都用对应的Map实现
- Vector、Stack:
- 实现和ArrayList一样,区别仅为方法均为同步
- Stack为Vector的子类,提供了栈的操作而已
Map家族的主要成员:
- HashMap:
- HashMap的数据结构应该是多个单项链表形成的数组,每个链表中存储Map.Entry对象,一个链表中所有Entry的key值的hash值相同
- put Entry的时候,通过Key的hash值再对当前数组的长度取模,最终确定Entry放置的链表,然后讲Entry插入到链表表头
- 遍历时是不保证顺序的,用迭代器遍历entrySet和keySet均可
- 由初始容量(inital_capacity,默认16),加载因子(load_factor,默认0.75),来控制容器的大小,如默认的情况:16*0.75=12,即当entry为12 时增加数组长度为原来的2倍
- 读写迅速
- TreeMap:
- 可保证顺序,需遍历
- 红黑树实现
浙公网安备 33010602011771号