###集合(2)###
1.泛型
集合中的元素,可以是任何类型的对象(对象的引用)
(如果把某个对象放入集合,则会忽略他的类型,而把他当做Object处理)
泛型则是规定了某个集合只可以存放特定类型的对象
(会在编译时期进行类型检查,可以直接按制定类型获取集合元素)
例:
当添加其他类型时:编译器会报错
泛型集合中,不能添加泛型规定的类型意外的对象。
public class Course {
private String id;
private String name;
public Course(String id, String name) {
this.id = id;
this.name = name;
}
public Course() {
}
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 Course {
private String id;
private String name;
public Course(String id, String name) {
this.id = id;
this.name = name;
}
public Course() {
}
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 ChildCourse extends Course{
}
public void testChild() {
ChildCourse ccr = new ChildCourse();
ccr.setId("3");
ccr.setName("python");
courses.add(ccr);
}
public static void main(String[] args) {
TestGeneric tg = new TestGeneric();
tg.testAdd();
tg.testChild();
tg.testForEach();
}
PS:1)泛型集合中的限定类型不能使用基本数据类型。
2)可以通过使用包装类限定允许存入的基本数据类型。
我们可以看到当采用基本数据类型时会出现报错
public void testBasicType(){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
System.out.println("基本类型的包装类:"+list.get(0));
}
public static void main(String[] args) {
TestGeneric tg = new TestGeneric();
tg.testBasicType();
}
2.Set接口及实现类 ————HashSet (无序)
1)Set时元素无需并且不可重复的集合,被称为集
2)HashSet——哈希集,时Set的一个重要实现类
例:
需求: 提供备选课程,创建学生对象,并给该学生添加三门课程(添加至学生的Courses——Set类型属性中)
import java.util.HashSet;
import java.util.Set;
public class Student {
private String id;
private String name;
public Set<Course> course;
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
this.course = new HashSet<Course>();
}
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;
}
}
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class SetTest {
public List<Course> coursesToSelect;
public SetTest() {
coursesToSelect = new ArrayList<Course>();
}
public void testAdd() {
//创建一个课程对象,并通过调用add方法,添加到备选课程的List中
Course cr1 = new Course("1", "JavaSe");
coursesToSelect.add(cr1);
//对象存入集合都编程Object类型去除时需要类型转换
Course temp1 = (Course) coursesToSelect.get(0);
Course cr2 = new Course("2", "JavaEE");
coursesToSelect.add(0, cr2);
Course temp2 = (Course) coursesToSelect.get(0);
Course[] course1 = {new Course("3", "C语言"), new Course("4", "python")};
coursesToSelect.addAll(Arrays.asList(course1));
Course temp3 = (Course) coursesToSelect.get(2);
Course temp4 = (Course) coursesToSelect.get(3);
Course[] course2 = {new Course("5", "Html"), new Course("6", "Css")};
coursesToSelect.addAll(2, Arrays.asList(course2));
Course temp5 = (Course) coursesToSelect.get(2);
Course temp6 = (Course) coursesToSelect.get(3);
}
public void testForEach() {
System.out.println("------------------");
System.out.println("(ForEach)待选课程为:");
for (Object obj : coursesToSelect) {
Course cr = (Course) obj;
System.out.println("课程:" + cr.getId() + ":" + cr.getName());
}
}
public void testForEachForSet(Student student){
System.out.println("共选择了:"+student.course.size()+"门课程");
for(Course cr : student.course){
System.out.println("所选课程为:"+cr.getId()+":"+cr.getName());
}
}
public static void main(String[] args) {
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
//创建学生对象
Student student = new Student("1","小明");
System.out.println("欢迎"+student.getName()+"进入选课系统");
//接收从键盘输入的课程ID
Scanner sc = new Scanner(System.in);
for (int i = 0; i<3;i++){
System.out.println("请输入要选课程ID");
String cId = sc.next();
for(Course cr : st.coursesToSelect){
if(cr.getId().equals(cId)){
student.course.add(cr);
student.course.add(cr);
}
}
}
st.testForEachForSet(student);
}
}
ps:Set中,添加某个对象,无论添加多少次,最终只会保留一个该对象,并且保留的时第一次添加的那个。
3.Map接口:
1)Map提供了一种映射关系,其中的元素时以键值对(key - value)的形式存储,能够实现根据key快速查找value
2)Map中的键值对以Entry类型的对象实例形式存在
3)键(key值)不可重复,value值可以
4)每个键值最多只能映射一个值
5)Map接口提供了分别返回key值集合、value值集合以及Entry(键值对)集合的方法
6)Map支持反省,形式如:<K,V>
> HashMao类:
1)HashMap是Map的一个重要表现类,也是最常用的,基于哈希表实现
2)HashMap中的Entry对象是无序摆列的
3)Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射
例:
需求:通过Map<String,Student>进行学生信息管理,其中key为学生ID,value为学生对象
通过键盘录入学生信息,对集合中的学生信息进行增、删、改、查操作
增添功能:
import java.util.HashSet;
import java.util.Set;
public class Student {
private String id;
private String name;
public Set<Course> course;
public Student() {
}
public Student(String id, String name) {
this.id = id;
this.name = name;
this.course = new HashSet<Course>();
}
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;
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class MapTest {
public Map<String,Student>students;
public MapTest(){
this.students = new HashMap<String,Student>();
}
public void testKeySet(){
//通过keySet方法,返回Map中的所有“键”的Set集合
Set<String> keySet = students.keySet();
//取得students的容量
System.out.println("共有:"+students.size()+"个学生");
for (String sID:keySet){
Student st = students.get(sID);
if(st != null){
System.out.println("学生:"+st.getName());
}
}
}
public void testPut(){
Scanner sc = new Scanner(System.in);
int i = 0;
while (i<3){
System.out.println("请输入学生ID:");
String ID= sc.next();
Student st = students.get(ID);
if(st == null){
System.out.println("请输入学生姓名:");
String name = sc.next();
Student nSt = new Student(ID,name);
students.put(ID,nSt);
System.out.println("成功添加:"+students.get(ID).getName());
i++;
}else{
System.out.println("学生ID被占用");
continue;
}
}
}
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
}
删除功能与通过entrySet来遍历Map集合:
//删除测试
public void testRemove() {
System.out.println("请输入要删除的学生ID:");
while(true){
Scanner sc = new Scanner(System.in);
String ID = sc.next();
Student st = students.get(ID);
if (st == null){
System.out.println("您输入的ID不存在");
continue;
}
students.remove(ID);
System.out.println("成功删除学生"+st.getName());
break;
}
}
//通过entrySet来遍历Map
public void testEntrySet(){
Set<Map.Entry<String,Student>> entrySet = students.entrySet();
for (Map.Entry<String,Student> entry : entrySet){
System.out.println("取得键:"+entry.getKey());
System.out.println("对应的学生为:"+entry.getValue().getName());
}
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testRemove();
mt.testEntrySet();
}
修改映射方法: put
(如果此映射以前包含一个该键的映射关系,则制定值替换旧值)
//利用put方法修改Map中的已有映射
public void testModify(){
System.out.println("请输入要修改的学生ID");
Scanner sc = new Scanner(System.in);
while(true){
String stuID = sc.next();
//查找是否又相应的映射
Student student = students.get(stuID);
if(student ==null){
System.out.println("学生ID不存在,请重新输入");
continue;
}
System.out.println("该学生ID,所对应的学生为:"+student.getName());
System.out.println("请输入新的学生姓名");
String name = sc.next();
Student nStu =new Student(stuID,name);
students.put(stuID,nStu);
System.out.println("修改成功!");
break;
}
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testModify();
mt.testEntrySet();
}
####END####