JAVA学习之常用集合List,Set,Map

 

常用的集合有List,Set,Map,这三个都是接口,
其中List,和Set继承于Collection
而Map是一个可以保存键值对的接口

Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。
一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。
Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,
有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。
后一个构造函数允许用户复制一个Collection。

如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
由Collection接口派生的两个接口是List和Set。

List接口,List接口常用的两个实现类是LinkedList类和ArrayList类
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,
返回一个 ListIterator接口,和标准的Iterator接口相比,
ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。 

LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。
这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,经常需要向集合中插入/删除对象时,使用此类
效率会比较好,但对于随机访问集合中的对象,则会较慢.

ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。可以根据索引位置对集合进行快速的随机访问,缺点是向指定的索引位置
插入对象或删除对象的时候速度较慢,size,isEmpty,get,set方法运行时间为常数。
实例化方法如下:
List<String> list=new ArrayList<String>();

总结:基于Array的List适合查询,而LinkedList(链表)适合添加,删除操作。

Set接口
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
Set接口常用的实现类有HashSet和TreeSet.
实例化方法如下:
Set<String> set1=new HashSet<String>();
Set<String> set2=new TreeSet<String>();
Set 集合中的元素是不能重复的,而且是无序的,遍历Set集合元素的时候,有可能与插入Set元素时候的顺序并不一样
遍历Set集合的方法时,可以用For循环,
或者用Collection接口的iterator()方法取得迭代器来遍历

Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。
一个Map中不能包含相同的key,每个key只能映射一个 value。
Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
即Map接口遍历的时候常用到的三个方法:
entrySet()
返回 Set<Map.Entry<K,V>>此映射中包含的映射关系的 Set 视图。

keySet()
返回Set<K> 此映射中包含的键的 Set 视图。

values()
返回Collection<V>此映射中包含的值的 Collection 视图。

Map接口常用的实现类有HashMap和TreeMap.通常建议使用HashMap,因为HashMap类实现的对于添加和删除的行为
效率更高.HashMap是基于哈希表的Map接口的实现.
而TreeMap中的映射存在一定的顺序,如果希望Map集合中的对象存在一定的顺序,那就使用TreeMap类

HashMap允许使用Null值和Null的元素,但是要求键的唯一性,此类不保证集合的顺序,特别是不保证该顺序恒久不变
TreeMap类不仅实现的Map接口,还实现了SortedMap接口,因此该类的集合中具有一定的顺序.但是在添加.删除和定位的时候,
性能会比HashMap类差一些.由于TreeMap类实现的Map集合中的映射关系是根据键对象按照一定的顺序排序的.因为不允许键的对象是Null
实现的应用中,可以通过HashMap类创建Map集合,当需要顺序输出的时候,再创建一个键值对相同的映射关系的TreeMap类,然后输出

练习代码示例:

import java.util.*;
class test
{
public static void main(String[] args){
List<String> d=new LinkedList<String>();
d.add("aaa");
d.add("bbb");
d.add("ccc");
d.add("ddd");
d.add("eee");
Set<String> set=new HashSet<String>();
set.add("1");
set.add("1");
set.add("1");
set.add("1");
set.addAll(d);
set.add("2");
Set<String> intset=new TreeSet<String>();
intset.add("1");
intset.add("2");
intset.add("3");
intset.add("4");
intset.add("5");
intset.add("6");
Iterator<String> i=intset.iterator();
while(i.hasNext())
{
System.out.println(i.next());
}
Map<String,String> map=new HashMap<String,String>();
map.put("1","11");
map.put("2","22");
map.put("3","33");
map.put("4","44");
for(int l=1;l<map.size();l++){
System.out.println(map.get(""+l+"")+"");
}
Collection<String> vv=map.values();
Iterator<String> vvi=vv.iterator();
while(vvi.hasNext()){
System.out.println(vvi.next());
}
Set<String> keySet=map.keySet();
vvi=keySet.iterator();
while(vvi.hasNext()){
System.out.println(map.get(vvi.next()));
}
}
}

平时集合使用的比较多,熟悉集合类,有时会意想不到的效果哦.

原文地址:https://www.cnblogs.com/fylx/p/3961530.html