前言
在没有集合之前我们都是直接用数组存放对象,但是这样操作会很不方便,于是利用数据结构封装了一些列集合,而集合中不存放输几局的基本类型,只存放对象的引用,如图(部分集合源码分析在之前的总结中已经简单研究过)
java集合主要分为以下三种类型:
Set(集):集合中的对象不按特定方式排序,且没有重复对象。它的有些实现类能对集合中的对象按照特地方式排序。
List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许使用索引检索对象。
Map(映射):集合中的每一个元素都包含一对键对象和值对象(key-value),集合中的键对象是不能重复的,它的一些实现类能对集合中的键对象进行排序。
注意这里的不能重复与比较hashcode和equals有关
集合底层概述
Collection接口
Collection接口是Set、List、Queue接口的父接口,提供了多数集合常用的方法声明,包括 add()、remove()、contains() 、size() 、iterator() 等
List接口
它的特点是有序可重复,使用此接口能够精确的控制每个元素插入的位置用户能够使用索引来访问List中的元素并且允许有可重复的元素
ArrayList
底层实现是一个动态的数组,查询快,增删慢,线程不安全,效率高
LinkedList
底层实现是一个双向循环链表,查询慢,增删快,线程不安全,效率较高
Vector
是ArrlyList的线程安全版,底层同它基本一致,但是效率低,现在基本很少用
Set接口
它的特点就是唯一性并且不允许出现重复元素和是无序的
hashSet
底层是基于哈希表实现的,而其核心就是先比较hashCode()值是否相同(相当于索引),然后在用equals比较是否相同,从而确定元素是否重复,所以当不希望集合中有重复值,并且不关心元素之间的顺序时可以使用此类
LinkedHashSet
底层实现是使用链表和哈希表,它由链表保证元素有序,哈希表保证元素唯一,因此当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类
TreeSet
底层实现是红黑树,也就是一种平衡AVL树,通过比较返回值是否是0来保证元素唯一性,并且通过自然排序来保证元素的排序(自然排序也就是让元素所属的类实现Comparable接口,比如abc排在abd前面,总之就是和插入顺序无关,只和元素本身的内容和特质有关)
Queue接口
它的特点就是队列,即用于保存将要执行的任务列表
LinkedList
实现了该接口,可以实现先进先出的队列
PriorityQueue
底层采用某种排序的单链表存储队列元素,用来创建自然排序的优先级队列
Map接口
Map关心的是唯一的标识符,也就是将唯一的键映射到某个元素,以键值对形式存储,键唯一,值可重复
HashMap
底层实现是基于哈希表依赖于hashCode()和equals()方法,线程不安全,允许key和value为NULL,效率高
Hashtable
HashMap的线程安全版,效率低,不允许key和value为NULL
LinkedHashMap
底层是由链表和哈希表组成,链表保证元素有序,哈希表保证元素唯一,所以当需要键值对,并且关心插入顺序时可采用它
TreeMap
底层是由红黑树实现,当需要键值对,并关心元素的自然排序时可采用它
Collections
内置了一些常见的集合算法,像排序,查找算法等
如何选择哪种集合
1 首先看是否是键值对形式
是的话就选择Map
然后再看是否需要排序:
是的话就是TreeMap
不是的话就是HashMap
一般情况下都使用HashMap
不是键值对的话就选择Collection
再看元素是否唯一:
是的话就选set
元素是否需要排序
是的话就选TreeSet
反之选择HashSet
一般情况选择HashSet
不是元素唯一就选List
再看是否是否需要线程安全:
是的话就选Vector
不是的话就选择ArrayList或者LinkedList
增删选择:LinkedList
查询选择ArrayList
一般情况下都选择ArrayList
集合常见方法
Collection的常见方法
1,添加。
boolean add(Object obj):
boolean addAll(Collection coll):
2,删除。
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();
3,判断:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判断集合中是否有元素。
4,获取:
int size():
Iterator iterator():取出元素的方式:迭代器。
5,其他:
boolean retainAll(Collection coll);取交集。
Object[] toArray():将集合转成数组。
Map的常见方法
1,添加。
value put(key,value):返回前一个和key关联的值,如果没有返回null.
2,删除。
void clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。
3,判断。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,获取。
value get(key):通过键获取值,如果没有该键返回null。 当然可以通过返回null,来判断是否包含指定键。
int size(): 获取键值对的个数。
5.特殊方法: Collectionvalues() 包含的值的 Collection 视图。
Set> entrySet()方法:返回一个set集合,里面装的是Map.Entry接口类型的键值对象
Map遍历方法
第一种遍历的方法
SetkeySet():返回键的set集合
取出map中的所有元素。
原理,通过keySet方法获取map中所有的键所在的Set集合,在通过Set的迭代器获取到每一个键,
在对每一个键通过map集合的get方法获取其对应的值即可。
SetkeySet = map.keySet();
System.out.println(keySet);//键的set集合
Iteratorit = keySet.iterator();//迭代keySet
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+”:”+value);
}第二种遍历map的方式:通过看API:Set
> entrySet():Map.Entry 接口类型,
里面有K getKey() 返回与此项对应的键。 V getValue() 返回与此项对应的值。
Set>entrySet = map.entrySet();
System.out.println(entrySet);//键值对对象
Iterator>it = entrySet.iterator();
while(it.hasNext()){
Map.EntryentryMap = it.next();
Integer key = entryMap.getKey();//获取键
String value = entryMap.getValue();//获取值
System.out.println(key+”:”+value);
}
collections常用方法
由于该集合工具类方法太多,只总结出部分
最后不得不说集合容器是在太复杂了,它包装了许许多多的数据结构和算法,也正是因为如此,才大大简化了难度,但同时也说明了数据结构与算法的重要性,只有我们真正理解了算法和数据结构,才能更好的驾驭集合类