map,set与list的介绍
Collection、List、Set、Map都是接口,不能实例化。其中List和set继承Collection接口。Collection和map都代表一个Object。
java集合的主要分为三种类型:
Set(集)
List(列表)
Map(映射)
一,java中各种集合的关系图
Collection 接口的接口 对象的集合
├ List 子接口 按进入先后有序保存 可重复
│├ LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全
│├ ArrayList 接口实现类 数组 随机访问 没有同步 线程不安全
│└ Vector 接口实现类 数组 同步 线程安全
│ └ Stack
└ Set 子接口 仅接收一次,并做内部排序
├ HashSet
│ └ LinkedHashSet
└ TreeSet
对于 List ,关心的是顺序,它保证维护元素特定的顺序(允许有相同元素),使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素。
对于 Set ,只关心某元素是否属于 Set (不 允许有相同元素 ),而不关心它的顺序。
Map 接口 键值对的集合
├ Hashtable 接口实现类 同步 线程安全
├ HashMap 接口实现类 没有同步 线程不安全
│├ LinkedHashMap
│└ WeakHashMap
├ TreeMap
└ IdentifyHashMap
对于 Map ,最大的特点是键值映射,且为一一映射,键不能重复,值可以,所以是用键来索引值。 方法 put(Object key, Object value) 添加一个“值” ( 想要得东西 ) 和与“值”相关联的“键” (key) ( 使用它来查找 ) 。方法 get(Object key) 返回与给定“键”相关联的“值”。
Map 同样对每个元素保存一份,但这是基于 " 键 " 的, Map 也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet 或者 LinkedHashMap.
对于效率, Map 由于采用了哈希散列,查找元素时明显比 ArrayList 快。
List集合
List的特征是其元素以线性方式存储,集合中可以存放重复对象。
List接口主要实现类:
ArrayList : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间。
LinkedList: 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。而LinkedList的空间花费则体现在它的每一个元素都需要消费相当的空间。
map集合
Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。键和值都可以为 null。Map集合中的键对象不允许重复。
Map接口主要实现类:
HashMap:HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
HashTable:Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
TreeMap:基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序,
或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。
TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法,比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆。
TreeMap 实现了Java.io.Serializable接口,意味着它支持序列化。
set集合
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类:
HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
线程同步的集合
vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。
statck:堆栈类,先进后出。
hashtable:就比hashmap多了个线程安全。
enumeration:枚举,相当于迭代器。
ConcurrentHashMap:其主要接口方法和HashMap是差不多的。但是,ConcurrentHashMap是使用了ReentranLock(可重入锁机制)来保证在多线程环境下是线程安全的。
集合的遍历
迭代的方式
在List上用迭代器遍历:
Iterator<String> itr = listNames.iterator();
while (itr.hasNext()) {
String name = itr.next();
System.out.println(name);
}
在Set上用迭代器遍历:
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
Iterator<String> itr = set.iterator();
while (itr.hasNext()) {
String letter = itr.next();
System.out.println(letter);
}
在Map上用迭代器遍历:
Map<String, Integer> grade = new HashMap<>();
grade.put("Operating System", 90);
grade.put("Computer Network", 92);
grade.put("Software Engineering", 90);
grade.put("Oracle", 90);
Iterator<String> itr = grade.keySet().iterator();
while (itr.hasNext()) {
String key = itr.next();
Integer value = grade.get(key);
System.out.println(key + "=>" + value);
}
博客参考:https://blog.youkuaiyun.com/lixibin0829/article/details/79336607 (集合遍历)
https://blog.youkuaiyun.com/jackie03/article/details/7312481(集合讲解)
https://blog.youkuaiyun.com/u014136713/article/details/52089156(集合讲解)