首页 > 代码库 > JAVA基础——List、Set和Map大讨论
JAVA基础——List、Set和Map大讨论
今天,我们来讨论一下我们经常使用的集合类,虽然是常用的,但是我相信还是有很多猿们还是再滥用,所以,今天普及一下。
首先看张图片:
从Collection开始吧,Collection是一个接口,它包含List和Set两个子接口(Quene这里不讨论了),我们今天主要讨论一下:List、Set和Map。
List是实现了Collection接口的接口,实现类:LinkedList、ArrayList、Vector
Set是实现了Collection接口的接口,实现类:HashSet、TreeSet、LinkedSet
Map是接口,实现类:HashMap、Hashtable、TreeMap、LinkedHashMap、WeakHashMap、IdentityHashMap
Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。
List、Set和Map接口的不同:
List存放的是单个元素,元素是可重复的,可以存放Null元素。
Set存放的是单个元素,元素不可重复
Map存放的是键值对,key是不可重复的,value是可重复的;键值都可以是Null,但是key只能有一个Null。
下面说说这个三个接口的常用实现类:
List:
Vector:
基于数组(Array)的List,是线程同步的(sychronized)的
ArrayList:
同Vector一样是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
LinkedList:
LinkedList不同于前面两种List,它不是基于数组的,所以不受数组性能的限制。它每一个节点(Node)都包含两方面的内容:
1.节点本身的数据(data);
2.下一个节点的信息(nextNode)。
所以当对LinkedList做添加、删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了,这是LinkedList的优势。
Set:
HashSet:
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。
HashSet的存储方式是把HashMap中的Key作为Set的对应存储项,这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
LinkedHashSet:
HashSet的一个子类,一个链表。
TreeSet:
不同于HashSet的根本就是TreeSet是有序的,它是通过SortedMap来实现的。
Map:
HashMap
用到了哈希码的算法,以便快速查找一个键和它对应的值。
TreeMap
是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。
当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。
至此,我们给出了常用集合类的优缺点,有的时候,就是这些小小的知识点就把你系统的性能打了很大的折扣。我们在使用上稍稍注意,对系统就是一次拯救!
JAVA基础——List、Set和Map大讨论