List
1.ArrayList
底层使用数组实现存储。
特点:查询效率高,增删效率低,线程不安全,通常使用。
与数组差异点在于,数组长度是有限的,需要给定一个长度,但是ArrayList可以存放任意长度的对象,没有长度限制,底层实现方式是将原数组内容复制到一个更大的数组中。
2.LinkedList
底层使用双链表实现存储。
双链表:每个数据节点都有两个指针,分别指向前一个节点和后一个节点。
特点:查询效率低,增删效率高,线程不安全。
3.Vector
底层也是数组实现。
相关的方法都添加了同步检查,线程安全,效率低。
Map
存放键值对,键不可重复。(如果重复,则新的键值对覆盖旧的键值对)
1.HashMap
底层采用Hash表。数组+链表的组合,数组+二叉树的组合。链表为单链表。
①常见hash算法:
(1)取余:hash值 = hashcode % 数组长度
(2)位运算(数组的长度必须为2的整数幂):
hash值 = hashcode & (数组长度-1)
②扩容问题
HashMap的位桶数组初始大小为16,当数组的使用达到(0.75*数组lenth)时会扩容到原数组大小的两倍,原理就是定义新的数组,然后将原数组内容复制到新数组中。
③链表转换红黑树
jdk8以后,当链表的长度大于8时,将会自动转换为红黑树。
④二叉树
⑤取数据的过程
2.HashTable
HashTable线程安全效率低,不允许key和value为空,底层和HashMap几乎一致。加了同步检查(synchronized)
HashMap线程不安全,效率高,允许key和value为空。
3.TreeMap
使用红黑二叉树实现。
使用场景:如果要对map中的内容做排序的时候,可以使用TreeMap。
按照key递增的方式排序放入。
如果想要按照自己需要的属性进行排序,则需要使用Comparable接口去重写compareto方法去自定义比较的属性。
实现Comparable接口去自定义排序规则
Set
没有顺序,不可重复。内部没有索引,如果新元素通过equals方法比较后和Set中已经有,那么则新元素不可加入,连null也只能放一个。
1.HashSet
HashSet底层使用了一个HashMap,HashSet中的所有元素作为HashMap中的key,Value由一个固定值代替。
2.TreeSet
TreeSet底层使用TreeMap实现,也是按照key递增排序,可以实现Comparable接口进行自定义的排序。参见TreeMap。
迭代器
1.遍历List
//方法一,使用普通for循环
public void method1(ArrayList<Integer> list){
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
//方法二,增强for循环
public void method2(ArrayList<Integer> list){
for (Integer in:list) {
System.out.println(in);
}
}
//方法三:使用迭代器
public void method3(ArrayList<Integer> list){
for (Iterator<Integer> iter =list.iterator();iter.hasNext();) {
System.out.println(iter.next()); //next方法即返回迭代的下一个元素
}
}
//方法四:使用迭代器(2)
public void method4(ArrayList<Integer> list){
Iterator<Integer> iter =list.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
//如果遍历删除某元素,使用这种方法
//iter.remove();
}
}
遍历List的其他方式
2.遍历Set
//方法一,增强for循环
public void method1(HashSet<Integer> set){
for (Integer s:set) {
System.out.println(s);
}
}
//方法二,迭代器
public void method2(HashSet<Integer> set){
for (Iterator<Integer> iterator = set.iterator();iterator.hasNext();) {
System.out.println(iterator.next());
}
}
3.遍历Map
//方法一,根据key获取value
public void method1(HashMap<Integer,String> map){
Set<Integer> keySet = map.keySet(); //获得key的Set集合
for (Integer key:keySet) {
System.out.println(key+":"+map.get(key));
}
}
//方法二,使用entrySet
public void method2(HashMap<Integer,String> map){
//获得节点的Set集合,然后遍历节点即可
Set<Map.Entry<Integer, String>> entries = map.entrySet();
for (Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
}
Collections工具类
常用方法: