集合框架
有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速地插入或者删除有关元素。还有一些集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型。
Collection接口
定义了一系列方法——赠删改查
List 接口与 ArrayList 类与inkedList类
List 是一个接口,不能实例化,需要一个具体类来实现实例化。List 集合中的对象按照一定的顺序排放,里面的内容可以重复。 List 接口实现的类有:ArrayList(实现动态数组),Vector(实现动态数组),LinkedList(实现链表),Stack(实现堆栈)。
以ArrayList为例
ArrayList 类实现一个可增长的动态数组,它可以存储不同类型的对象,而数组则只能存放特定数据类型的值。
其他ArrayList和Array(数组)的区别见下链接
http://blog.csdn.net/chuntiandejiaobu10/article/details/52381664
简易的学生管理系统:
/**
* 简易的学生管理系统(arraylist事例)
* */
import java.util.*;
//学生类
class Student {
private String id; //学号
private String name;//姓名
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Collection {
ArrayList<Student> students = new ArrayList<>(); //需要泛型 避免类型不安全
public Collection() {
};
//添加学生
public void addStudent() {
Student st1 = new Student("01", "张三");
students.add(st1);
Student temp = students.get(0); // 取得List里面的元素
System.out.println("已经加入一个学生:id:" + temp.getId() + " 姓名:" + temp.getName());
Student[] stu2 = { new Student("01", "张三"), new Student("03", "王二麻") }; // list可以重复对应于set不可以重复
students.addAll(Arrays.asList(stu2)); // 通过数组方式添加元素 aslist()将数组转化为列表
Student temp2 = students.get(1);
System.out.println("已经加入一个学生:id:" + temp2.getId() + " 姓名:" + temp2.getName());
Student temp3 = students.get(2);
System.out.println("已经加入一个学生:id:" + temp3.getId() + " 姓名:" + temp3.getName());
System.out.println();
}
// 通过迭代器来遍历
public void inteatorStudent() {
Iterator<Student> it = students.iterator();
while (it.hasNext()) {
Student st = it.next();
System.out.println("id:" + st.getId() + " name:" + st.getName());
}
System.out.println();
}
// 通过foreach来遍历
public void foreachStudent() {
// for (Object s : students) {
// System.out.println("id:" + s.getId() + " name:" + s.getName());//错误 要将s转换为Student类型
// }
for (Student s : students) {
System.out.println("id:" + s.getId() + " name:" + s.getName());
}
System.out.println();
}
//删除学生
public void deleteStudent(){
Student st = students.get(1);
System.out.println("id:" + st.getId() + " name:" + st.getName()+"即将被删除");
students.remove(st); //通过目标对象来删除
//students.remove(1); 通过索引来删除
System.out.println("已经删除");
System.out.println();
}
public static void main(String[] args) {
Collection o = new Collection();
o.addStudent();
o.inteatorStudent();
o.foreachStudent();
o.deleteStudent();
o.foreachStudent();
}
}
在上面的代码中,用到了 Arrays 类, Arrays 包含用来操作数组(比如排序和搜索)的各种方法,asList() 方法用来返回一个受指定数组支持的固定大小的列表。
List 有两种基本的类型,除了 ArrayList 外,还有 LinkedList,LinkedList 类用于创建链表数据结构,两者的对比如下:
ArrayList:它擅长于随机访问元素(get 和set),但是插入和移除元素时较慢(需要移动数据)。原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。在数组的中间的位置插入一个元素也是如此
LinkedList:它通过代价较低的在 List 中进行插入和删除操作,提供了优化的顺序访问,它在随机访问方面相对较慢(因为要移动指针),但是它的特性集较 ArrayList 更大。
删除一个之后:
Set接口与HashSet类
Set接口也是 Collection 接口的子接口,它有一个很重要也是很常用的实现类——HashSet,Set 是元素无序并且不包含重复元素的 collection(List 可以重复),被称为集。
HashSet 由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。这个类允许空元素
/**
* 简易的学生管理系统(hashset事例 以组长从班级中选组员为例)
* 首先向list中添加学生 然后讲需要选的人保存在set中
* */
import java.util.*;
import javax.swing.text.AbstractDocument.LeafElement;
//学生类
class Student {
private String id;
private String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 队长类
class Leader {
private String id;
private String name;
public Leader(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Collection {
ArrayList<Student> students = new ArrayList<Student>();
HashSet<Student> members = new HashSet<Student>();
Leader leader = new Leader("00", "赵八");
// 添加学生
public void addStudent() {
Student st1 = new Student("01", "张三");
students.add(st1);
Student[] stu2 = { new Student("02", "李四"), new Student("03", "王二麻") };
students.addAll(Arrays.asList(stu2));
System.out.println();
}
// 队长选择学生
public void selectStudent() {
System.out.println("请" + leader.getName() + "选择自己的组员");
Scanner in = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入学生id:");
String studentId = in.next();
for (Student x : students) { // foreach遍历
if (x.getId().equals(studentId)) {
members.add(x);
}
}
}
in.close();
}
// 展示组员信息
public void displayGroup() {
for (Student s : members) {
System.out.println("他选择了id:" + s.getId() + " name:" + s.getName());
}
}
public static void main(String[] args) {
Collection o = new Collection();
o.addStudent();
o.selectStudent();
o.displayGroup();
}
}
Map接口
Map 中的元素都是成对出现的,键值对就像数组的索引与数组的内容的关系一样,将一个键映射到一个值的对象。
一个键只能有一个值,一个值可以有很多个键
HashMap类
HashMap 是基于哈希表的 Map 接口的一个重要实现类。HashMap 中的 Entry 对象是无序排列的,Key 值和 value 值都可以为 null,但是一个 HashMap 只能有一个 key 值为 null 的映射(key 值不可重复)
/**
* 简易的课程系统(hashMap事例)
* 通过键盘输入课程的id 和name,保存在hashmap中 ,然后全部遍历输出
* */
import java.util.*;
import java.util.Map.Entry;
class Course{
private String id;
private String name;
public Course(String id, String name){
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Collection{
Map <String,Course> courses = new HashMap<>();
//添加课程
public void addCourse(){
Scanner in = new Scanner(System.in);
for(int i=0; i<3; i++){
System.out.println("请输入课程号: ");
String id = in.next();
Course v = courses.get(id);
if(v==null){
System.out.println("请输入课程名:");
String courseName = in.next();
Course newCourse = new Course(id, courseName);
courses.put(id, newCourse);
}
else
{
System.out.println("该id已经存在 ");
continue;
}
}
//in.close(); 只需要调用一次关闭就可以了
}
//利用keyset进行遍历
public void textkeySet(){
Set<String> keyset = courses.keySet();
for(String x :keyset){
Course course = courses.get(x);
System.out.println("课程号:"+course.getId()+" 课程名字:"+course.getName());
}
}
//删除课程
public void deleteCourse(){
Scanner in = new Scanner(System.in);
System.out.println("请输入需要删除的课程号: ");
String id = in.next();
if(courses.containsKey(id)){
courses.remove(id);
System.out.println("成功删除");
}
else{
System.out.println("没有对应课程号 请重新输入");
}
textkeySet();
in.close();
}
//依据entrySet进行遍历
public void textEntrySet(){
Set<Entry<String,Course>> entrySet = courses.entrySet();
for(Entry<String,Course> entry : entrySet){
System.out.println("课程号是:"+entry.getKey());
System.out.println("课程名字是:"+entry.getValue().getName());
}
}
public static void main(String[] args) {
Collection o = new Collection();
o.addCourse();
o.textkeySet();
o.deleteCourse();
o.textEntrySet();
}
}
补充: Map的遍历方法
//最常规的一种遍历方法,最常规就是最常用的,虽然不复杂,但很重要,这是我们最熟悉的,就不多说了!!
public static void work(Map<String, Student> map) {
Collection<Student> c = map.values();
Iterator it = c.iterator();
for (; it.hasNext();) {
System.out.println(it.next());
}
}
//利用keyset进行遍历,它的优点在于可以根据你所想要的key值得到你想要的 values,更具灵活性!!
public static void workByKeySet(Map<String, Student> map) {
Set<String> key = map.keySet();
for (Iterator it = key.iterator(); it.hasNext();) {
String s = (String) it.next();
System.out.println(map.get(s));
}
}
然后,这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。
幸运的是,这里有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:
Set entries = map.entrySet( );
if(entries!=null){
Iterator iterator = entries.iterator( );
while(iterator.hasNext( )) {
Map.Entry entry =iterator.next( );
Object key = entry.getKey( );
Object value = entry.getValue();;....}
}
尽管增加了一行代码,我们却省略了许多对Map不必要的“get”调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。