Java集合类
首先java中集合类主要有两大分支:
(1)Collection (2)Map
这是Collection的图
然后这是Map的图
这两张图片是Java集合类的图,然后接下来我们一个一个看(因为队列少见这里就不列出了)。
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代器
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
下图是Collection接口中常用的方法
iterator接口
Set接口
Set接口同样是Collection接口的一个子接口,它表示数学意义上的集合概念。Set中不包含重复的元素,即Set中不存两个这样的元素e1和e2,使得e1.equals(e2)为true。由于Set接口提供的数据结构是数学意义上集合概念的抽象,因此它需要支持对象的添加、删除,而不需提供随机访问。Set接口与Collection的接口相同,在此对里面的方法不作介绍。
HashSet 类和 TreeSet 类
“集合框架”支持 Set 接口两种普通的实现:HashSet 和TreeSet。在更多情况下,您会使用 HashSet 存储重复自由的集合。考虑到效率,添加到 HashSet 的对象需要采用恰当分配散列码的方式来实现hashCode() 方法。虽然大多数系统类覆盖了 Object 中缺省的hashCode()实现,但创建您自己的要添加到 HashSet 的类时,别忘了覆盖 hashCode()。当您要从集合中以有序的方式抽取元素时,TreeSet 实现会有用处。为了能顺利进行,添加到TreeSet 的元素必须是可排序的。 “集合框架”添加对 Comparable 元素的支持,在排序的“可比较的接口”部分中会详细介绍。我们暂且假定一棵树知道如何保持java.lang 包装程序器类元素的有序状态。
具体 Set 类的使用:
下面的代码创建了一个 HashSet,并往里添加了一组名字,其中有个名字添加了两次。接着,程序把集中名字的列表打印出来,演示了重复的名字没有出现。接着,程序把集作为TreeSet 来处理,并显示有序的列表。
import java.util.*;
public class TestSet {
public static void main(String args[]) {
Set<String> set = new HashSet<>();
set.add("Bernadine");
set.add("Elizabeth");
set.add("Gene");
set.add("Elizabeth");
set.add("Clara");
System.out.println(set);
Set<String> sortedSet = new TreeSet<>(set);
System.out.println(sortedSet);
}
}
运行程序产生了以下输出。请注意重复的条目只出现了一次,列表的第二次输出已按字母顺序排序。
List接口
List 接口继承了 Collection 接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。
此接口可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。更准确地说,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2。
List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问。还提供了一个方法来获取从列表中指定位置开始的列表迭代器。
list中常用方法举例
import java.util.LinkedList;
import java.util.List;
public class TestList {
public static void main(String args[]) {
List list = new LinkedList();
for (int i = 0; i < 6; i++) {
list.add("a"+i);
}
System.out.println("输出整个list");
System.out.println(list);
list.add(3,"a100");
System.out.println("在三个元素后添加一个元素,输出整个list");
System.out.println(list);
System.out.println("输出第三个元素");
System.out.println(list.get(2));
System.out.println("输出a3在数组中的位置");
System.out.println(list.indexOf("a3"));
list.remove(1);
System.out.println("移除第一个元素后输出整个list");
System.out.println(list);
}
}
小结:
Collection是集合接口:
Set子接口:无序,不允许重复。
List子接口:有序,可以有重复元素。
Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变
Set和List具体子类:
Set
|——HashSet:以哈希表的形式存放元素,插入删除速度很快。
List
|——ArrayList:动态数组
|——LinkedList:链表、队列、堆栈。
Map接口
Map 接口不是 Collection 接口的继承。按定义,该接口描述了从不重复的键到值的映射。
我们可以把这个接口方法分成两组操作:改变、查询。
改变操作允许您从映射中添加和除去键-值对。键和值都可以为 null。
Object put(Object key, Object value)返回值是被替换的值。
Object remove(Object key)
void clear()
查询操作允许您检查映射内容:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
HashMap 类和 TreeMap 类
“集合框架”提供两种常规的 Map 实现:HashMap 和TreeMap。和所有的具体实现一样,使用哪种实现取决于您的特定需要。在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按顺序遍历键,那么TreeMap 会更好。根据集合大小,先把元素添加到 HashMap,再把这种映射转换成一个用于有序键遍历的 TreeMap 可能更快。使用HashMap 要求添加的键类明确定义了 hashCode() 实现。有了TreeMap 实现,添加到映射的元素一定是可排序的。