java中集合框架概述
- collection集合框架存儲對象呕乎,有多個接口list荚斯,queue妖啥,set霉颠。他們對應的重要實現(xiàn)類分別是ArrayList,LinkedList迹栓,HashSet
定義類圖
public class Course {
public String id;
public String name;
public Course(String id,String name){
this.id=id;
this.name=name;
}
public Course(){
}
}
public class Student {
public String id;
public String name;
public Set<Course> courses;
public Student(String id,String name){
this.id=id;
this.name=name;
this.courses=new HashSet<Course>();
}
}
使用List接口
/*
- 備選課程類
*/
public class ListTest {
public List courseToSelect;
/*
* 用于存放備選課程的list
*/
public ListTest(){
this.courseToSelect = new ArrayList();
}
/*
* 用于往coursetoselect中添加備選課程
*/
public void testAdd(){
//創(chuàng)建一個課程對象并通過調用add方法掉分,添加到備選課程list中
Course cr1= new Course("1","數(shù)據(jù)結構");
courseToSelect.add(cr1);
Course temp= (Course) courseToSelect.get(0);
//System.out.println("添加了課程:"+temp.id+":"+temp.name);
Course cr2 = new Course("2","c語言");
courseToSelect.add(0, cr2);
Course temp2=(Course)courseToSelect.get(0);
//System.out.println("添加了課程:"+temp2.id+":"+temp2.name);
courseToSelect.add(cr1);
Course temp0= (Course) courseToSelect.get(2);
//System.out.println("添加了課程:"+temp0.id+":"+temp0.name);
//以下會拋出數(shù)組下標越界異常
//Course cr3 = new Course("3","cdsfsf");
//courseToSelect.add(4, cr3);
Course[] course={new Course("3","離散數(shù)學"),new Course("4","匯編語言")};
courseToSelect.addAll(Arrays.asList(course));
Course temp3=(Course)courseToSelect.get(3);
Course temp4=(Course)courseToSelect.get(4);
//System.out.println("添加了兩門課程:"+temp3.id+":"+
//temp3.name+";"+temp4.id+":"+temp4.name);
Course[] course2={new Course("5","高等數(shù)學"),new Course("6","大學英語")};
courseToSelect.addAll(2, Arrays.asList(course2));
Course temp5=(Course)courseToSelect.get(2);
Course temp6=(Course)courseToSelect.get(3);
//System.out.println("添加了兩門課程:"+temp5.id+":"+
//temp5.name+";"+temp6.id+":"+temp6.name);
}
/*
* 取得List中的元素的方法
*/
public void testGet(){
int size =courseToSelect.size();
System.out.println("有如下課程待選:");
for(int i=0;i<size;i++){
Course cr = (Course) courseToSelect.get(i);
System.out.println("課程:"+cr.id+cr.name);
}
}
/*
* 通過迭代器遍歷List
*/
public void testIterator(){
//通過集合的Iterator方法
Iterator it = courseToSelect.iterator();
System.out.println("有如下課程待選(通過迭代器訪問):");
while(it.hasNext()){
Course cr =(Course)it.next();
System.out.println("課程:"+cr.id+cr.name);
}
}
/*
* 通過foreach方法訪問集合元素
*/
public void testForEach(){
System.out.println("有如下課程待選(通過for each)):");
for(Object obj:courseToSelect){
//當元素被存入集合,其類型被忽略為object
Course cr =(Course)obj;
System.out.println("課程:"+cr.id+cr.name);
}
}
/*
* 修改list中的元素
*/
public void testModify(){
courseToSelect.set(4, new Course("7","毛概"));
}
/*
* 刪除list中的元素
*/
public void testRemove(){
// Course cr =(Course)courseToSelect.get(4);
// System.out.println("我是課程"+":"+cr.name+" 我即將被刪除");
//System.out.println("即將刪除4位置上的課程克伊!");
//courseToSelect.remove(4);
System.out.println("即將刪除4位置和5 位置上的課程酥郭!");
Course[] courses ={(Course) courseToSelect.get(4),(Course) courseToSelect.get(5)};
courseToSelect.removeAll(Arrays.asList(courses));
System.out.println("成功珊瑚課程!");
testForEach();
}
/*
* 往list中添加一些奇怪的東西
*
*/
// public void testType(){
// System.out.println("能否在list");
// courseToSelect.add("字符串");
// //不能愿吹,用泛型規(guī)定添加的元素類型
// }
public static void main(String[] args){
ListTest lt=new ListTest();
lt.testAdd();
lt.testForEach();
}
}
應用泛型管理課程
public class TestGeneric {
/*
* 帶有泛型---course不从,的list類型屬性
*/
public List<Course> courses;
public TestGeneric(){
this.courses=new ArrayList<Course>();
}
/*
* 測試添加
*/
public void testAdd(){
Course cr1 =new Course("1","大學語文");
courses.add(cr1);
//courses.add("能否添加一些奇怪的東西呢?犁跪?椿息?");//當然不能。編譯期間檢查坷衍,不是泛型規(guī)定的類型寝优,報錯
//泛型集合中。不能添加 泛型規(guī)定的類型及其子類型以外的對象枫耳,否則會報錯乏矾!
Course cr2 = new Course("2","java basic");
courses.add(cr2);
}
/*
* 測試循環(huán)遍歷
*/
public void testForEach(){
for(Course cr:courses){
System.out.println(cr.id+":"+cr.name);
}
}
/*
* 泛型集合可以添加泛型的子類型的對象實例
*/
public void testChild(){
ChildCourse ccr = new ChildCourse();
ccr.id="3";
ccr.name="我是子類型的課程對象實例";
courses.add(ccr);
}
/*
* 泛型不能使用基本類型
*/
public void testBasicType(){
List<Integer> list = new ArrayList<Integer>();
//注意泛型中的限定類型不能使用基本類型,可以通過使用包裝類
list.add(1);
System.out.println("基本類型必須使用包裝類作為泛型!"+list.get(0));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestGeneric tg=new TestGeneric();
tg.testAdd();
tg.testForEach();
tg.testChild();
tg.testForEach();
tg.testBasicType();
}
}
public class ChildCourse extends Course {
}
使用set集合
public class SetTest {
public List<Course> courseToSelect;
public SetTest(){
courseToSelect = new ArrayList<Course>();
}
public void testAdd(){
//創(chuàng)建一個課程對象并通過調用add方法钻心,添加到備選課程list中
Course cr1= new Course("1","數(shù)據(jù)結構");
courseToSelect.add(cr1);
Course cr2 = new Course("2","c語言");
courseToSelect.add(0, cr2);
Course[] course={new Course("3","離散數(shù)學"),new Course("4","匯編語言")};
courseToSelect.addAll(Arrays.asList(course));
Course[] course2={new Course("5","高等數(shù)學"),new Course("6","大學英語")};
courseToSelect.addAll(2, Arrays.asList(course2));
}
public void testForEach(){
System.out.println("有如下課程待選(通過for each)):");
for(Object obj:courseToSelect){//當元素被存入集合凄硼,其類型被忽略為object
Course cr =(Course)obj;
System.out.println("課程:"+cr.id+cr.name);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SetTest st = new SetTest();
st.testAdd();
st.testForEach();
Student student = new Student("1","Ming");
System.out.println("歡迎學生: "+student.name+" 選課");
//創(chuàng)建一個scanner對象接受從鍵盤輸入的課程ID
Scanner console = new Scanner(System.in);
for(int i=0;i<3;i++){
System.out.println("請輸入課程ID");
String courseId = console.next();
for(Course cr :st.courseToSelect){
if(cr.id.equals(courseId)){
student.courses.add(cr);
/*
* set中,添加某個對象捷沸,無論添加多少次
* 最終只保留一個該對象(的引用)
* 并且摊沉,保留的是第一次添加的那一個
*/
//student.courses.add(null);//可以添加空對象,但是沒什么意義
}
}
}
st.testForEachforSet(student);
}
public void testForEachforSet(Student student){
//打印輸出痒给,學生所選的課程说墨!
System.out.println("共選擇了:"+student.courses.size()+"門課程");
for(Course cr:student.courses){
System.out.println("選擇了課程:"+cr.id+cr.name);
}
}
}
使用map接口
-
map提供映射關系,以鍵值對存儲侈玄。
代碼示例
public class MapTest {
/*
* 用來承裝學生類型對象
*/
public Map<String,Student>students;
/*
* 在構造器中初始化student屬性
*/
public MapTest(){
this.students = new HashMap<String,Student>();
}
/*
* 測試添加:輸入學生id婉刀,判斷是否被占用
* 若未被占用吟温。則輸入學生姓名序仙,創(chuàng)建新的學生對象,并且添加到students中
*/
public void testPut(){
//創(chuàng)建一個scanner對象鲁豪,用來獲取輸入的學生ID和姓名
Scanner console = new Scanner(System.in);
int i = 0;
while(i<3){
System.out.println("請輸入學生ID");
String ID =console.next();
//判斷該ID是否被占用
Student st =students.get(ID);
if(st==null){
//提示輸入學生姓名
System.out.println("請輸入學生姓名");
String name = console.next();
//創(chuàng)建一個新的學生對象
Student newStudent = new Student(ID,name);
//通過調用studnets的put方法潘悼,添加ID-學生映射
students.put(ID, newStudent);
System.out.println("成功添加學生:"+students.get(ID).name);
i++;
}else{
System.out.println("該學生ID已被占用");
continue;
}
}
}
/*
* 測試map的keySet方法
*/
public void testKeySet(){
//通過keyset方法。返回map中的所有“鍵”的set集合
Set<String> keySet = students.keySet();
//取得stuents的容量
System.out.println("總共有:"+students.size()+"個學生");
//遍歷keyset爬橡,取得每一個鍵治唤,在調用get方法取得每個鍵對應的value
for(String stuId:keySet){
Student st =students.get(stuId);
if(st!=null){
System.out.println("學生:"+st.name);
}
}
}
/*
* 測試刪除map中的映射
*/
public void testRemove(){
//獲取從鍵盤輸入的待刪除學生ID字符串
Scanner console = new Scanner(System.in);
while(true){
//提示輸入待刪除的學生的ID
System.out.println("請輸入要刪除的學生ID!");
String ID =console.next();
//判斷該ID是都有對應的學生對象
Student st =students.get(ID);
if(st==null){
//提示輸入的ID并不存在
System.out.println("該ID不存在");
continue;
}
students.remove(ID);
System.out.println("成功刪除學生:"+st.name);
break;
}
}
/*
* 通過entrySet方法來遍歷Map
*/
public void testEntrySet(){
//通過entrySet該方法糙申,返回map中所有鍵值對
Set<Entry<String,Student>> entrySet= students.entrySet();
for(Entry<String,Student> entry:entrySet){
System.out.println("取得鍵:"+entry.getKey());
System.out.println("對應的值為"+entry.getValue().name);
}
}
/*
* 利用put方法修改map中的已有映射
*/
public void testModify(){
//提示輸入要修改的學生ID
System.out.println("請輸入要修改的學生ID:");
//創(chuàng)建scanner對象宾添,獲取從鍵盤上輸入的學生ID字符串
Scanner console = new Scanner(System.in);
while(true){
String stuID= console.next();
//從tsudnets中差好啊該學生ID對應的學生對象
Student student= students.get(stuID);
if(student ==null){
System.out.println("該ID不存在!請重新輸入柜裸!");
continue;
}
//提示當前對應的學生對象的姓名
System.out.println("當前該學生的ID:所對應的學生為"+student.name);
//體術輸入新的學生姓名缕陕,來修改已有的映射
System.out.println("請輸入新的學生姓名:");
String name= console.next();
Student newStudent = new Student(stuID,name);
students.put(stuID, newStudent);
System.out.println("修改成功!");
break;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testRemove();
mt.testEntrySet();
mt.testModify();
mt.testEntrySet();
}
}
判斷是否包含某元素
利用contains方法
- 該方法從collection繼承來
- 下面測試list和set的contains方法
測試set的contains方法
public void testListContains(){
//取得備選課程序列的第0個元素
Course course = courseToSelect.get(0);
//打印輸出courseToSelect是否包含course對象
System.out.println("取得課程:"+course.name);
System.out.println("備選課程中是否包含課程:"+course.name+","+courseToSelect.contains(course));
//包含返回true疙挺,不包含返回false
//創(chuàng)建一個新的課程對象扛邑,ID和名稱,與course對象完全一樣
Course course2 = new Course(course.id,course.name);
System.out.println("新創(chuàng)建課程:"+course2.name);
System.out.println("備選課程中是否包含課程"+course2.name+","+courseToSelect.contains(course2));//**這里是false**
}
- 所有類都繼承自object 有一個equals(Object obj)方法
- contains(obj)方法實際是遍歷其中每一個元素铐然,調用每個元素的equals方法與參數(shù)obj比較蔬崩,所有都不相同,才返回false
- 通過重寫equals方法可以實現(xiàn)通過contains是否包含名稱為某個值的課程元素
在Course類中重寫equals方法
//Override
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(obj==null)
return false;
if(!(obj instanceof Course))
return false;
Course course =(Course)obj;
if(this.name==null){
if(course.name==null)
return true;
else
return false;
}else{
if(this.name.equals(course.name))
return true;
else
return false;
}
}
注:該equlas重寫方法可以作為一個模板使用
這之后運行setTest
其中System.out.println("備選課程中是否包含課程"+course2.name+","+courseToSelect.contains(course2));//
得到的這里是true搀暑,說明equals方法重載成功沥阳。
object中還有一個方法:hashCode()返回該對象的哈希碼的值
-
當調用contains(obj)的時候,先調用每一個元素的hashcode()自点,相等再調用equals()桐罕。只有認為這兩個方法返回的值都相等的時候,才認定hashset包含這個元素
@Override
public int hashCode() {final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result;
}
@Override
public boolean equals(Object obj) {if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Course)) return false; Course other = (Course) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true;
}
Ecilpse可以自動生成hashcode和equals方法。
判斷元素的索引位置
//通過indexof方法來獲取某元素的索引位置
if(courseToSelect.contains(course2))
System.out.println("課程:"+course2.name+"的索引位置為"+courseToSelect.indexOf(course2));
- indexof(java)從0開始遍歷冈绊,逐個進行equals(java)比較侠鳄,若返回true,得到元素的索引位置死宣。如果有多個重復元素伟恶,返回第一個元素的索引位置
- lastIndexOf(java)方法與indexof相反,從最后開始遍歷
- 若沒有找到該元素毅该,這兩個方法都返回-1
判斷map中是否包含指定的key和value值
/*
* 測試map中博秫,是否包含某個key值或者某個value值
*/
public void testContainsKeyOrValue(){
System.out.println("請輸入要查詢的學生ID");
Scanner console = new Scanner(System.in);
String id = console.next();
//在map中,用containsKey()方法眶掌,來判斷是否包含某個Key值
System.out.println("您輸入的學生ID為"+id+"挡育,在學生映射表中是否存在:"+students.containsKey(id));
if(students.containsKey(id))
System.out.println("對應的學生為:"+students.get(id).name);
System.out.println("請輸入要查詢的學生姓名:");
String name = console.next();
//用containsValue()方法,來判斷是否包含某個Value值
if(students.containsValue(new Student(null,name)))
System.out.println("在學生映射表中朴爬,確實包含學生:"+name);
else{
System.out.println("在學生映射表中不存在該學生");
}
}
【注】這里的查詢是否包含學生姓名的時候contain方法仍然調用了hashcode和equals方法即寒,所以要在student類中重載兩個方法
應用collection.sort()實現(xiàn)list排序
- java.util.collections工具類,提供了許多靜態(tài)方法召噩,用來操作集合
- 用collection.sort()實現(xiàn)list排序
/*
- 將要完成:
- 1.通過Collections.sort()方法母赵,對Integer泛型的list進行排序
- 2.對String泛型的List進行排序
- 3.對其他類型泛型的list進行排序,以student為例
*/
public class CollectionsTest {
/*
* 1.通過Collections.sort()方法具滴,對Integer泛型的list進行排序
* 創(chuàng)建一個Integer泛型的list凹嘲,插入是個100以內不重復的隨機數(shù)
* 調用Collections.sort()方法排序
*/
public void testSort1(){
List<Integer> integerList = new ArrayList<Integer>();
//插入是個100以內不重復的隨機數(shù)
Random random = new Random();
Integer k = null;
for(int i=0;i<10;i++){
do{
k = random.nextInt(100);
}while(integerList.contains(k));
integerList.add(k);
System.out.println("成功添加整數(shù):"+k);
}
System.out.println("--------排序前-----------");
for (Integer integer : integerList) {
System.out.println("元素:"+integer);
}
Collections.sort(integerList);
System.out.println("--------排序后-----------");
for (Integer integer : integerList) {
System.out.println("元素:"+integer);
}
}
/*
* 2.對String泛型的List進行排序
* 創(chuàng)建String泛型的list,添加三個亂序的String
* 調用sort方法构韵,再次輸出排序后的順序
*/
public void testSort2(){
List<String> stringList = new ArrayList<String>();
stringList.add("microsoft");
stringList.add("google");
stringList.add("eldasdaf");
System.out.println("--------排序前-----------");
for (String string : stringList) {
System.out.println("元素:"+string);
}
Collections.sort(stringList);
System.out.println("--------排序后-----------");
for (String string : stringList) {
System.out.println("元素:"+string);
}
}
/*
* 3.對其他類型泛型的list進行排序周蹭,以student為例
*/
public void testSort3(){
//....
}
}
comparable與comparator接口
- comparable默認比較規(guī)則,可比較的疲恢,實現(xiàn)改接口表示:這個類的示例可以bijou大小凶朗。可以進行自然排序冈闭。
public class Student implements Comparable<Student>{
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return this.id.compareTo(o.id);
}
public void testSort3(){
List<Student> studentList = new ArrayList<Student>();
Random random = new Random();
studentList.add(new Student(random.nextInt(1000)+"","mike"));
studentList.add(new Student(random.nextInt(1000)+"","xixo"));
studentList.add(new Student(random.nextInt(1000)+"","Lan"));
System.out.println("--------排序前-----------");
for (Student student : studentList) {
System.out.println("學生:"+student.id+":"+student.name);
}
Collections.sort(studentList);
System.out.println("--------排序后-----------");
for (Student student : studentList) {
System.out.println("學生:"+student.id+":"+student.name);
}
}
- comparator 定義臨時比較規(guī)則
public class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o1.name.compareTo(o2.name);
}
}
public void testSort3(){
List<Student> studentList = new ArrayList<Student>();
Random random = new Random();
studentList.add(new Student(random.nextInt(1000)+"","mike"));
studentList.add(new Student(random.nextInt(1000)+"","xixo"));
studentList.add(new Student(random.nextInt(1000)+"","Lan"));
studentList.add(new Student(10000+"","beyonce"));
//這里按照姓名排序
Collections.sort(studentList,new StudentComparator());
System.out.println("---------按照姓名排序后---------");
for (Student student : studentList) {
System.out.println("學生:"+student.id+":"+student.name);
}
}
總結
所有類圖
github地址:Elylicery
https://github.com/Elylicery/Code-Exercise/tree/master/imooc-collection-demo