Loading

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 实现,添加到映射的元素一定是可排序的。

posted @ 2018-01-02 13:01  Xianhao  阅读(35)  评论(0编辑  收藏  举报