java常用数据结构的比较

java常用数据结构的比较

java中有很数据结构如key value中有haspmap,treemap,LinkedHashMap ,那么这些数据结构有何区别,我们如何根据应用场景去选择合适的数据结构,合适的数据结构将能够有效的提高程序的运行效率和提升程序的安全性正确性。

Array、ArrayList、LinkList和vector

Array,arrayList 和linkList都是用来存放元素的,在实际应用中三者的区别如下:
* Array数组是 Java中最基本的数据结构,提供动态创建和访问java数组的方法,根据定义的Array类型,其中的元素与类型必须相同。Array是一个固定大小的容器,底层采用的是线性连续空间来存放元素;
* ArrayList 继承了 AbstractList 实现了Serializable, Cloneable, Iterable, Collection, List, RandomAccess 接口,ArrayList同样也是一个容器,但是其大小不固定,底层采用的也是线性连续空间来存放元素,当线性连续空间不足以存放元素时,又重新申请一片更大的空间(大约是原空间的2倍),将原有的内容移过去。ArrayList是线程不安全的;
* LinkList也是一个容器,但底层采用的是链表,因此不存在扩容问题,除非整个内存空间都不足了,由于采用的是链表,因此查找效率也比较低,但删除效率比较高。

  • vector为存储的对象分配一块连续的地址空间,因此对vector中的元素随机访问效率很高。在vecotor中插入或者删除某个元素,需要将现有元素进行复制,移动。vector是线程安全的

所以在应用上ArrayList用作读取比较多的时候,而lLinkedList用在删除比较多的时候。


HaspMap、TreeMap和linkedHashMap

HashMap,LinkedHashMap,TreeMap都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
区别如下:
1、HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。(输入的顺序对应输出的顺序是不确定的)
2、TreeMap(基于红黑树)取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。(如果你按照A=>AA,O=>OO,D=>DD这样的顺序put进去,iterator遍历输出的是按照字典顺序排列好的顺序输出,如A=>AA,D=>DD,O=>OO)
3、 LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现. (以怎样的顺序输入就以怎样的顺序输出)


HashMap和HashTable

  • Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
  • Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

String、String build和StringBuffer

  • 从执行速度上来说,StringBuilder > StringBuffer > String,因为String是字符串常量StringBuild 和StringBuffer都是字符串变量,
    String定义的变量是不可变的如下面一段程序

    String s = "abcd";
    s = s+1;
    System.out.print(s);// result : abcd1

这里虽然s最后输出是abcd1,但其实abcd这个对象是没有改变的它仍然在内存中等待GC回收;只是新建了一个String abcd1对象;

  • AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

    StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,Stringbuilder是非线程安全的。

**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章