一、集合类概述
1、集合类的由来集合容器因为内部的数据结构不同, 有多种具体容器。不断的向上抽取, 就形成了集合框架。
//Collection常用方法演示
import java.util.*;
public class CollectionDemo {
public static void main(String[] args) {
// 创建集合对象
Collection coll = new ArrayList();
show(coll);
System.out.println("-------------------------------");
Collection c1 = new ArrayList();
Collection c2 = new ArrayList();
show(c1, c2);
}
public static void show(Collection c1, Collection c2) {
// 给c1添加元素。
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
c1.add("abc4");
// 给c2添加元素。
c2.add("abc1");
c2.add("abc2");
c2.add("abc3");
c2.add("abc4");
c2.add("abc5");
System.out.println("c1:" + c1);
System.out.println("c2:" + c2);
// 演示addAll
c1.addAll(c2);// 将c2中的元素添加到c1中。
// 演示removeAll
boolean b = c1.removeAll(c2);// 将两个集合中的相同元素从调用removeAll的集合中删除。
System.out.println("removeAll:" + b);
// 演示containsAll
boolean b1 = c1.containsAll(c2);
System.out.println("containsAll:" + b1);
// 演示retainAll
boolean b2 = c1.retainAll(c2);// 取交集,保留和指定的集合相同的元素,而删除不同的元素。
// 和removeAll功能相反 。
System.out.println("retainAll:" + b2);
System.out.println("c1:" + c1);
}
public static void show(Collection coll) {
// 添加元素。add.
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
System.out.println(coll);
// 删除元素。remove
coll.remove("abc2");// 会改变集合的长度
// 清空集合.
// coll.clear();
System.out.println(coll.contains("abc3"));
System.out.println(coll);
}
}
/遍历输出的四种方式
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
public static void main(String[] args) {
List l = new ArrayList();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
System.out.println(l);
// 遍历输出:四种方式
// 1、推荐使用的Iterator对象,迭代输出
Iterator it = l.iterator();
while (it.hasNext()) {
System.out.println("迭代输出:" + it.next());
}
// 2、对集合进行for each循环!
for (String str : l) {
System.out.println("for each输出:" + str);
}
// 3、for循环迭代,在for方法体内部实例化Iterator对象!
int i = 0;// for方法体内定义项不能出现多种不同类型
for (Iterator iter = l.iterator(); i < l.size(); i++) {
System.out.println("for循环输出:" + iter.next());
}
// 4、先将集合转换为数组,再利用数组的遍历输出;
Object[] o = l.toArray();
for (Object object : o) {
System.out.println("转换数组迭代输出:" + object);
}
}
}
//ListIterator演示
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ListDemo2 {
public static void main(String[] args) {
// 创建集合并添加元素
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println("list:" + list);
ListIterator it = list.listIterator();
// 获取列表迭代器对象,它可以实现在迭代过程中完成对元素的增删改查。只有list集合具备该迭代功能.
// Iterator it = list.iterator();
// 在迭代器过程中, 不要使用集合操作元素, 容易出现异常:java.util.Concurrent
// ModificationException。
// 可以使用Iterator接口的 子接口ListIterator来完成在迭代中对元素进行更多的操作。
// 迭代输出
while (it.hasNext()) {
Object obj = it.next();
if (obj.equals("abc2")) {
it.set("abc9");// set方法
}
}
System.out.println("hasNext:" + it.hasNext());// 判断是否有下一个元素
System.out.println("hasPrevious:" + it.hasPrevious());// 判断是否有前一个元素
// 迭代取出前一个元素
while (it.hasPrevious()) {
System.out.println("previous:" + it.previous());//
}
System.out.println("list:" + list);
}
/*
* 使用LinkedList来模拟一个堆栈或者队列数据结构。
* 堆栈:先进后出 First In Last Out FILO
* 队列:先进先出 First In First Out FIFO
*/
import java.util.LinkedList;
public class MyStack {
private LinkedList link;
public MyStack() {
link = new LinkedList();
}
// 堆栈的添加元素的功能
public void myAdd(Object obj) {
link.addFirst(obj);
}
// 堆栈的移除元素的功能
public Object myGet() {
return link.removeFirst();
}
// 堆栈的判断是否包含元素的功能
public boolean isNull() {
return link.isEmpty();
}
}
public class LinkedListDemo {
public static void main(String[] args) {
//创建集合对象,并添加元素
MyStack s = new MyStack();
s.myAdd("abc1");
s.myAdd("abc2");
s.myAdd("abc3");
s.myAdd("abc4");
//堆栈输出
while (!s.isNull()) {
System.out.println(s.myGet());
}
}
}
//HashSet集合存储元素演示
import java.util.HashSet;
import java.util.Iterator;
// 往HashSet集合中存储Person对象。如果姓名和年龄相同,视为同一个人。视为相同元素。
//定义一个Person类
public class Person {
private String name;
private int age;
public Person() {
super();
}
// 构造函数初始化
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
// 覆盖hashCode方法
public int hashCode() {
return name.hashCode() + age * 27;
}
@Override
// 覆盖equals方法
public boolean equals(Object obj) {
if (this == obj)
return true;// 相同返回True
if (!(obj instanceof Person))// 健壮性判断
throw new ClassCastException("类型错误");
Person p = (Person) obj;// 使用子类特有方法
return this.name.equals(p.name) && this.age == p.age;
}
// set、get方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class HashSetTest {
public static void main(String[] args) {
//创建HashSet集合
HashSet hs = new HashSet();
//添加对象元素
hs.add(new Person("小明", 24));
hs.add(new Person("小红", 27));
hs.add(new Person("小强", 21));
hs.add(new Person("小磊", 29));
hs.add(new Person("小丽", 27));
//迭代输出
Iterator it = hs.iterator();
while (it.hasNext()) {
Person p = (Person) it.next();//it.next()为Object类型
System.out.println(p.getName() + "...." + p.getAge());
}
}
}
//TreeSet集合存储元素演示
import java.util.Iterator;
import java.util.TreeSet;
import java.util.Comparator;
//实现Comparator接口,创建自定义比较器
public class ComparatorByLength implements Comparator {
@Override
// 覆盖compare方法
public int compare(Object o1, Object o2) {
String s1 = (String) o1;
String s2 = (String) o2;
int temp = s1.length() - s2.length();
return temp == 0 ? s1.compareTo(s2) : temp;
}
}
//对给定字符串按照长度排序
public class TreeSetTest {
public static void main(String[] args) {
//创建集合,将自定义比较器作为参数传入
TreeSet ts = new TreeSet(new ComparatorByLength());
//添加元素
ts.add("abc");
ts.add("de");
ts.add("bcd");
ts.add("ddddd");
ts.add("eacg");
//迭代输出
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
//keySet方法演示
import java.util.*;
public class KeySetDemo {
public static void main(String[] args) {
// 创建Map集合
Map m = new HashMap();
// 添加元素
m.put(1, "jack");
m.put(2, "rose");
m.put(3, "lucy");
Set s = m.keySet();// 得到的是key的集合
Iterator it = s.iterator();// 然后将key迭代出来
while (it.hasNext()) {
Integer key = it.next();
System.out.println(key + ":" + m.get(key));
}
}
}
//entrySet方法演示
import java.util.*;
import java.util.Map.Entry;
public class EntrySetDemo {
public static void main(String[] args) {
// 创建Map集合
Map m = new HashMap();
// 添加元素
m.put(1, "jack");
m.put(2, "rose");
m.put(3, "lucy");
Set> s = m.entrySet();// 存入Set集合
Iterator> it = s.iterator();//迭代输出
while (it.hasNext()) {
Entry me = it.next();
System.out.println(me.getKey() + ":" + me.getValue());
}
}
}
//Map集合在查表法中的运用
import java.util.HashMap;
import java.util.Map;
public class MapTest {
public static void main(String[] args) {
String week = getWeek(4);//
System.out.println(week);
System.out.println(getWeekByMap(week));
}
// 创建Map集合存储星期中文和英文简写格式的对应关系
public static String getWeekByMap(String week) {
Map map = new HashMap();
map.put("星期一", "Mon.");
map.put("星期二", "Tues.");
map.put("星期三", "Wed.");
map.put("星期四", "Thur.");
map.put("星期五", "Fri.");
map.put("星期六", "Sat.");
map.put("星期日", "Sun.");
return map.get(week);
}
// 根据输入数字返回对应星期中文格式
public static String getWeek(int week) {
if (week < 1 || week > 7)
throw new RuntimeException("没有对应的星期,请您重新输入");
String[] weeks = { "", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
return weeks[week];
}
}
而且通常这些常用的集合容器都是不同步的。