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);
}
}
}
运行结果: