第9章 类集Collections(容器)
9.1 概述
类集,又称集合类或容器,用来存放对象。
容器:JavaAPI所提供的一系列类的实例,用于在程序中存放对象。
集合类所在的包:java.util
容器API
Set 接口继承Collection,但不允许重复。
List 接口继承Collection,允许重复,并引入位置下标。
Map 接口不继承 Collection。
如何选择数据结构:
ArrayList读块改慢(类似数组)
LinkedList改快读慢(类似链表)
HashSet两者之间
9.1 Collection接口
Collection接口:是一组允许重复的对象。
Collection接口定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。
Set中的数据对象没有顺序且不可以重复;
List中的数据对象有顺序且可以重复;
Collection接口的方法摘要
boolean add(Object element) // 添加元素。
boolean addAll(Collection c) //将指定 collection 中的所有元素都添加到此 collection 中。
void clear() // 移除此collection 中的所有元素。
boolean contains(Object element) //如果此 collection 包含指定的元素,则返回 true。
boolean containsAll(Collectionc) // 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
boolean equals(Object element) // 比较此 collection 与指定对象是否相等。
boolean isEmpty() // 如果此collection 不包含元素,则返回 true。
Iterator
boolean remove(Object element) // 从此 collection 中移除指定元素的单个实例,如果存在的话。
boolean removeAll(Collection c) // 移除此 collection 中那些也包含在指定 collection 中的所有元素。
boolean retainAll(Collection> c) //仅保留此 collection 中那些也包含在指定 collection 的元素。
int size()//返回此 collection 中的元素数。
Object[] toArray()//返回包含此collection 中所有元素的数组。
【程序示例】:
public class Name {
private String firstName;
private String lastName;
public Name(StringfirstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public StringgetFirstName() {
return firstName;
}
public StringgetLastName() {
return lastName;
}
public String toString(){
return firstName + " " + lastName;
}
}
import java.util.*;
public class ArrayListDemo {
public static void main(String[]args) {
Collection c= new ArrayList();
c.add("hello");
c.add(new Name("f1","l1"));
c.add(100);
System.out.println(c.size());
System.out.println(c); //调用toString方法
}
}
【运行结果】:3
[hello, f1 l1, 100]
9.1.1 List接口
List接口:(有顺序、可重复)
List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序,而且可以重复。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
实现类:ArrayList和LinkedList
ArrayList(重点):(类似数组)
【特点】可以添加重复值、可以添加null、元素下标和添加的顺序相符合、允许通过下标访问元素
【常用方法】add(),addAll(),remove(), get(int), set(int ,Object);
【程序示例】
public static void main(String[] args) {
List list = new ArrayList();
list.add("120");
list.add(10); // 自动装箱
list.add("hello");
System.out.println("list:" + list);//list:[120, 10,hello]
List list2 = new ArrayList();
list2.add("hello");
list2.add(1);
System.out.println("list2:" + list2);//list2:[hello,1]
list.addAll(list2);// 添加一个集合类
System.out.println("list:" + list);//list:[120, 10,hello, hello, 1]
list.add(20);//元素下标和添加的顺序相符合,所以20会被放在最后
System.out.println("list:" + list);//list:[120, 10,hello, hello, 1, 20]
list.remove(0);
System.out.println("list:" + list);//list:[10,hello, hello, 1, 20]
/**
* ArrayList允许通过下标访问集合元素
*/
System.out.println("下标为2的元素:" + list.get(2));//下标为2的元素:hello
list.set(1, "world");//把下标为1的元素设为"world"
System.out.println("list:" + list);//list:[10,world, hello, 1, 20]
Iteratori = list.iterator();
while (i.hasNext()){
//Object o =i.next();
System.out.print(i.next()+" ");
}
System.out.println();
list.add(null);
System.out.println("list:" + list);
//list:[10, world, hello, 1, 20, null]
}
LinkedList:(类似链表)
【特点】:1.添加对列表的头部和尾部进行操作的方法 2.可以添加null 3.可以添加重复值
【程序示例】
public static void main(String[] args) {
List list = new LinkedList();
list.add("test");
list.add("ynz");
list.add(100);
System.out.println(list);//[test,ynz, 100]
System.out.println(list.get(1));//ynz
list.set(2, "java");//把下标为2的元素设为"java"
System.out.println(list);//[test,ynz, java]
LinkedList list2 = new LinkedList();
list2.add("hello");
list2.add(20);
list2.addFirst("first");//在开头位置加入"first"
list2.addLast("last");//在开头位置加入"last"
System.out.println(list2);//[first,hello, 20, last]
list.addAll(list2);
System.out.println(list);//[test,ynz, java, first, hello, 20, last]
list2.removeFirst();//删除第一个元素
list2.removeLast();//删除第一个元素
System.out.println(list2);//[hello,20]
// peek():返回集合中第一个元素,且不删除
System.out.println(list2.peek());//hello
System.out.println(list2);//[hello,20]
// poll():返回集合中第一个元素,且删除此元素
System.out.println(list2.poll());//hello
System.out.println(list2);//[20]
list2.add(null);
list2.add(20);
System.out.println(list2);//[20,null, 20]
}
9.1.2 Set接口
Set接口:(有顺序、不可以重复)
Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复。
实现类:HashSet和TreeSet
HashSet:
【特点】1.可以添加null 2.不允许重复的元素
【常用方法】add(),addAll(), iterator(), remove(),contains()
【程序示例】
public static void main(String[] args) {
Set set1 = new HashSet();
set1.add(100);
set1.add("hello");
set1.add(3.5);
System.out.println("set1:" + set1);// set1:[100,hello, 3.5]
set1.add("hello"); // 相同的元素不会被加入
set1.add(null);
System.out.println("set1:" + set1);// set1:[100,hello, 3.5, null]
Set set2 = new HashSet();
set2.add(1);
set2.add("hello");
System.out.println("set2:" + set2);// set2:[hello,1]
set1.addAll(set2); // 添加一个集合类
System.out.println("set1:" + set1);// set1:[100,hello, 1, 3.5, null]
set1.remove(3.5); // 删除某个元素
System.out.println("set1:" + set1);// set1:[100,hello, 1, null]
set1.removeAll(set2); // 删除一个集合类
System.out.println("set1:" + set1);// set1:[100,null]
/**
* 通过迭代器来遍历Set
*/
Iterator i = set1.iterator(); // 创建迭代器
System.out.print("set1的元素:");
while (i.hasNext()) {
System.out.print(i.next() + " ");
}
System.out.println();
boolean bool = set1.contains(100);
System.out.println(bool);// true
set1.clear(); // 删除集合类的所有元素
System.out.println("set1:" + set1);//set1:[]
}
TreeSet:
【特点】1.不允许重复值 2.可以对元素进行排序(升序),元素类型要一致 3.不允许添加null值
【程序示例】
public static void main(String[] args) {
Set set = new TreeSet();
set.add(100);
set.add(120);
System.out.println(set);//[100,120]
TreeSet set2 = new TreeSet();
set2.add(10);
set2.add(120);
set.addAll(set2);
System.out.println(set);//[10,100, 120]
set.add(5);
System.out.println(set);//[5, 10,100, 120]
set.add(20);
System.out.println(set);//[5, 10,20, 100, 120]
// set.add(null); 不能添加null
Iterator i = set.iterator();
while (i.hasNext()) {
System.out.print(i.next()+"");
}
System.out.println();
System.out.println("set中元素的个数:" + set.size());//set中元素的个数:5
}
历史类(JDK1.0)(了解)
ArrayList:Vector
LinkedList:Stack
9.2 Map接口
Map接口
Map接口定义了存储“键(key)-值(value)映射对”的方法。
Map中存放的是key=value对(键-值对),可以通过键寻找值。(key和value之间用=连接)
Map类中存储的键-值对通过键(key)来标识,所以key不能重复,但值可以重复。
实现类:HashMap和TreeMap
HashMap :(重点)由哈希表实现
1.存放键值对 2.键不能重复,值可以重复 3.键和值都可以为null
遍历map的两种方式:
(1)通过keySet()获取所有的键,通过键取值:get(key)
(2)通过entrySet()获取所有的Map.Entry
【程序示例】
public static void main(String[] args) {
Map map = new HashMap();
map.put(1, 2000);
map.put(2, 4000);
map.put(3, 2500);
map.put("java", "1578");
map.put(4, "good");
System.out.println(map);//{java=1578,2=4000, 4=good,1=2000, 3=2500}
map.put(2, 5000); //会覆盖原有的value,因为key不可以重复
System.out.println(map);//{java=1578,2=5000, 4=good,1=2000, 3=2500}
map.put(5, 2000); // value可以重复
System.out.println(map);
//{java=1578, 2=5000, 4=good, 1=2000, 3=2500, 5=2000}
map.put(null, null); //可以添加null
System.out.println(map);
//{java=1578, 2=5000, 4=good, 1=2000, null=null, 3=2500,5=2000}
/*
* 通过key找value的方法: value get(key);遍历map
*/
Set keys = map.keySet();// keySet():返回map中所有键的集合
Iterator i = keys.iterator();
while (i.hasNext()) {
Object key = i.next();
System.out.println("value:" + map.get(key));
}
【遍历map的两种方法】
public static void main(String[] args) {
Map
map.put(1, "world");
map.put(2, "String");
map.put(3, "hello");
/**
* 遍历map的方法(一) keySet(); 找到所有的键
*/
Set
Iterator
while (i.hasNext()) {
Integer key = i.next();
System.out.println(map.get(key));
}
/*
* 遍历map的方法(二)Set
* 返回此映射中包含的映射关系的 set 视图。
*/
Set
//Iterator
for (Map.Entry
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " =" + value);
}
}
TreeMap:由二叉树实现
1.存放键值对 2.键不能重复,值可以重复 3.按键的大小进行自动排序(升序) 4.键不能为null,值可以为null
【程序示例】
public static void main(String[] args) {
Map
map.put("001", "lilei");
map.put("002", "han×××");
map.put("hello", "nihao");
map.put("good", "morning");
map.put("aaa", "test");
map.put("good", "test");
map.put("003",null);
System.out.println(map);
//{001=lilei, 002=han×××, 003=null, aaa=test,good=test, hello=nihao}
}
历史集合类:(了解)
HashMap:HashTable
TreeMap:Properties
9.3 Iterator接口
Iterator接口: (重点)
主要用于遍历集合类中的元素;
所有实现了Collection接口的容器类都有一个iterator()方法用以返回一个实现了Iterator接口的对象。
Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
Iterator接口定义了如下方法:
boolean hasNext(); //判断容器内是否还有元素
Object next(); //返回容器内的下一个元素
void remove(); //