Java入门(13)-- 集合类

2022-04-07 15:38:38 浏览数 (1)

13.1 集合类概述

java.util包中提供了一些集合类,这些集合类又被称为容器。集合类的长度是可变的,用来存放对象的引用。

常用集合类的继承关系:

13.2 Collection接口

Collection接口是层次结构中的根接口,构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理元素的方法。

Collection接口的常用方法:

代码语言:javascript复制
package core;
import 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();// 创建迭代器
    while(it.hasNext()) {
      String str = (String) it.next();
      System.out.print(str   " ");//a b c 
    }
  }
}

注:Iterator的next()方法返回的是Object。

13.3 List集合

List集合包括List接口以及List接口的所有实现类。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。类似Java数组可以通过使用索引来访问集合中的元素。

13.3.1 List接口

List接口继承了Collection接口,包含Collection中的所有方法,此外,List接口还定义了两个重要的方法:

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

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

13.3.2 List接口的实现类

List接口的常用实现类有ArrayList与LinkedList:

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

LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用ListedList类实现的List集合的效率较高,但对于随机访问集合中的对象,使用ListedList类实现的List集合的效率较低。

使用List集合时通常声明为List类型,可通过不同的实现类来实例化集合:

List<E> list = new ArrayList<>()

List<E> list = new LinkedList<>()

其中,E是合法的Java数据类型。

代码语言:javascript复制
package core;
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("c");
    int i = (int)(Math.random()*list.size());//获取0~2之间的随机数
    System.out.println("随机获取数组中的元素:"   list.get(i));//随机获取数组中的元素:b
    list.remove(2);
    System.out.println("将索引是2的元素从数组移除后,数组中的元素是:");
    for(String x : list) {
      System.out.print(x   " ");//a b 
    }
  }
}
13.4 Set集合

Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection,包含Collection接口的所有方法。

Set接口常用的实现类有HashSet类与TreeSet类:

HashSet类实现Set接口,由哈希表(一个HashMap实例)支持,它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变,此类允许使用null元素;

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

TreeSet类增加的方法:

代码语言:javascript复制
package core;
import java.util.*;
public class UpdateStu implements Comparable<Object>{
  String name;
  long id;
  public UpdateStu(String name, long id) {
    this.id = id;
    this.name = name;
  }
  @Override
  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 stu1 = new UpdateStu("李同学", 01011);
    UpdateStu stu2 = new UpdateStu("陈同学", 01021);
    UpdateStu stu3 = new UpdateStu("王同学", 01051);
    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());
    }
    it = tree.headSet(stu2).iterator();//截取排在stu2对象之前的对象
    System.out.println("截取前面部分的集合:");
    while(it.hasNext()) {
      UpdateStu stu = (UpdateStu)it.next();
      System.out.println(stu.getId()   " "   stu.getName());
    }
    it = tree.subSet(stu2,stu3).iterator();//截取排在stu2与stu3之间的对象
    System.out.println("截取中间部分的集合:");
    while(it.hasNext()) {
      UpdateStu stu = (UpdateStu)it.next();
      System.out.println(stu.getId()   " "   stu.getName());
    }
  }
}

运行结果:

注:存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、0或正整数。

13.5 Map集合

Map集合没有继承Collection接口,其提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射一个value。Map集合包括Map接口以及Map接口的所有实现类。

13.5.1 Map接口

Map接口中的常用方法:

代码语言:javascript复制
package core;
import java.util.*;
public class UpdateStu1 {
  public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("01", "李同学");
    map.put("02", "陈同学");
    Set<String> set = map.keySet();
    Iterator<String> it = set.iterator();
    System.out.println("key集合中的元素:");
    while(it.hasNext()) {
      System.out.println(it.next());
    }
    Collection<String> coll = map.values();
    it = coll.iterator();
    System.out.println("value集合中的元素:");
    while(it.hasNext()) {
      System.out.println(it.next());
    }
  }
}

运行结果:

注:Map集合中允许值对象是null,而且没有个数限制。

13.5.2 Map接口的实现类

Map接口常用的实现类有HashMap和TreeMap,由HashMap类实现的Map集合添加和删除映射关系效率更高,如果希望Map集合中的对象存在一定的顺序,应使用TreeMap类实现Map集合。

HashMap类是基于哈希表的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。HashMap通过哈希表对其内部的映射关系进行快速查找,此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

TreeMap类不仅实现了Map接口,还实现了java.util.SortedMap接口,集合中的映射关系具有一定的顺序,不允许键对象是null。

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

Emp.java

代码语言:javascript复制
package core;
public class Emp {
  private String e_id;
  private String e_name;
  public Emp(String e_id, String e_name) {
    this.e_id = e_id;
    this.e_name = e_name;
  }
  public String getName() {
    return e_name;
  }
  public void setName(String e_name) {
    this.e_name = e_name;
  }
  public String getId() {
    return e_id;
  }
  public void setId(String e_id) {
    this.e_id = e_id;
  }
}

MapText.java

代码语言:javascript复制
package core;
import java.util.*;
public class MapText {
  public static void main(String[] args) {
    Map<String,String> map = new HashMap<>();
    Emp emp1 = new Emp("351", "张三");
    Emp emp2 = new Emp("512", "李四");
    Emp emp3 = new Emp("853", "王一");
    Emp emp4 = new Emp("125", "赵六");
    Emp emp5 = new Emp("341", "黄七");
    map.put(emp4.getId(), emp4.getName());
    map.put(emp5.getId(), emp5.getName());
    map.put(emp1.getId(), emp1.getName());
    map.put(emp2.getId(), emp2.getName());
    map.put(emp3.getId(), emp3.getName());
    Set<String> set = map.keySet();
    Iterator<String> it = set.iterator();
    System.out.println("HashMap类实现的Map集合,无序:");
    while(it.hasNext()) {
      String str = (String)it.next();
      String name = (String)map.get(str);
      System.out.println(str   " "   name);
    }
    TreeMap<String,String> treemap = new TreeMap<>();
    treemap.putAll(map);
    Iterator<String> iter = treemap.keySet().iterator();
    System.out.println("TreeMap类实现的Map集合,键对象升序:");
    while(iter.hasNext()) {
      String str = (String)iter.next();
      String name = (String)treemap.get(str);
      System.out.println(str   " "   name);
    }
  }
}

运行结果:

0 人点赞