java数据结构

ArrayList(非同步、非频繁删除时选择)、
Vector(需同步时选择)、
LinkedList(频繁在任意位置插入、删除时选择)
=========================================================

java.util包中三个重要的接口及特点:
List(列表)、
Set(保证集合中元素唯一)、
Map(维护多个key-value键值对,保证key唯一)。

其不同子类的实现各有差异,如是否同步(线程安全)、是否有序。
--------------------------------------------------------

Collections (操作集合的工具类)
对于集合类的操作不得不提到工具类Collections,它提供了许多方便的方法,
如求两个集合的差集、并集、拷贝、排序等等。
由于大部分的集合接口实现类都是不同步的,
可以使用Collections.synchronized*方法创建同步的集合类对象。

如创建一个同步的List:
List synList = Collections.synchronizedList(new ArrayList());
其实现原理就是重新封装new出来的对象,操作对象时用关键字synchronized同步。

--------------------------------------------------------
List (列表)
ArrayList、Vector是线性表,使用Object数组作为容器去存储数据的,
添加了很多方法维护这个数组,使其容量可以动态增长,极大地提升了开发效率。
它们明显的区别是ArrayList是非同步的,Vector是同步的。
不用考虑多线程时应使用ArrayList来提升效率

---------------------------------------------------------

LinkedList是链表,略懂数据结构就知道其实现原理了。
链表随机位置插入、删除数据时比线性表快,遍历比线性表慢。

---------------------------------------------------------

Map(存储键值对,key唯一)

HashMap结构的实现原理是
将put进来的key-value封装成一个Entry对象存储到一个Entry数组中,
位置(数组下标)由key的哈希值与数组长度计算而来。

如果数组当前下标已有值,则将数组当前下标的值指向新添加的Entry对象。

步骤: 1、通过hashcode找到数组中的某一元素
2、通过key的equals方法在链表中找到key对应的value)
---------------------------------------------------------
TreeMap是由Entry对象为节点组成的一颗红黑树,

put到TreeMap的数据默认按key的自然顺序排序,
new TreeMap时传入Comparator自定义排序。
红黑树网上很多资料
---------------------------------------------------------
Set(保证容器内元素唯一性)
之所以先讲Map是因为Set结构其实就是维护一个Map来存储数据的,
利用Map结构key值唯一性。 HashSet
---------------------------------------------------------
HashMap 支持key=null 但是 Hashtable 不支持 key =null
---------------------------------------------------------

HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,
主要的区别有:线程安全性,同步(synchronization),以及速度。

1.HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,
并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。

2.HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;
而如果没有正确的同步的话,多个线程是不能共享HashMap的。
Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。
所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,
但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。
但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。
如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

posted @ 2019-06-25 15:16  RyanAce1988  阅读(123)  评论(0编辑  收藏  举报