12.集合类

12.集合类

12.1集合类概述

java.util包中提供了一些集合类,即容器。宠用的集合有List集合、Set集合、Map集合。其中List与Set继承了Collection接口,各接口提供了不同的实现类。

集合与数组的区别:

数组长度固定,集合长度可变;

数组存放基本类型的数据,集合存放数据的引用。

常见集合类继承关系如下:

 

12.2Collection接口

Collcetion接口是层次结构中的根接口。构成Collection的单位称为元素。

Collection接口不能直接使用,但提供了一些方法,对List和Set集合通用。

Collection接口常用方法如下:

方法 功能描述
add(Object e) 将指定的对象添加到该集合中
remove(Object o) 将指定对象从该集合中移除
isEmpty() 返回Boolean值,用于判断当前集合是否为空
iterator() 返回在此Collection的元素上进行迭代的迭代器,用于遍历集合中的对象
size() 返回int型值,获取该集合中元素个数

遍历集合通常通过迭代器实现,举例如下:

import java.util.*;  //使用集合类需要导入java.util包
public class Muster {
    public static void main(String[] args) {
        Collection<String>list=new ArrayList<>();  //实例化集合类对象
         list.add("a");                            //向集合添加数据
         list.add("b");
         list.add("c");
         Iterator<String>it=list.iterator();       // Collection接口中iterator()方法返回迭代器
         while(it.hasNext()){                      //判断是否有下一个元素
             String str=(String)it.next();
             System.out.println(str);              //获取集合中元素
             
        }
    }
}

Iterator的next()方法返回的是Object,所以需要

12.3List集合

List集合包括List接口以及List接口的所有实现类。

List集合中的元素允许重复,各元素顺序就是对象插入顺序。

用户可以通过索引访问集合中元素。

12.3.1List接口

List接口包含了Collection中所有方法。此外,List接口还定义了一下两个非常重要的方法。

get(int index):获取指定索引位置的元素。

set(int index,Object obj): 将集合中指定索引位置的对象修改为指定的对象。

 

12.3.2List接口的实现类

ArrayList类:实现了可变数组,允许保存所有元素,包括NULL;可以根据索引位置对集合进行快速的随机访问;但是插入删除对象速度较慢

LinkedList类:链表结构保存对象;插入删除效率较高;但是随机访问集合中对象时速度较慢

通过Array List、LinkedList类实例化List集合代码如下:

List<E>list=new ArrayList<>();
List<e>list2=new LinkedList<>();
//E为合法的java数据类型

举例如下:

import java.util.*;
​
public class Gather {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        int i = (int) (Math.random() * list.size());
        System.out.println("随机获取集合中元素" + list.get(i));
        list.remove(2);
        System.out.println("移除索引为2的元素后,集合中剩余元素如下");
        for (int j = 0; j < list.size(); j++) {
            System.out.println(list.get(j));
        }
    }
}

类似数组,集合索引也是从0开始。

12.4Set集合

Set集合中对象没有顺序,不能有重复对象。

Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有对象。

Set接口常用类由HashSet类和TreeSet类。

HashSet类实现Set接口,由哈希表支持,不保证Set的迭代顺序,即迭代顺序可能改变,此类允许使用NULL元素。

TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口。故TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以通过比较器对TreeSet类实现的Set集合中对象进行排序。

TreeSet类增加的方法

方法 功能描述
first() 返回Set集合第一个元素
last() 返回Set集合最后一个元素
comparator() 返回对此Set中元素进行排序的比较器。如果此Set使用自然排序,返回NULL
headSet(E toElement) 返回一个新的Set集合,集合是toElement(不包含)之前的所有对象
subSet(E fromElement,E fromElement) 返回一个新的Set集合,集合是formElement对象(包含)与fromElement对象(不包含)之间所有对象
tailSet(E fromElement) 返回一个新Set集合,新集合包含fromElement对象(包含)之后所有对象

记忆:指定位置位于新集合起始位置,则包含该对象;指定位置位于新集合终点位置,则不包含该对象

举例如下:

import java.util.Iterator;
import java.util.TreeSet;
​
public class UpdateStu implements Comparable<Object> {
    String name;
    long id;
​
    //Comparable接口里有compareTo()方法,继承该接口需要重写compareTo()方法
    public UpdateStu(String name, long id) {
        this.id = id;
        this.name = name;
    }
​
    //重写compareTo()方法
    public int compareTo(Object o) {
        UpdateStu upstu = (UpdateStu) o;
        int result = id > upstu.id ? 1 : (id == upstu.id ? 0 : -1);
        return result;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public long getId() {
        return id;
    }
​
    public void SetId(long id) {
        this.id = id;
    }
​
    public static void main(String[] args) {
        //按照构造方法生成UpdateStu对象
        UpdateStu stu1 = new UpdateStu("李同学", 01011);
        UpdateStu stu2 = new UpdateStu("陈同学", 01012);
        UpdateStu stu3 = new UpdateStu("王同学", 01013);
        UpdateStu stu4 = new UpdateStu("马同学", 01012);
        //创建集合类
        TreeSet<UpdateStu> tree = new TreeSet<>();
        tree.add(stu1);
        tree.add(stu2);
        tree.add(stu3);
        tree.add(stu4);
        //创建集合类所有对象的迭代器,用以遍历
        Iterator<UpdateStu> it = tree.iterator();
        System.out.println("Set集合中所有元素");
        while (it.hasNext()) {
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
        //截取stu2集合之前的对象
        it = tree.headSet(stu2).iterator();
        System.out.println("截取前面部分的集合");
        while (it.hasNext()) {
            UpdateStu stu = (UpdateStu) it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
        //截取stu2和stu3之间的对象
        it = tree.subSet(stu2, stu3).iterator();
        System.out.println("截取中间部分的集合");
        while (it.hasNext()) {
            UpdateStu stu = it.next();
            System.out.println(stu.getId() + " " + stu.getName());
        }
    }
}

TreeSet类实现的Set集合必须实现Comparable接口,该接口中的CompareTo(Object o)方法比较此对象与值得对象的顺序。返回值包含负整数、0、正整数。

12.5Map集合

Map集合包含Map接口和Map接口所有的实现类。

Map集合中提供key到value的映射。Map中不能包含相同的key,每个key映射一个value。

key觉得了存储对象在映射中的存储位置。每个key通过散列技术产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。

12.5.1Map接口

一个映射不能包含重复的key,每个key最多只能映射一个值,Map接口同样提供了集合常用方法,并额外包含了如下方法:

方法 功能描述
put(K key,V value) 向集合中添加特定的key和value的映射关系
containsKey(Object key) 若此映射包含指定key的映射关系,返回true
containsValue(Object value) 若此集合中存在一个或多个指定值,返回true
get(Object key) 若存在指定的key对象,返回对象的值,否则返回null
keySet() 返回该集合中所有key对象形成的Set集合
values() 返回该集合所有values对象形成的Collection集合

举例如下:

import java.util.*;
public class UpdateStu {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();  //创建map实例
        map.put("01", "李同学");
        map.put("02", "赵同学");
        map.put("03", "钱同学");
        //向map集合添加对象,注意map没有add()方法
​
        System.out.println("集合中key元素如下:");
        Set<String>set=map.keySet();
        //构建key对象的Set集合
        Iterator it=set.iterator();
        //构建Set集合的迭代器,进行遍历
        while(it.hasNext()){
            System.out.println(it.next());
        }
​
        System.out.println("集合中values元素如下:");
        Collection<String>coll=map.values();
        //构建value对象的Collection集合
        it=coll.iterator();
        //构建coll集合的迭代器,进行遍历
        while(it.hasNext()){
            System.out.println(it.next());
        }
​
    }
}

注意Map集合允许对象是null,没有个数限制,如可以向集合中添加对象" map.put("05","null"); ".

12.5.2Map接口的实现类

Map接口常用实现类有HashMap和TreeMap。

HashMap:

1.基于哈希表的Map接口实现,可以通过哈希码对内部映射进行快速查找,故添加和删除效率更高。

2.允许使用null值和null键,但必须将保证健的唯一性。

3.不保证映射顺序,映射顺序可能会被改变。

TreeMap:

1.实现了Map接口,还实现了java.util.SortMap接口,故集合中的映射存在一定顺序。

2.映射关系根据健对象按照一定顺序排列,故不允许键对象是null。

可以通过HashMap创建Map集合,当需要输出顺序是,再创建一个完成相同映射关系的TreeMap类实例。

举例如下:

import java.util.*;
​
public class MapText {
    public static void main(String[] args) {
        Emp emp1 = new Emp("123", "张三");
        Emp emp2 = new Emp("254", "李四");
        Emp emp3 = new Emp("361", "王大");
        Emp emp4 = new Emp("122", "晓二");
        //创建Emp对象
​
        Map<String, String> map = new HashMap<>();
        //创建由HashMap实现的Map集合
        map.put(emp3.getId(), emp3.getName());
        map.put(emp1.getId(), emp1.getName());
        map.put("315", "赵武");
        map.put(emp2.getId(), emp2.getName());
        map.put(emp4.getId(), emp4.getName());
        //将对象添加到集合中
​
        System.out.println("HashMap类实现的Map集合,无序:");
        Set<String> set = map.keySet();
        //获取Key对象组成的Set集合
        Iterator<String> it = set.iterator();
        //获取set集合的迭代器,进行遍历
        while (it.hasNext()) {
            String id = (String) it.next();
            String name = (String) map.get(id);
            System.out.println(id + " " + name);
        }
​
        System.out.println("TreeMap类实现的升序集合,键对象升序排序");
        Map<String, String> treemap = new TreeMap<>();
        treemap.putAll(map);
        //创建TreeMap集合,并向集合中添加对象
        Iterator<String> iter = treemap.keySet().iterator();
        //返回treemap集合的Key集合的迭代器
        while (iter.hasNext()) {
            String id = iter.next();
            String name = treemap.get(id);
            System.out.println(id + " " + name);
        }
    }
}
​

 

 

 

参考资料:http://www.noobyard.com/article/p-qudndofz-ka.html