1.集合框架的分类
1.Java 中基本的集合框架: Java Collections Framework
提供了对集合的定义,操作,和管理的一组接口。
2.Java 中提供了两种不同的集合实现
接口 | 子类 |
---|---|
Collection<E> | 集合类的根接口,Java中没有直接的实现类,但是有继承的接口Set(无序,元素不允许重复)和List(有序,元素可重复,提供按索引访问方式)。 |
Map<K, V> | Java中另一个接口,与collection无关,但是属于集合类,以Key-Value的形式保存数据,Key唯一,但是Value可以重复。 |
Iterator | 所有集合类都实现了该接口,用于遍历集合中元素的接口,3个方法,hasNext()是否还有下一个元素,next()返回下一个元素,remove()删除当前接口。 |
2.它们的区别
1、List(有序、可重复)
List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。2、Set(无序、不能重复)
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。3、Map(键值对、键唯一、值不唯一)
Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
名称 | 子接口 | 是否有序 | 元素是否允许重复 |
---|---|---|---|
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | 否 | 否 | |
TressSet | 是(用二叉树排序) | 否 | |
Map | Abstractmap | 否 | k-v映射,K不可重复V可重复 |
HashMap | 否 | k-v映射,K不可重复V可重复 | |
TreeMap | 是(二叉树排序) | k-v映射,K不可重复V可重复 |
3.集合实现
类名 | 区别 |
---|---|
ArrayList | 增删操作较多的情况下,查询较少的情况下使用,两者用法没有区别,功能上有区别 |
LinkedList | 查询较多的情况下,增删较少的情况下使用,,两者用法没有区别,功能上有区别 |
类名 | 区别 |
---|---|
HashMap | 是最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的,因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的 |
Hashtable | 是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。 |
ConcurrentHashMap | 线程安全,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。 |
LinkedHashMap | 保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。 |
TreeMap | 实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的; |
4.使用
Map的遍历(两种方式):
Map map = new HashMap();
map.put(key,value);
//先获取map集合的所有键的set集合,keyset(),将Map中所有的键存入到set集合中。
//因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。
// keySet():迭代后只能通过get()取key 。
//取到的结果会乱序,是因为取得数据行主键的时候,使用了HashMap.keySet()方法,而这个方法返回的Set结果,里面的数据是乱序排放的。
Iterator it = map.keySet().iterator();
//获取迭代器
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}
//将map集合中的映射关系取出,存入到set集合
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out.println("键"+e.getKey () + "的值为" + e.getValue());
}
//entrySet()方法,效率较高
//对于keySet其实是遍历了2次,一次是转为iterator,一次就是从HashMap中取出key所对于的value。
//对于entryset只是遍历了第一次,它把key和value都放到了entry中,所以快了。两种遍历的遍历时间相差还是很明显的。
5.Android中的使用示例
自己可以写一下
网友评论