要说清楚list,set,map的区别,大家先看一下这段话,我觉得相当有趣,当然这是别人的话,这里引用一下。
世间上本来没有集合,(只有数组参考C语言)但有人想要,所以有了集合
有人想有可以自动扩展的数组,所以有了List
有的人想有没有重复的数组,所以有了set
有人想有自动排序的组数,所以有了TreeSet,TreeList,Tree**
而几乎有有的集合都是基于数组来实现的.
因为集合是对数组做的封装,所以,数组永远比任何一个集合要快
但任何一个集合,比数组提供的功能要多
一:数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。
二:一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。
三:数组是一种可读/可写数据结构---没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本
所以数组就不再说了,那咱们就说一下,既然我们在数据张有了升级(集合),而且还出了基于Collection的那么多的子类,我们今天就好好的区分一下List,Set,Map三者之间区别和联系吧。
Set
set是三者中最简单的集合,他的存储是没有顺序的(其实是有的,是亿靠hashCode来确定的),他里边的内容和我们存储顺序没有直接的关系,而且set里边的对象不能重复。所以要加入set的对象一定要判断他们是否已经重复了。
1. HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
2. TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
3. LinkedHashSet :具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
Set set=new HashSet();
String s1=new String("hello");
String s2=s1;
String s3=new String("world");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());//打印集合中对象的数目 为 2。
Map
map是一个键值对映射的集合,他每次存储一个对象的时候,都需要为该对象存一个key,例如map.put(“123”,”menghaibin”)。而我们取值的时候也只需要取利用key,就能返回我们需要的对象。
常用方法如下:
Object put(Object key, Object value): 向集合中加入元素
Object remove(Object key): 删除与KEY相关的元素
void clear():从映像中删除所有映射
而java类库中包含了几种不同的map:HashMap,LinkedHashMap,TreeMap, IdentifyHashMap这几种Map,他们的区别和联系又是什么呢:
4. HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。
5. LinkedHashMap :
类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
6. TreeMap :
基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
List
List按对象进入的顺序保存对象,不做排序或编辑操作,容许他们有重复对象,LinkedList,ArrayList,Vector 。
1. LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
2. ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低.
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
for(int i=0; i<list.size();i++){
System.out.println(list.get(i));
}