集合类List、Set、Map的区别、联系和遍历方式

说集合之前,先说说数组和集合:

1.数组长度是固定的,当超过容量后会在内存中重新创建一个原来数组1.5倍长度的新数组,再把元素存进去;数组既可以存储基本数据类型,又可以存储引用数据类型。

2.集合长度是可变的,集合只能存储引用数据类型,集合也可以存储基本数据类型,但是在存储时自动装箱变成对象。

3.如果元素个数是固定的推荐用数组,如果元素不是固定的推荐用集合。

一.三者关系

1.Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。如何遍历Collection中的每一个元素,不论Collection的实际类型如何都支持一个iterator()方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

Iterator it = collection.iterator();
while(it.hasNext()){
    Object obj = it.next();
}

List和Set是Collection两个派生接口。

2.Set

Set接口继承Collection接口,而且它不允许集合中存在重复项。所有原始方法都是现成的,没有引入新方法。具体的Set实现类依赖添加的对象的equals()方法来检查等同性。

HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的。

TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap。

Set的两种遍历:

(1)迭代遍历

Iterator<String> iterator = set.iterator(); 
while (iterator.hasNext()) {  
    System.out.println(iterator.next());  
}

(2)for循环遍历

for (String data : set) {  
    System.out.println(data);  
} 

3.List

List接口继承了Collection 接口,特点是存储有序,有索引,可以存储重复元素。 实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。

ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。

LinkedList:由链表实现的List。查询元素慢(二分查找,从头或从尾一个一个往中间找),但是往List中间插入和移除元素的速度很快。

Vector:实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类!!当两个或多个线程同时访问时也是性能良好的

List的遍历方式由以下几种:

(1)普通for循环

for (int i = 0; i < list.size(); i++) {  
    System.out.println(list.get(i));  
} 

(2)迭代遍历

Iterator<String> iterator = list.iterator();  
while(iterator.hasNext()){  
    System.out.println(iterator.next());  
}

(3)增强for循环

for(String data : list){  
    System.out.println(data);  
}

4.List的三个子类的特点

ArrayList:

底层数组结构是数组,查询快,增删慢;线程不安全,效率高。

Vector:

底层数据结构是数组,查询快,增删慢;线程安全,效率低。

Vector相对ArrayList查询慢(线程安全),Vector相对LinkedList增删慢。

LinkedList:

底层数据结构是链表,查询慢,增删快;线程不安全,效率高。

5.Map

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。

“集合框架”提供两种常规的Map实现:HashMapTreeMap。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在Map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按顺序遍历键,那么TreeMap会更好。根据集合大小,先把元素添加到HashMap,再把这种映射转换成一个用于有序键遍历的TreeMap可能更快。使用HashMap要求添加的键类明确定义了hashCode()实现。有了TreeMap实现,添加到映射的元素一定是可排序的。

HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。

HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。

TreeMap: 实现这样一个映象,对象是按键升序排列的。

Map的几种遍历方式:

(1)二次取值

for (String key : map.keySet()) {  
    System.out.println(key + map.get(key));  
}

(2)通过Map.entrySet使用iterator遍历key和value

Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();  
while (iterator.hasNext()) {  
    Map.Entry<String, String> entry = iterator.next();  
    System.out.println(entry.getKey() + entry.getValue());  
} 

(3)通过Map.entrySet遍历key和value

for (Map.Entry<String, String> entry : map.entrySet()) {  
    System.out.println(entry.getKey() + entry.getValue());  
}

(4)通过Map.values()遍历所有的value,但不能遍历key

for (String value : map.values()) {  
    System.out.println(value);  
} 

猜你喜欢

转载自www.cnblogs.com/lyx210019/p/9388124.html