集合框架复习
集合特点:
- 用于存储对象的容器
- 集合的长度是可变的
- 集合中不可以存储基本数据类型值
集合容器因为内部的数据结构不同,有多个容器,不断的向上抽取,就形成了集合框架
图中虚线代表着接口,实线代表着类。
Map: 一次添加一堆元素,Collection 一次添加一个元素
Map也称为双列集合,Collection集合称为单列集合。
其实map集合中存储的就是键值对
map集合中必须保证键的唯一性
集合框架中有着两大顶层接口:
1. Collection:
|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复
|--vector:内部是数组数据结构,是同步的。增删,查询都很慢!
|--ArrayList:内部是数组数据结构,是不同步的,替代了Vector,查询的速度快
|--LinkedList:内部是链表数据结构,是不同步的,增删元素的速度很快
|--Set: 元素不能重复,通常无序(也有可能会出现有序的,几率不大)。
|--HashSet: 内部数据结构是哈希表,是不同步的
哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,
当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,
然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表
|--TreeSet:可以对Set集合中的元素进行排序,是不同步的。 (实现Comparble接口,通过compareTo进行排序)
判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存
TreeSet对元素进行排序的方式一:
让元素自身具有比较功能,就需要实现Comparable接口,覆盖compareTo方法.
如果不要按照对象中具备的自然排序进行排序,如果对象中不具备自然顺序。怎么办?
可以使用TreeSet集合的第二种排序方式
让集合自身具备比较功能,定义一个类实现Comparator(比较器)接口,覆盖compare方法.
将该类对象作为参数传递给TreeSet集合的构造函数
2. Map:
> |--Hashtable: 内部结构是哈希表,是同步的,不允许null作为键,null做值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合
> |--HashMap :内部结构是哈希表,不是同步的,允许null作为键,null作为值
> |--TreeMap: 内部结构是二叉树,不是同步的,可以对Map集合中的键进行排序
集合框架中的迭代器和工具类:
-
Collections:工具类:
static Enumeration enumeration(Collection c) 返回指定集合的枚举。
我在合并多个流的时候用这个函数返回ArrayList集合的枚举,它还有其他特别好用的方法,这里不一一列举了,我就列举了这个我在作业中比较常用到的方法,当然,我用vector自己方法也可以返回枚举,然后传递给SequenceInputStream -
Arrays:数组工具类
-
迭代器:
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同
所以该迭代器对象是在容器中进行内部实现的
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可,也就是iterator方法。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口
集合取出元素的方法:
-
Collection:通过迭代器
-
Map:
1.通过entrySet 2.通过KeySet
复习作业:
1.通过迭代器来取出ArrayList的元素
2.通过keySet以及entrySet获取Hashmap的元素
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class 复习Demo {
/*复习:
* Arraylist,LinkedList
* Hashset,Treeset
* Hashmap,treemap
* 创建以上集合存入元素并取出
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Collectionlist_ArrayList();
//创建ArrayList并取出元素
Collectionlist_LinkedList();
//创建LinkedList并取出元素
Map_Hashmap();
//创建hashmap并取出元素
}
public static void Map_Hashmap() {
// TODO Auto-generated method stub
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("xiaoming", 5);
map.put("wanger", 17);
map.put("qianyu", 19);
output_entryset(map);
output_KeySet(map);
}
public static void output_KeySet(Map<String, Integer> map) {
// TODO Auto-generated method stub
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String key = it.next();
int vaule = map.get(key);
System.out.println("通过KeySet获取的键值对:"+"name="+key+":::"+"age="+vaule);
}
}
public static void output_entryset(Map<String, Integer> map) {
// TODO Auto-generated method stub
Set<Map.Entry<String,Integer>> set = map.entrySet();
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while(it.hasNext()) {
Map.Entry<String,Integer> st = it.next();
String key = st.getKey();
int vaule = st.getValue();
System.out.println("通过enrtySet获取的键值对:"+"name="+key+":::"+"age="+vaule);
}
}
public static void Collectionlist_LinkedList() {
// TODO Auto-generated method stub
LinkedList<String> Ll = new LinkedList<>();
Ll.add("哈哈");
Ll.add("世界");
for( Iterator<String> it= Ll.iterator();it.hasNext();) {
System.out.println("LinkedList="+it.next());
}
}
public static void Collectionlist_ArrayList() {
// TODO Auto-generated method stub
ArrayList<String> Ar = new ArrayList<>();
Ar.add("哈哈");
Ar.add("世界");
for( Iterator<String> it= Ar.iterator();it.hasNext();) {
System.out.println("ArrayList="+it.next());
}
}
}
输出结果:
ArrayList=哈哈
ArrayList=世界
LinkedList=哈哈
LinkedList=世界
通过enrtySet获取的键值对:name=xiaoming:::age=5
通过enrtySet获取的键值对:name=qianyu:::age=19
通过enrtySet获取的键值对:name=wanger:::age=17
通过KeySet获取的键值对:name=xiaoming:::age=5
通过KeySet获取的键值对:name=qianyu:::age=19
通过KeySet获取的键值对:name=wanger:::age=17
总结两种Map的取值方式:
-
第一种:通过KeySet的来获取,通过keySet返回包含的键的Set视图给Set<>,然后就可以通过迭代器来取值。
-
第二种:通过entryset来获取,通过entryset返回给Set,这里注意Set的泛型,Map.Entry<String,Integer>,用迭代器循环,通过将迭代器下一个元素的值传递给Map.Entry<String,Integer>类型,然后直接通过getkey方法和getvalue方法取值。
-
因为我怕有时候忘记,所以代码写的比较简单,方便自己快速复习,如果你觉得可以的话关注下,博客新人。。