一、集合的分类
(1)Collection接口(单值) 实现了Iterator
所包含的方法:
add(element)、add(index,element)、get(index)、indexOf(obj)、lastIndexOf(obj)
remove(index)、remove(obj)、set(index,element)
1.List接口(元素有序 方法可以与索引值有关、可重复)
ArrayList:
ArrayList底层其实是个Object数组,当使用无参构造创建ArrayList集合对象的时候;在进行第一次add的时候,会对内部的数组进行扩容,这个新数组的长度默认是10;以后再次扩容的时候 新数组的大小都是旧数组的1.5倍,频繁查找的时候使用。
LinkedList:
底层使用双向链表,因为是链表不存在初始容量,每次添加的时候new一个Node节点元素放在链表的尾部。LinkedList有两个指针,一个指向第一个元素,一个指向最后一个元素,当频繁插入和删除的时候可以使用。
Vector:
底层是Object数组,ArrayList的线程安全版,与ArrayList区别有扩容时新数组大小是旧数组的2倍和线程是安全的。
2.Set接口 (不可重复)
HashSet(元素无序):
底层哈希表(数组+单向链表+红黑树)实现,使用的是HashMap的源码,将HashSet的值当做key存储到HashMap中,实现元素的不可重复。初始容量为16,加载因子0.75。
LinkedHashSet(元素按插入顺序排序):
底层哈希表(数组+单向链表+红黑树)的基础上在元素之间使用双向链表进行排序,保证元素按照插入顺序来进行排序,使用的是LinkedHashMap的源码。
TreeSet(默认自然排序):
底层是红黑树来进行实现,使用的是TreeMap的源码,存储的元素需要实现comparable接口,或者在new TreeSet()的时候在构造器中添加Comparator比较器。存入的一定是同类型的元素,方便是使用对象的某个属性来进行排序。
// TreeSet的构造器
public TreeSet() {
this(new TreeMap<>());
}
(2)Map接口(键值对) 未实现Iterator
所包含的方法:
put(key,value)、get(key)、keySet()、values()、remove(key,value)、replace(key,value)
HashMap:
底层用一张哈希表(数组(数组的初始容量为16),单向链表,红黑树 (JDK8引入))来进行实现,内部使用了Hash算法。为了HashMap的正常使用,key一般是不可变对象,至少该对象中用于计算哈希值的属性要不可变,方可保证HashMap的正常使用。HashMap的树化只有当单链表的长度大于8且数组长度大于64时,才会树化。
LinkedHashMap:
底层由哈希表(数组+单向链表+红黑树+双向链表)实现,HashMap的子类,在HashMap的基础上由单向链表变成了双向链表,维护元素的添加顺序。
TreeMap:
底层使用红黑树进行存储,对key对象进行排序来确定在红黑树中的位置,key需要实现comparable接口,或者在new TreeMap()的时候在构造器中添加Comparator比较器。代码如下:
TreeMap<Dog,String> treeMap = new TreeMap<>(new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.age - o2.age;
}
});
HashTable:
Hashtable底层也是哈希表(数组+单向链表,JDK8中未引入红黑树)实现的 是线程安全的 但是性能比较低,如果是高并发多线程项目推荐使用 ConcurrentHashMap;HashMap是线程不安全的;
二、与集合有关的类
(1)Iterator
hasNext():判断是否有下一个元素,返回boolean
next():获取当前游标指向的对象
remove():删除当前游标指向的对象
(2)Comparable
TreeSet和TreeMap中需要使用的到,作为主键需要进行排序确定在红黑树中的位置,key的类需要实现Comparable接口,并且重写CompareTo()方法来确定比较的方法。
三、Collection和Map的遍历方式
(1)Collection的遍历方式
1.for
ArrayList<Dog> list = new ArrayList();
for (Dog a:list){
System.out.println(a);
}
2.forEach
ArrayList<Dog> list = new ArrayList();
list.forEach(a->{
System.out.println(a);
});
3.Iterator
ArrayList<Dog> list = new ArrayList();
Iterator<Dog> iterator = list.iterator();
while (iterator.hasNext()) {
Dog dog = iterator.next();
System.out.println(dog);
}
(2)Map的遍历方式
1.for
2.forEach
3.map.entrySet()
Map<Integer,String> map = new HashMap<>();
for (Map.Entry<Integer, String> a: map.entrySet()){
System.out.println(a.getKey() + a.getValue());
}