Java中的集合框架
2017-10-14 本文已影响7人
撸码小狂魔
学习了解
- 集合框架的概念与作用
- 集合框架的体系结构
- 集合框架的实际应用
概念与作用
集合概念:
- 在现实生活中,很多的事物凑在一起。
- 数学中的集合:具有共同属性的事物的总体。
- Java中的集合类:是一种工具,就像是容器,存储任意数量的具有共同属性的对象。
集合的作用:
- 在类的内部,对数据进行组织;
- 简单而快速的搜索大量的条目;
- 有的集合接口,提供了一些列排列有序的元素,并且可以在序列中间快速的插入或则删除有关的元素;
- 有的集合接口,提供了映射关系,可以通过任意关键字(key)去快速查找对应的唯一对象,而这个关键字是任意类型。
集合与数组的对比——为何选择集合而不是数组?
- 数组的长度是固定的,集合的长度可变;
- 数组只能通过下标访问元素,类型固定(int型),数据量大时只能通过遍历来查找对象。而有的集合可以通过任意类型的关键字来查找所映射的具体对象;
集合框架的体系结构
集合框架由两大家族组成,分别是Collection家族和Map家族。
Collection和Map是两个接口。是Java集合框架的根接口。
Collection家族主要有三个子接口:分别是List(序列)、Queue(队列)、Set(集)三个接口。
其中List、Queue存储的元素是排列有序的,可以重复的。
Set中的元素是无序并且不能重复。
List有一个很常用很重要的实现类: ArrayList(数组序列)。
Queue有一个很重要的实现类:LinkedList(链表),这个LinkedList同时也是List接口的实现类。
Set有一个重要的实现类HashSet(哈希集)
Map家族也有众多的子接口,其中有一个很重要的实现类HashMap(哈希表)
Collenction和Map是如何存储数据的呢?
首先Collection存储的都是一个一个的独立对象,而Map的内部是以Key与Value两个对象(Key,Value)为一个映射来存储数据。这样一个映射就是一个Entry(键值对)类的示例,Entry类是Map的一个内部类,Key和Value可以是任何对象。
可以将实现Collection接口的类所存储的数据都为一个一个的光棍(就是一个一个的对象),而实现Map接口的类所存储的是数据都为一对一对的夫妇(<Key,Value>)。
集合框架的实际应用
Collection接口 & List接口简介
Collection接口、子接口以及实现类
Collection接口:
- List、Set和Queue接口的父接口
- 定义了可用于操作List、Set和Queue的方法——增删改查
List接口及其实现类——ArrayList
- List是元素有序并且可以重复的集合,被称为序列
- List可以精确的控制每个元素的插入位置,或者删除某个位置元素
- ArrayList——数组序列,是List的一个重要实现类
- ArrayList底层是由数组实现的
范例:实现功能——模拟学生选课功能
- 选择课程(往集合中添加课程)
- 删除所选的某门课程
- 查看所选课程
- 修改所选课程
1、创建课程类
/**
* 课程类
* Created by 99479 on 2017/7/10.
*/
public class Course {
public String id;
public String name;
public Course(String id, String name) {
this.id = id;
this.name = name;
}
}
2、创建学生类
import java.util.HashSet;
import java.util.Set;
/**
* 学生类
* Created by 99479 on 2017/7/10.
*/
public class Student {
public String id;
public String name;
public Set courses;
public Student(String id, String name) {
this.id = id;
this.name = name;
this.courses = new HashSet();
}
}
3、ListTest类
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* 备选课程类
* Created by 99479 on 2017/7/10.
*/
public class ListTest {
/**
* 用于存放备选课程的List
*/
public List coursesToSelect;
public ListTest(){
this.coursesToSelect = new ArrayList();
}
/**
* 用于往coursesToSelect中添加备选课程
*/
public void testAdd(){
//创建一个课程对象,并通过调用add方法,添加到备选课程List中
Course course = new Course("1","数据结构");
coursesToSelect.add(course);
Course temp = (Course) coursesToSelect.get(0);//对象存入集合中都变成Object类型,取出时需要类型转换
System.out.println("添加了课程:" + temp.id + " : "+ temp.name);
Course course1 = new Course("2","C语言");
//将对象插入指定位置
coursesToSelect.add(0,course1);
temp = (Course) coursesToSelect.get(0);
System.out.println("添加了课程:" + temp.id + " : "+ temp.name);
/**
* 如果插入的位置大于List容器的位置,将会报错(“java.lang.IndexOutOfBoundsException: Index: 4, Size: 2”)
Course course2 = new Course("3","test");
coursesToSelect.add(4,course2);
*/
Course [] courses = {new Course("3","离散数学"),new Course("4","汇编语言")};
coursesToSelect.addAll(Arrays.asList(courses));
temp = (Course) coursesToSelect.get(2);
System.out.println("添加了课程:" + temp.id + " : "+ temp.name);
temp = (Course) coursesToSelect.get(3);
System.out.println("添加了课程:" + temp.id + " : "+ temp.name);
Course [] courses1 = {new Course("5","高等数学"),new Course("6","大学英语")};
coursesToSelect.addAll(2,Arrays.asList(courses1));
temp = (Course) coursesToSelect.get(2);
System.out.println("添加了课程:" + temp.id + " : "+ temp.name);
temp = (Course) coursesToSelect.get(3);
System.out.println("添加了课程:" + temp.id + " : "+ temp.name);
}
/**
* 取得List中的元素的方法
*/
public void testGet(){
System.out.println("有如下待选课程:");
//获取集合的大小
int size = coursesToSelect.size();
for (int i = 0 ; i <size ; i++){
Course course = (Course) coursesToSelect.get(i);
System.out.println("课程:"+ course.id + " :"+course.name);
}
}
/**
* 通过迭代器来遍历list
*/
public void testIterator(){
//通过集合的Iterator遍历集合
System.out.println("有如下待选课程(使用迭代器访问):");
Iterator iterator = coursesToSelect.iterator();
while(iterator.hasNext()){
Course course = (Course) iterator.next();
System.out.println("课程:"+ course.id + " :"+course.name);
}
}
/**
*通过for-each方法访问集合元素
*/
public void testForEach(){
System.out.println("有如下待选课程(使用for-each方法访问):");
for (Object obj : coursesToSelect){
Course course = (Course) obj;
System.out.println("课程:"+ course.id + " :"+course.name);
}
}
/**
* 修改List中的元素
*/
public void testModify(){
System.out.println("---------------- 修改集合中指定位置的元素");
coursesToSelect.set(4,new Course("7","毛概"));
}
/**
* 删除List中的元素(通过传入集合中的实体对象)
*/
public void testRemovieWithObject(){
Course course = (Course) coursesToSelect.get(4);
System.out.println("我是课程:"+course.id+" : "+course.name+",我即将被删除");
coursesToSelect.remove(course);//传入的是实体对象
System.out.println("成功删除课程!");
testIterator();
}
/**
* 删除List中的元素(通过传入集合中的下标)
*/
public void testRemovieWithIndex(){
System.out.println("我在List集合中的下标为3,我即将被删除!");
coursesToSelect.remove(3);
testIterator();
}
/**
* 删除List集合中的元素(通过传入指定集合中的元素的数组)
*/
public void testRemoviewWithArray(){
System.out.println("通过传入指定集合中的元素的数组");
Course [] courses = {(Course) coursesToSelect.get(0), (Course) coursesToSelect.get(1)};
coursesToSelect.removeAll(Arrays.asList(courses));
testIterator();
}
public static void main(String[] args) {
ListTest listTest = new ListTest();
listTest.testAdd();
listTest.testGet();
listTest.testIterator();
listTest.testForEach();
listTest.testModify();
listTest.testForEach();
listTest.testRemovieWithObject();
listTest.testRemovieWithIndex();
listTest.testRemoviewWithArray();
}
}
输出
添加了课程:1 : 数据结构
添加了课程:2 : C语言
添加了课程:3 : 离散数学
添加了课程:4 : 汇编语言
添加了课程:5 : 高等数学
添加了课程:6 : 大学英语
有如下待选课程:
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:3 :离散数学
课程:4 :汇编语言
有如下待选课程(使用迭代器访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:3 :离散数学
课程:4 :汇编语言
有如下待选课程(使用for-each方法访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:3 :离散数学
课程:4 :汇编语言
---------------- 修改集合中指定位置的元素
有如下待选课程(使用for-each方法访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:7 :毛概
课程:4 :汇编语言
我是课程:7 : 毛概,我即将被删除
成功删除课程!
有如下待选课程(使用迭代器访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:4 :汇编语言
我在List集合中的下标为3,我即将被删除!
有如下待选课程(使用迭代器访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:4 :汇编语言
通过传入指定集合中的元素的数组
有如下待选课程(使用迭代器访问):
课程:5 :高等数学
课程:4 :汇编语言