首先介绍一个常用的几个集合类的特点
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)两种即可)可以对三种集合进行遍历。