ArrayList、LinkedList和HashSet、TreeSet...的遍历方式

首先介绍一个常用的几个集合类的特点

List集合【有序可重复】

ArrayList:底层基于Object的动态数组(可以进行动态扩容)。适用于经常查改的场景,线程不安全。存取元素(有序,可重复)

LinkedList:底层基于双向链表(也是与ArrayList的本质区别)。适用于经常增删的场景,线程不安全。存取元素(有序,可重复)

Vector:(其实就是一个线程安全的ArrayList,因为线程安全,所以效率相比较低一些。)

Set集合【无序不可重复-除了linkedHashSet】

HashSet:底层基于HashMap(哈希表),线程不安全,集合中可以添加null。存取元素(无序,不可重复)。

LinkedHashSet;底层基于LinkedHashMap(哈希表和链表实现的接口)(从而存取元素是有序的),线程不安全,集合中可以添加null。存取元素(有序,不可重复)。

TreeSet:底层基于TreeMap(哈希表和链表实现的接口)(从而存取元素是有序的),线程不安全,集合中可以添加null。存取元素(无序,不可重复)。

Map集合

存储的每组数据都是成对的“键-值”
HashTable: 底层数据结构是哈希表。线程安全,但是效率较低。


HashMap:底层数据结构同样是哈希表+数组+红黑树(发布过浅析HashMap底层结构),它是无序的,即不能保证key-value对的顺序,判断两个key是否相等的标准是利用equals进行比较,返回结果为true则证明相等。


LinkedHashMap:底层数据结构由链表和哈希表组成,保证了存储数据的有序性。


SortedMap:与SortedSet类似,可以对Map中的数据实现一个排序功能。


TreeMap:TreeMap就是一个红黑树数据结构,每一个key-value对即作为红黑树一个节点。TreeMap存储key-value对(节点)时,需要根据key对及诶单进行排序。TreeMap可以包含保证所有的key-value对都处于有序状态。同样,TreeMap也有两种排序方式:自然排序,定制排序(一个是实现Comparable接口,一个是通过匿名内部类创建new Comparator-----发布了TreeSet自然排序和定制排序的方法)
 

集合遍历的4种方法

1.普通for循环(不适用于Set集合,因为Set集合底层基于哈希表,没有提供带索引的方法。也不适用于Map集合(采用key-value键值对存储))

举例:

for (int i = 0; i < arrayList.size(); i++) { // size表示集合的个数
            System.out.print(arrayList.get(i));
        }

2.增强for循环(List和Set和Map都适用)

举例:

for (Object d : linkedList) {
			System.out.print(d);
		}
		System.out.println("\r\n==================");

for (Object f : linkedHashSet) {
			System.out.print(f);
		}
        System.out.println("\r\n==================");

for(String s:maps.keySet()) {
    System.out.println(s+":"+maps.get(s));
}

3.单项迭代器(Set.List都适用,Map也适用只是格式不一样)

举例:

Iterator iterator = linkedHashSet.iterator();
		while (iterator.hasNext()) {
			System.out.print(iterator.next());
		}

Iterator iterator2 = arrayList.iterator();
		while (iterator2.hasNext()) {
			System.out.print(iterator2.next());
		}

 Map通过entrySet进行遍历获取键值对

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

 Map通过KeySet进行遍历获取键值对

Set<String> usernames = maps.keySet();
    Iterator<String> name = usernames.iterator();
        while(name.hasNext()) {
        String key = name.next();
        System.out.println(key +":"+maps.get(key));
        }

4.双向迭代器(只适用于List集合,因为List是基于链表的)

举例:

ListIterator iterator = LinkedList.listIterator();
while(iterator.hasPrevious()){
	System.out.println(iterator.previous());
}

归纳总结

List、Set、Map进行遍历的方式有很多种,而且有的遍历方式并不是通用的,所以为了便于记忆避免混淆,只需要记住常用的两种遍历方式(增强for循环和迭代器(Iterator)两种即可)可以对三种集合进行遍历。


版权声明:本文为m0_64210833原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。