JAVA集合框架之List和Set泛型

Posted 承丶山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA集合框架之List和Set泛型相关的知识,希望对你有一定的参考价值。

一  List是有序可重复的集合


可以进行增删改查,直接看代码

技术图片
  1 package com.collection;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.Iterator;
  6 import java.util.List;
  7 
  8 public class ListTest {
  9 
 10     public List courseToList;
 11 
 12     public ListTest(){
 13         this.courseToList = new ArrayList();
 14     }
 15     public void addCourse(){
 16         //add方法
 17         Course c1 = new Course(1,"语文");
 18         courseToList.add(c1);
 19         Course temp1 = (Course) courseToList.get(0);
 20         System.out.println("添加了课程:"+temp1.id+"-"+temp1.name);
 21 
 22         Course c2 = new Course(2,"数学");
 23         courseToList.add(c2);
 24         Course temp3 = (Course) courseToList.get(1);
 25         System.out.println("添加了课程:"+temp3.id+"-"+temp3.name);
 26 
 27         Course c3 = new Course(3,"英语");
 28         courseToList.add(0,c3);
 29         Course temp4 = (Course) courseToList.get(0);
 30         System.out.println("添加了课程:"+temp4.id+"-"+temp4.name);
 31 
 32         /*System.out.println(courseToList.size());
 33         Course c4 = new Course(4,"物理");
 34         //插入时,如果Index值小于0,或大于当前List长度,会报下标越界错误
 35         courseToList.add(4,c4);
 36         //等于List长度,不会报错
 37         courseToList.add(3,c4);*/
 38 
 39         courseToList.add(3,new Course(4,"理综"));
 40 
 41         //addAll方法
 42         Course[] c5 = {new Course(5,"化学"),new Course(6,"生物")};
 43         courseToList.addAll(Arrays.asList(c5));
 44         Course temp5 = (Course) courseToList.get(4);
 45         Course temp6 = (Course) courseToList.get(5);
 46         System.out.println("添加了两门课程:"+temp5.id+"-"+temp5.name+";"+temp6.id+"-"+temp6.name);
 47 
 48         Course[] c6 = {new Course(7,"地理"),new Course(8,"历史") };
 49         courseToList.addAll(4,Arrays.asList(c6));
 50         Course temp7 = (Course) courseToList.get(4);
 51         Course temp8 = (Course) courseToList.get(5);
 52         System.out.println("添加了两门课程:"+temp7.id+"-"+temp7.name+";"+temp8.id+"-"+temp8.name);
 53     }
 54 
 55     /*
 56     * for循环出List中所有元素
 57     * */
 58     public void testFor(){
 59         System.out.println("");
 60         System.out.println("for循环课程列表如下:");
 61         for(int i = 0;i<courseToList.size();i++){
 62             Course c = (Course) courseToList.get(i);
 63             System.out.println("课程:"+c.id+"-"+c.name);
 64         }
 65     }
 66 
 67     /*
 68     * List迭代器循环出List中所有元素
 69     * */
 70     public void testIt(){
 71         System.out.println("");
 72         System.out.println("迭代器循环课程列表如下:");
 73         Iterator it = (Iterator) courseToList.iterator();
 74         while(it.hasNext()){
 75             Course c = (Course) it.next();
 76             System.out.println("课程:"+c.id+"-"+c.name);
 77         }
 78     }
 79 
 80     /*
 81     * for each循环出List中所有元素
 82     * */
 83     public void testForEach(){
 84         System.out.println("");
 85         System.out.println("forEach循环课程列表如下:");
 86         for(Object obj:courseToList){
 87             Course c = (Course) obj;
 88             System.out.println("课程:"+c.id+"-"+c.name);
 89         }
 90     }
 91 
 92     /*
 93     * List修改功能
 94     * */
 95     public void testModify(){
 96         System.out.println("");
 97         System.out.println("即将修改第4门课");
 98         courseToList.set(3,new Course(4,"物理"));
 99         System.out.println("第4门课修改完成");
100     }
101 
102     /*
103     * List删除功能
104     * */
105     public void testDelete(){
106         System.out.println("");
107         //根据键值删除
108         Course c1 = (Course) courseToList.get(3);
109         courseToList.remove(c1);
110         System.out.println("删除课程:"+c1.id+"-"+c1.name);
111         testForEach();
112 
113         //根据索引下标删除
114         courseToList.remove(3);
115         System.out.println("");
116         System.out.println("删除第4门课程:");
117         testForEach();
118 
119         //根据键值批量删除
120         Course[] cs1 = {(Course) courseToList.get(3),(Course) courseToList.get(4)};
121         System.out.println("");
122         System.out.println("删除两门课程:");
123         courseToList.removeAll(Arrays.asList(cs1));
124         testForEach();
125     }
126 
127     /*
128     * 泛型List添加泛型子类型
129     * */
130     public void addChildrenTest(){
131         System.out.println("");
132         ChildrenCourse cc1 = new ChildrenCourse();
133         courseToList.add(cc1);
134         cc1.id = 10;
135         cc1.name = "我是子类型的课程";
136         System.out.println("添加了一门泛型子类型的课程:");
137         testForEach();
138     }
139     /*
140     * 泛型不能使用基本类型,但是能使用基本类型的包装类
141     * 基本类型如:int long boolean
142     * 基本类型的包装类如:Integer Long Boolean
143     * */
144     public void addBasicType(){
145         System.out.println("");
146         //下面这句会报错
147         //ArrayList<int> basicTest = new ArrayList<int>();
148         ArrayList<Integer> basicTest = new ArrayList<Integer>();
149         basicTest.add(3);
150         System.out.println("整形的泛型List第一个元素为:"+basicTest.get(0));
151     }
152 
153     public static void main(String[] args){
154         ListTest lt = new ListTest();
155         lt.addCourse();
156         lt.testFor();
157         lt.testIt();
158         lt.testModify();
159         lt.testForEach();
160         lt.testDelete();
161         lt.addChildrenTest();
162         lt.addBasicType();
163     }
164 }
View Code

其中Course类如下:

技术图片
 1 package com.collection;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 public class Course {
 7     public int id;
 8     public String name;
 9     public Set Course;
10 
11     public Course(int id,String name){
12         this.id = id;
13         this.name = name;
14         this.Course = new HashSet();
15     }
16     public Course(){
17 
18     }
19 }
View Code

 

运行结果:

技术图片
添加了课程:1-语文
添加了课程:2-数学
添加了课程:3-英语
添加了两门课程:5-化学;6-生物
添加了两门课程:7-地理;8-历史

for循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:4-理综
课程:7-地理
课程:8-历史
课程:5-化学
课程:6-生物

迭代器循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:4-理综
课程:7-地理
课程:8-历史
课程:5-化学
课程:6-生物

即将修改第4门课
第4门课修改完成

forEach循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:4-物理
课程:7-地理
课程:8-历史
课程:5-化学
课程:6-生物

删除课程:4-物理

forEach循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:7-地理
课程:8-历史
课程:5-化学
课程:6-生物

删除第4门课程:

forEach循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:8-历史
课程:5-化学
课程:6-生物

删除两门课程:

forEach循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:6-生物

添加了一门泛型子类型的课程:

forEach循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:6-生物
课程:10-我是子类型的课程

整形的泛型List第一个元素为:3
View Code

 

二  泛型

泛型List中无法添加出泛型类型及其子类型以外的类型
示例:
技术图片
 1 package com.collection;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Arrays;
 6 
 7 public class ListTestPro {
 8 
 9     public List<Course> courseToList;
10 
11     public ListTestPro(){
12         this.courseToList = new ArrayList<Course>();
13     }
14 
15     public void addTest(){
16         Course c1 = new Course(1,"高等数学");
17         courseToList.add(c1);
18         //泛型List中无法添加出泛型类型及其子类型以外的类型
19         //courseToList.add("尝试下添加字串类型到List中");
20         Course[] cs1 = {new Course(2,"高等化学"),new Course(3,"大学英语")};
21         courseToList.addAll(Arrays.asList(cs1));
22         for(Course c:courseToList){
23             System.out.println("当前课程:"+c.name);
24         }
25 
26     }
27 
28     public static void main(String[] args){
29         ListTestPro ltp = new ListTestPro();
30         ltp.addTest();
31 
32     }
33 
34 }
View Code

运行结果:

当前课程:高等数学
当前课程:高等化学
当前课程:大学英语

 

泛型添加子类型

技术图片
/*
    * 泛型List添加泛型子类型
    * */
    public void addChildrenTest(){
        System.out.println("");
        ChildrenCourse cc1 = new ChildrenCourse();
        courseToList.add(cc1);
        cc1.id = 10;
        cc1.name = "我是子类型的课程";
        System.out.println("添加了一门泛型子类型的课程:");
        testForEach();
    }
   
View Code

其中ChildrenCourse类如下:

技术图片
1 package com.collection;
2 
3 public class ChildrenCourse extends Course {
4 }
View Code

 

运行结果:

添加了一门泛型子类型的课程:

forEach循环课程列表如下:
课程:3-英语
课程:1-语文
课程:2-数学
课程:6-生物
课程:10-我是子类型的课程

 

基本类型的泛型

技术图片
    /*
    * 泛型不能使用基本类型,但是能使用基本类型的包装类
    * 基本类型如:int long boolean等
    * 基本类型的包装类如:Integer Long Boolean等
    * */
    public void addBasicType(){
        System.out.println("");
        //下面这句会报错
        //ArrayList<int> basicTest = new ArrayList<int>();
        ArrayList<Integer> basicTest = new ArrayList<Integer>();
        basicTest.add(3);
        System.out.println("整形的泛型List第一个元素为:"+basicTest.get(0));
    }
View Code

运行结果:

整形的泛型List第一个元素为:3

 

三  Set是无序的不可重复集合

set中添加某个对象无论添加多少次,
最终只会保留一个该对象(的引用),
并且,保留的是第一次添加的那个

show me the code :
Student类
技术图片
 1 package com.collection;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 public class Student {
 7     public int id;
 8     public String name;
 9 
10     //set中添加某个对象无论添加多少次,最终只会保留一个该对象(的引用),并且,保留的是第一次添加的那个
11 
12     public Set<Course> course = new HashSet<Course>();
13 
14     public Student(int id, String name){
15         this.id = id;
16         this.name = name;
17     }
18 
19 }
View Code

 运行类

技术图片
 1 package com.collection;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Arrays;
 6 import java.util.Scanner;
 7 import java.lang.String;
 8 
 9 public class SetTest {
10 
11     public List<Course> courseToList = new ArrayList<Course>();
12 
13     public void addCourse(){
14         //add方法
15         Course c1 = new Course(1,"语文");
16         courseToList.add(c1);
17         Course temp1 = (Course) courseToList.get(0);
18         System.out.println("添加了课程:"+temp1.id+"-"+temp1.name);
19 
20         Course c2 = new Course(2,"数学");
21         courseToList.add(c2);
22         Course temp3 = (Course) courseToList.get(1);
23         System.out.println("添加了课程:"+temp3.id+"-"+temp3.name);
24 
25         Course c3 = new Course(3,"英语");
26         courseToList.add(0,c3);
27         Course temp4 = (Course) courseToList.get(0);
28         System.out.println("添加了课程:"+temp4.id+"-"+temp4.name);
29 
30 
31         courseToList.add(3,new Course(4,"物理"));
32 
33         //addAll方法
34         Course[] c5 = {new Course(5,"化学"),new Course(6,"生物")};
35         courseToList.addAll(Arrays.asList(c5));
36         Course temp5 = (Course) courseToList.get(4);
37         Course temp6 = (Course) courseToList.get(5);
38         System.out.println("添加了两门课程:"+temp5.id+"-"+temp5.name+";"+temp6.id+"-"+temp6.name);
39 
40         Course[] c6 = {new Course(7,"地理"),new Course(8,"历史") };
41         courseToList.addAll(4,Arrays.asList(c6));
42         Course temp7 = (Course) courseToList.get(4);
43         Course temp8 = (Course) courseToList.get(5);
44         System.out.println("添加了两门课程:"+temp7.id+"-"+temp7.name+";"+temp8.id+"-"+temp8.name);
45     }
46     public void courseForEach(){
47         System.out.println("");
48         System.out.println("目前共有课程如下:");
49         for(Course c : courseToList){
50             System.out.println("当前课程为:"+c.id+"-"+c.name);
51         }
52     }
53 
54     /*
55     * 让同学张三输入课程ID选课程,能选三门
56     * */
57     public void studentSelectCourse(){
58         System.out.println("");
59         Student s_zhang = new Student(1,"张三");
60         System.out.println("学生"+s_zhang.name+"开始选课:");
61 
62         Scanner console = new Scanner(System.in);
63         for(int i = 0;i < 3 ; i++){
64             String id =  console.next();
65             for(Course c : courseToList){
66                 if(id.equals( String.valueOf(c.id))){
67                     s_zhang.course.add(c);
68                     /*
69                     * set中添加某个对象无论添加多少次,
70                     * 最终只会保留一个该对象(的引用),
71                     * 并且,保留的是第一次添加的那个
72                     * */
73                     s_zhang.course.add(c);//set类型无法添加重复的数据
74                     System.out.println("选课程"+c.name+"成功");
75                 }
76             }
77         }
78 
79         System.out.println("学生"+s_zhang.name+"共选了"+s_zhang.course.size()+"门课程,如下:");
80         for(Course c1:s_zhang.course){
81             System.out.println(c1.id+"-"+c1.name);
82         }
83     }
84 
85 
86     public static void main(String[] args){
87         SetTest st = new SetTest();
88         st.addCourse();
89         st.courseForEach();
90         st.studentSelectCourse();
91 
92     }
93 }
View Code

运行结果:

技术图片
添加了课程:1-语文
添加了课程:2-数学
添加了课程:3-英语
添加了两门课程:5-化学;6-生物
添加了两门课程:7-地理;8-历史

目前共有课程如下:
当前课程为:3-英语
当前课程为:1-语文
当前课程为:2-数学
当前课程为:4-物理
当前课程为:7-地理
当前课程为:8-历史
当前课程为:5-化学
当前课程为:6-生物

学生张三开始选课:
4
选课程物理成功
7
选课程地理成功
8
选课程历史成功
学生张三共选了3门课程,如下:
8-历史
7-地理
4-物理
View Code

 

以上是关于JAVA集合框架之List和Set泛型的主要内容,如果未能解决你的问题,请参考以下文章

java集合框架和泛型

07.集合和泛型

2020/7/14 Java之增强for循环泛型List接口Set接口

Java基础知识之什么是集合框架

Java入门系列-19-泛型集合

java集合框架和泛型