java常用集合比较

1.HashMap和HashTable有何不同?

(1)HashMap允许key和value为null,而HashTable不允许。

 

  (2)HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。

 

  (3)在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。

 

  (4)HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。

 

  (5)HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。

2.如何决定选用HashMap还是TreeMap?

TreeMap的key按自然增加顺序排序,HashMap没有顺序,HashMap速度快.

对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。


3.ArrayList和Vector有何异同点?

  ArrayList和Vector在很多时候都很类似。

 

  (1)两者都是基于索引的,内部由一个数组支持。

 

  (2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。

 

  (3)ArrayList和Vector的迭代器实现都是fail-fast的。

 

  (4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。

 

  以下是ArrayList和Vector的不同点。

 

  (1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。

 

  (2)ArrayList比Vector快,它因为有同步,不会过载。

 

  (3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表

4.ArrayList和LinkedList有何区别?

   

(1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。

 

  (2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。

 

  (3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。

5.List和set接口的区别

List:1.可以允许重复的对象。

    2.可以插入多个null元素。

        3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

        4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

Set:1.不允许重复对象

     2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator  或者 Comparable 维护了一个排序顺序。

        3. 只允许一个 null 元素

        4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

 

6.内部比较器Comparable和外部比较器Comparator

"Comparable" 它是一个排序接口,只包含一个函数compareTo()。

一个类实现了Comparable接口,就意味着“该类本身支持排序”,它可以直接通过Arrays.sort() 或 Collections.sort()进行排序。

"Comparator" 它是一个比较器接口,包括两个函数:compare() 和 equals()。

一个类实现了Comparator接口,那么它就是一个“比较器”。其它的类,可以根据该比较器去排序。

综上所述:Comparable是内部比较器,而Comparator是外部比较器。

一个类本身实现了Comparable比较器,就意味着它本身支持排序;若它本身没实现Comparable,也可以通过外部比较器Comparator进行排序。



经常见到的某些集合类父类等等

HashMap类

简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,
也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

HashMap简介

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作

vector类

Vector是在Collections API之前就已经产生了的, ArrayList是在JDK1.2的时候才作为Collection framework的一部分引入的它们都是在内部用一个Obejct[]来存储元素的

ok, 现在来说他们的差别
1. 线程安全 
Vector是同步的, ArrayList不是
因为Vector是同步的, 所以它是线程安全的
同样, 因为Vecotr是同步的, 所以他需要额外的开销来维持同步锁, 所以它要比ArrayList要慢.(理论上来说

当然, 如果你对ArrayList有偏好, 你也可以用Collection.synchronizedList(List)来得到一个线程安全的List. 

2. 容量增长 
Vector允许用户设置capacityIncrement这样在每次需要扩充数组的size的时候, Vector会尝试按照预先设置的capacityIncrement作为增量来设置, ArrayList则会把数组的大小扩大一倍

比如现在同样一个长度为10VectorArrayList, 我们把VectorcapacityIncrement设为
那么我们在插入第11个对象的时候, Vector会将长度变成11, 然后分配空间, 然后将对象添加进去, ArrayList则会分配20个对象的空间, 然后将对象添加进去

如果capacityIncrement设为0或者负值, Vector就会做和ArrayList一样, 每次都将数组大小扩大一倍

3. 性能比较 
刚刚在上面已经说过了, 由于Vector是同步的, ArrayList不是, 所以Vector的性能要比ArrayList要稍第一点, 用性能换安全嘛





阅读更多
文章标签: java集合
个人分类: 后端
想对作者说点什么? 我来说一句

Java常用集合

2017年04月01日 354KB 下载

java常用的jar包集合

2009年08月26日 8.76MB 下载

没有更多推荐了,返回首页

不良信息举报

java常用集合比较

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭