集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大内容:对外的接口、接口的实现和对集合运算的算法。
va的集合框架最全详解(图)http://davidisok.iteye.com/blog/2106563
下图是简化的集合框架关系图:
- Collection接口
Collection 接口是 java 集合框架里的一个根接口,也是 List、Set 和 Queue 接口的父接口。Collection 接口中定义了操作 List、Set 和 Queue 的方法——增删改查。
- Map接口
Map 接口也是一个非常重要的集合接口,用于存储键/值对。Map 中的元素都是成对出现的,键值对就像数组的索引与数组的内容的关系一样,将一个键映射到一个值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。Map中的键值对以Entry类型的对象实例形式存在。
- List接口和ArrayList类
List是接口,不能实例化,需要具体的类来实例化。
List集合中的对象(元素)是按顺序存储的,内容可以重复。
List实现的接口有:ArrayList(实现动态数组),Vector(实现动态数组),LinkedList(实现链表),Stack(实现堆栈)。
ArrayList擅长于随机访问,但插入和删除较慢(数组,有序)
LinkedList擅长于插入删除,但随机访问比较慢(链表,无序)
ArrayList类实现一个动态增长的数组,可以存储不同类型的对象,而数组只能存储特定数据类型的值。
package collectionTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class ListTest {
//泛型规定了集合元素的类型
public List<Student> students;
public ListTest(){
this.students = new ArrayList<Student>();
}
//添加
public void testAdd(){
Student student = new Student("1", "tom");
students.add(student);
Student temp = students.get(0);
System.out.println(temp.id+" "+temp.name);
//System.out.println(temp.getId()+" "+temp.getName());
System.out.println("-----");
Student st2 = new Student("2", "李四");
students.add(1, st2);
Student temp2 = students.get(0);
Student temp0 = students.get(1);
System.out.println(temp2.id+" "+temp2.name);
System.out.println(temp0.id+" "+temp0.name);
//对象数组的形式
Student[] studentArr = { new Student("3", "王五"), new Student("4", "马六") };
//Array类操作数组,asList返回 一个受指定数组支持的固定大小的List
students.addAll(Arrays.asList(studentArr));
Student temp3 = students.get(2);
Student temp4 = students.get(3);
System.out.println("添加了学生:" + temp3.id + ":" + temp3.name);
System.out.println("添加了学生:" + temp4.id + ":" + temp4.name);
Student[] student2 = { new Student("5", "周七"), new Student("6", "赵八") };
students.addAll(2, Arrays.asList(student2));
Student temp5 = students.get(2);
Student temp6 = students.get(3);
System.out.println("添加了学生:" + temp5.id + ":" + temp5.name);
System.out.println("添加了学生:" + temp6.id + ":" + temp6.name);
System.out.println("-----");
}
//获取List中的元素
public void testGet(){
int size = students.size();
for(int i = 0;i < size;i++){
Student st = students.get(i);
System.out.println("get学生:" + st.id + ":" + st.name);
}
System.out.println("-----");
}
//通过迭代器来遍历并选择List中的对象
public void testIterator(){
Iterator<Student> it = students.iterator();
System.out.println("有如下学生(通过迭代器访问):");
while(it.hasNext()){
Student st = it.next();
System.out.println("学生:" + st.id + ":" + st.name);
}
System.out.println("-----");
}
//通过Foreach来访问集合元素
public void testForeach(){
System.out.println("有如下学生(通过foreach访问):");
for(Student obj : students){
System.out.println("学生:" + obj.id + ":" + obj.name);
}
System.out.println("-----");
}
//修改集合元素
public void testModify(){
students.set(3, new Student("3", "wang jiu"));
}
//删除集合元素
public void testRemove() {
Student st = students.get(4);
System.out.println("我是学生:" + st.id + ":" + st.name + ",我即将被删除");
students.remove(st);
System.out.println("成功删除学生!");
testForeach();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ListTest lt = new ListTest();
lt.testAdd();
lt.testGet();
lt.testIterator();
lt.testForeach();
lt.testModify();
lt.testRemove();
}
}
- Set接口和HashSet类
Set集合里面的元素是无序的,并且元素不重复,被称为集。
HashSet 由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
package collectionTest;
import java.util.HashSet;
import java.util.Set;
public class PD {
public String id;
public String name;
//泛型是规定了集合元素的类型
public Set<Student> students;
public PD(String id, String name){
this.id = id;
this.name = name;
this.students = new HashSet<Student>();
}
}
package collectionTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class SetTest {
public List<Student> students;
public SetTest() {
students = new ArrayList<Student>();
}
/*
* 用于往students中添加学生
*/
public void testAdd() {
//创建一个学生对象,并通过调用add方法,添加到学生管理List中
Student st1 = new Student("1", "张三");
students.add(st1);
//添加到List中的类型均为Object,所以取出时还需要强转
Student st2 = new Student("2","李四");
students.add(st2);
Student[] student = {new Student("3", "王五"),new Student("4", "马六")};
students.addAll(Arrays.asList(student));
Student[] student2 = {new Student("5", "周七"),new Student("6", "赵八")};
students.addAll(Arrays.asList(student2));
}
/**
* 通过for each 方法访问集合元素
* @param args
*/
public void testForEach() {
System.out.println("有如下学生(通过for each):");
for(Object obj:students){
Student st = (Student)obj;
System.out.println("学生:" + st.id + ":" + st.name);
}
}
public static void main(String[] args){
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
PD pd = new PD("1","张老师");
System.out.println("请:" + pd.name + "选择小组成员!");
//创建一个 Scanner 对象,用来接收从键盘输入的学生 ID
Scanner console = new Scanner(System.in);
for(int i = 0;i < 3; i++){
System.out.println("请输入学生 ID");
String studentID = console.next();
for(Student s:st.students){
if(s.id.equals(studentID)){
pd.students.add(s);
}
}
}
st.testForEachForSer(pd);
// 关闭 Scanner 对象
console.close();
}
//打印输出,老师所选的学生!Set里遍历元素只能用foreach 和 iterator
//不能使用 get() 方法,因为它是无序的,不能想 List 一样查询具体索引的元素
public void testForEachForSer(PD pd){
for(Student s: pd.students) {
System.out.println("选择了学生:" + s.id + ":" + s.name);
}
}
}
- HashMap类
HashMap 是基于哈希表的 Map 接口的一个重要实现类。HashMap 中的 Entry 对象是无序排列的,Key 值和 value 值都可以为 null,但是一个 HashMap 只能有一个 key 值为 null 的映射(key 值不可重复)
package collectionTest;
public class Course {
public String id;
public String name;
public Course(String id, String name){
this.id = id;
this.name = name;
}
}
package collectionTest;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class MapTest {
//用来承装课程类型对象
public Map<String,Course> courses;
//初始化courses
public MapTest(){
this.courses = new HashMap<String, Course>();
}
/**
* 测试添加:输入课程 ID,判断是否被占用
* 若未被占用,输入课程名称,创建新课程对象
* 并且添加到 courses 中
* @param args
*/
public void testPut(){
//创建一个Scanner对象
Scanner console = new Scanner(System.in);
for(int i = 0 ; i < 3;i++){
System.out.println("请输入课程ID:");
String ID = console.next();
//判断该ID是否被占用
Course cr = courses.get(ID);
if(cr == null){
System.out.println("请输入课程name:");
String name = console.next();
//创建新课程
Course newCourse = new Course(ID,name);
//添加课程到Map
courses.put(ID, newCourse);
System.out.println("添加了课程:"+courses.get(ID).id+" "+courses.get(ID).name);
}else{
System.out.println("该课程已经被占用!");
continue;
}
}
System.out.println("--------");
}
//查出课程
public void testKeySet(){
//ketSet()方法返回map中所有键的set集合
Set<String> keySet = courses.keySet();
//遍历keySet中的每个键,通过get方法取得每个键对应的Value
for(String crID : keySet){
Course cr = courses.get(crID);
System.out.println("课程是:"+cr.id+cr.name);
}
System.out.println("--------");
}
//删除map中的映射
public void TestRemove(){
Scanner console = new Scanner(System.in);
while(true){
System.out.println("请输入要删除的课程的ID:");
String ID = console.next();
Course cr = courses.get(ID);
//判断该ID是否存在对应的课程对象
if(cr == null){
System.out.println("该ID不存在!");
continue;
}
//删除映射
courses.remove(ID);
System.out.println("删除了课程:"+cr.id+cr.name);
break;
}
System.out.println("--------");
}
//通过entrySet()来遍历map
public void testEntrySet(){
//entrySet()返回map中的所有键值对
Set<Entry<String, Course>> entrySet = courses.entrySet();
for(Entry<String, Course> entry : entrySet){
System.out.print("键:" + entry.getKey());
System.out.println(" 值:" + entry.getValue().name);
}
System.out.println("--------");
}
//通过Put()方法来修改Map
public void testModify(){
Scanner console = new Scanner(System.in);
while(true){
System.out.println("请输入要修改的课程的ID:");
String crID = console.next();
Course course = courses.get(crID);
if(course == null){
System.out.println("该ID不存在,请重新输入:");
continue;
}
System.out.println("要修改的课程是:" + course.name);
System.out.println("请输入新课程名字:");
String name = console.next();
Course newCourse = new Course(crID,name);
courses.put(crID, newCourse);
System.out.println("成功修改了课程!");
break;
}
System.out.println("--------");
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testKeySet();
mt.testKeySet();
mt.TestRemove();
mt.testKeySet();
mt.testEntrySet();
mt.testModify();
mt.testEntrySet();
}
}