Java集合的使用方法
每次用到什么list, map时都要Google一下初始化,取值各种方法,还有Arrays工具类等等,真的感觉Java很麻烦不习惯,还是写个总结好好梳理一下吧,至于这些类的底层实现以及运行效率分析什么的以后再做总结吧。
另外使用集合而不是数组的主要原因是集合提供了很多方法,并且长度是可变的。首先集合分两大类:

Collection
有各种数据结构,就分了多种集合类,然后这些集合类共性提取,最终形成了一个集合的继承体系,最高层的类就是collection。
collection的功能有:
1 | boolean add(Object obj) //添加一个元素 |
迭代器
Collection接口继承了Iterable接口,他返回一个Iterator,Iterator有三个方法
hasNext, next(), remove() 但没有实现,要在子类中进行实现了
List
元素有序,可重复。ListIterator接口多了几个方法,有三个常用子类
- ArrayList:数组,线程不安全
- LinkedList:双向链表,线程不安全
- Vector:数组,线程安全
list 初始化:
1 | List<String> str = new LinkedList<>(); |
这里new 后面的LinkedList 换成ArrayList 也是没有任何问题的,都是向上转型。
Arrays是Array的工具类,其静态方法定义了对Array的各种操作
List 遍历方法:
1 | List<Object[]> obj = new ArrayList<>(); |
ArrayList 增删改查方法:
1 | void add(int index, Element e) //增加指定元素到链表指定位置 |
LinkedList 增删改查方法:
1 | boolean list.add() |
Arrays 的方法:
和下面的collections一样,方法都是静态的,创建之后
1 | Arrays.asList() //将Array包装成一个List |
Collections 的方法:
1 | public static <T> boolean addAll(Collection<? super T> c, T… elements); //添加 |
Queue 和 Stack
1 | //1.栈(Stack):继承自Vector |
Set
元素不可重复,存储无序(存入和取出的顺序不一定相同),三个常用子类:
- HashSet:哈希表,无序
- TreeSet:红黑树,有序
- LinkedHashSet:底层数据结构是哈希表和链表
Set具有与Collection完全一样的接口,因此没有任何额外的功能
Map
类型区别
HashMap
最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
TreeMap
能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
Hashtable
与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。
LinkedHashMap
保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。
常用方法
1 | Map<String, String> map = new HashMap<String, String>(); //Map 初始化 |
遍历
1 | //========增强for循环========: |
速度比较:
- 增强for循环使用方便,但性能较差,不适合处理超大量级的数据。
- 迭代器的遍历速度要比增强for循环快很多,是增强for循环的2倍左右。
- 使用entrySet遍历的速度要比keySet快很多,是keySet的1.5倍左右。
各种排序
List 的排序
对数组而言,你可以直接使用Arrays.sort,对于List和Vector而言,你可以使用Collections.sort方法。使用Collections工具类进行排序,有两种使用方法:
通过list的类对象实现comparable接口,需要重写 compareTo() 方法,这个方法接收一个同类型的对象,并实现这个对象和传递给方法的另一个对象比较的逻辑。compareTo()方法返回Int类型的比较结果,正值表示当前对象比传递给 comPareTO()的对象大,负值表示当前对象比传递给 comPareTO()的对象小
1
2
3
4
5
6public class Student implements Comparable{
public int compareTo(User arg0) {
return this.getOrder().compareTo(arg0.getOrder());
}
}根据Collections.sort重载方法来实现:也提供了一个单一的比较方法叫作 compare()。然而,与 Comparable的 compareTo() 方法不同的是,这个 compare() 接受两个同类型的不同对象进行比较
1
2
3
4
5Collections.sort(list,new Comparator<User>(){
public int compare(User arg0, User arg1) {
return arg0.getPrice().compareTo(arg1.getPrice());
}
});
Map 排序
HashMap、Hashtable、LinkedHashMap排序:通过ArrayList构造函数把map.entrySet()转换成list
1
2
3
4
5
6
7
8Map<String, String> map = new HashMap<String, String>();
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
public int compare(Map.Entry<String, String> mapping1, Map.Entry<String, String> mapping2) {
return mapping1.getKey().compareTo(mapping2.getKey());
}
});
TreeMap默认按key进行升序排序,如果想改变默认的顺序,可以使用比较器:
1
2
3
4
5
6
7Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
public int compare(String o1, String o2) {
// 降序排序
return o1.compareTo(o2);
}
});按想要的 value 值排序,也要先用ArrayList 构造函数把entrySet() 转化为 list,再用collections 的比较器来比较:
1
2
3
4
5
6
7
8
9Map<String, String> map = new TreeMap<String, String>();
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
public int compare(Map.Entry<String, String> mapping1, Map.Entry<String, String> mapping2) {
return mapping1.getValue().compareTo(mapping2.getValue());
}
});