淺入深出之Java集合架構(上),java集合架構

來源:互聯網
上載者:User

淺入深出之Java集合架構(上),java集合架構
Java中的集合架構(上)

由於Java中的集合架構的內容比較多,在這裡分為三個部分介紹Java的集合架構,內容是從淺到深,如果已經有java基礎的小夥伴可以直接跳到<淺入深出之Java集合架構(下)>。

目錄:

淺入深出之Java集合架構(上)

淺入深出之Java集合架構(中)   努力趕製中。。關注後更新會提醒哦!

淺入深出之Java集合架構(下) 努力趕製中。。關注後更新會提醒哦!

一、集合概述1)集合的概念

現實生活中的集合:很多事物湊在一起。

數學中的集合:具有共同屬性的事物的總體。

Java中的集合類:是一種工具類,就像是容器,儲存任意數量的具有共同屬性的對象。

2)集合的作用

如果一個類的內部有多相同類型的屬性,並且它們的作用和意義是一樣的。比如說,一個學生可以選多個課程,對於一個學生類來說,XX課程就是他的一個屬性,而xx課程通常不只有一個。對於像這種情況,如果把每一個課程都定一個屬性就太繁瑣了,這裡我們就要用到集合的概念。

    

綜上所述,集合的作用有以下幾點:

3)集合和數組的對比

可以看出集合和數組的功能類似,都是把一系列的資料放入到一個容器中,但是在類的內部我們為什麼要用集合而不是數組呢?

二、Java集合架構體繫結構

我們來簡單看一下java集合架構:(還有很多介面和類沒有列出,這裡只列出常用的介面和類)

,JAVA集合架構體繫結構:Collection與Map是兩個根介面。

Collection介面:內部儲存的是一個個獨立的對象。包含:

1、List介面:序列,儲存元素排列有序且可重複。實作類別:ArrayList,數組序列;實作類別:LinkedList,鏈表。

2、Queue介面:隊列,儲存元素排列有序且可重複。實作類別:LinkedList,鏈表。

3、Set介面:集,儲存元素無序且不可重複。實作類別:HashSet,雜湊集。

Map介面:內部以<Key,Value>(任意類型)的一個映射去儲存資料,這一個映射就是Entry類(Map的內部類)的執行個體。包括:實作類別:HashMap,雜湊表。

Collection介面是List、Set、Queue介面的父介面,Collection介面定義了可用於操作List、Set和Queue的方法--增刪改查。(具體的Collection介面的方法可以通過查API,這裡就不列舉了。)

其中,ArrayList、HashSet和HashMap是使用最多的三個實作類別,這裡我們將逐個介紹這三個實作類別。

在這篇文章中將先介紹ArrayList的用法。

三、ArrayList實作類別

List介面及其實作類別--ArrayList

List可以精確的控制每個元素的插入位置,或刪除某個位置元素;

List有add()插入方法和get()擷取方法;

ArrayList--數組序列,是List的一個重要實作類別

ArrayList底層是由數組實現的,這也是其名字的由來。

那麼如何使用這些集合呢?我們來通過一個小例子,寫一個小程式來更直觀的學習集合的使用方法。(之後的文章的例子也是基於此的)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

程式功能——類比學生選課功能

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

以下是該程式的程式碼片段,因為是用於測試來介紹集合的使用,所以請不要在意細節,代碼會一步步改進的。

 1)建立學生類和課程類
 1 /** 2  * 學生類 3  * @author hysum 4  * 5  */ 6 public class Student implements { 7     private String name;//學生姓名 8     private String id;//學生id 9     private Set courses;//所選課程的set集合10     11     public Student(){}12     public Student(String id,String name){13         this.id=id;14         this.name=name;15         this.courses=new HashSet();//初始化集合16     }17     public String getName() {18         return name;19     }20     public void setName(String name) {21         this.name = name;22     }23     public String getId() {24         return id;25     }26     public void setId(String id) {27         this.id = id;28     }29     public Set getCourses() {30         return courses;31     }32     public void setCourses(Set courses) {33         this.courses = courses;34     }
 1 /** 2  * 課程類 3  * @author hysum 4  * 5  */ 6 public class Course { 7 private String id;//課程id 8     private String name;//課程名稱 9     10     public Course(){11         12     }13     public Course(String name){14         this.name=name;15     }16     public String getId() {17         return id;18     }19     public void setId(String id) {20         this.id = id;21     }22     public String getName() {23         return name;24     }25     public void setName(String name) {26         this.name = name;27     }28     public Course(String id,String name){29         this.id=id;30         this.name=name;31     }32 }
2)建立備選課程類
 1 /** 2  * 備選課程類 3  *  4  * @author hysum 5  * 6  */ 7 public class ListCourse { 8 private List CoresesToSelect;// 備選課程 9     private Student stu;10     private static Scanner in;11     {12         in = new Scanner(System.in);13     }14     public ListCourse() {15         this.CoresesToSelect = new ArrayList();// 初始化List集合16     }17        public List getCoresesToSelect() {18         return CoresesToSelect;19     }20 21     public void setCoresesToSelect(List coresesToSelect) {22         CoresesToSelect = coresesToSelect;23     }   26 }

注意:

List是介面,所以在構造方法中不能直接執行個體化,而通過ArrayList()執行個體化!!!

例:public List coursesToSelect = new ArrayList();

Set、Map都類似,不可以直接對他執行個體化,要藉助相應的執行個體化類如HashSet(),HashMap();

3)在備選課程裡添加課程

(添加元素)List下總共有4個為List插入元素的方法 :

1.add(element);

2.add(index,element);

3.addAll(Arrays.asList(對象數組名));

4.addAll(index,Arrays.asList(對象數組名));

以下用程式碼範例:

 1 /* 2  * 添加備選課程 3  */ 4 public void AddCourse() { 5         Course cr1=new Course("1","資料結構");//建立課程對象 6     this.CoresesToSelect.add(cr1);//用add(element)添加  7         Course temp=(Course)this.CoresesToSelect.get(0);//用get方法取出,注意類型轉換 8     System.out.println("添加了課程:"+temp.getId()+" "+temp.getName()); 9         10         Course cr2=new Course("2","C語言");//建立課程對象11     this.CoresesToSelect.add(0,cr2);//用add(index,element)添加 12     temp=(Course)this.CoresesToSelect.get(0);13         System.out.println("添加了課程:"+temp.getId()+" "+temp.getName());  14 }      
1 Course[] course = { new Course("1", "資料結構"), new Course("2", "C語言"), new Course("3", "組合語言"),2                 new Course("4", "離散數學") };3         this.CoresesToSelect.addAll(Arrays.asList(course));//用addAll(Arrays.asList(對象數組名))添加

注意:

1.對象被存入集合都變成object類型了 取出時需要類型強轉。(之後會用泛型來解決這個問題)

例:Course temp = (Course)coursesToSelect.get(0);

2.添加進list中的位置(index)介於[0,length]之間;0代表插到隊頭,length代表插到隊尾。

3.如果添加到List中的長度大於他目前的長度,則系統會出現異常,即數組下表越界異常,如:

1 Course cr2=new Course("2","C語言");//建立課程對象2 this.CoresesToSelect.add(2,cr2);//用add方法添加,超出集合現有長度 temp=(Course)

4)備選課程取出列印

以下三種方法都是用來取出List中元素的方法:

 -----for迴圈-----

1 public void testGet(){2 int size=CoursesToSelect.size();3 for(int i=0;i<size;i++){4 Course cr=(Course) CoursesToSelect.get(i);5 System.out.println("取出的課程:"+cr.getId()+":"+cr.getName());6 }7 }

-----迭代器-----

Iterator是一個介面,依賴於集合存在的。

1 Iterator it=CourseToSelect.iterator();2 while(it.hasNext()){3 Course cr=(Course) it.next();4 System.out.println("課程:" + cr.id + ":" + cr.name);5 }

-----for each(推薦使用)-----

1 for(Object obj:CoursesToSelect){//遍曆集合中的每一個元素,作為每一個Object變數2 Course cr=(Course) obj;3 System.out.println("課程:" + cr.id + ":" + cr.name);4 }
5)備選課程修改

使用set(index,Object element)修改元素,index表示索引位置,element表示新對象。

1     /*2      * 修改備選課程3      */4     public void Modify(int index, Course c) {// 傳入要修改的參數5         this.CoresesToSelect.set(index, c);6     }
6)刪除備選課程元素

List中有remove(index),remove(對象值)和removeAll(Arrays.asList(對象數組名))方法來刪除容器中元素的值(用法和add類似)。

Course是資訊課程類,有id和name屬性;courseToSelect是list的序列容器物件。

 1     /* 2      * 刪除備選課程,跟添加方法類似 3      */ 4     public void Remove(int index) {// 通過索引位置刪除 5         this.CoresesToSelect.remove(index); 6     } 7  8     public void Remove(Course c) {// 通過課程對象刪除 9         this.CoresesToSelect.remove(c);10 11     }12 13     public void Remove(Course[] c) {// 通過集合對象刪除14         this.CoresesToSelect.removeAll(Arrays.asList(c));15 16     }

注意:

1.remove(index);刪除位元置要大於0並且小於List(序列容器)的長度。如果要刪除全部可以用for迴圈嵌套此方法。

2.remove(object);先要獲得刪除的值,用法是先定義一個資訊變數通過get()來存放要刪除的值,然後用remove(刪除的對象值);

3.removeAll(Arrays.asList());要刪除指定的多個位置  Arrays.asLIst(對象數組名);作用是把數群組轉換為集合。用法是先建立資訊對象數組存放刪除元素的值,然後再用removeAll(Arrays.asList(對象數組名))方法,刪除集合數組的元素。

四、應用泛型管理課程

在上面的幾個例子中,小夥伴是否發現對於集合的取出和遍曆都要將Object對象進行強制轉換後才能使用,每次這樣做不僅增加了編程難度還使代碼特別繁瑣,這裡我們可以利用泛型來協助我們更加方便地使用java集合。

首先,我們要知道沒有使用泛型的話,集合中的元素,可以是任意類型的對象(對象的引用),如果把某個對象放入集合,則會忽略他的類型把他當做Object處理。

那麼我們就在剛才的例子裡往備選課程類裡的CoresesToSelect的List集合添加一些奇怪的東西會發什麼有趣的事呢?

1    /*2      * 往List中添加一些奇怪的東西3      */4      public void testType(){5      System.out.println("能否往List中添加一些奇怪的東西呢?");6      this.CoresesToSelect.add("我不是課程,我是字串!");7      }

當調用取出課程方法取出該元素時,運行時出錯:

這是因為取出該元素時String類型不能強制轉換為Course類型,那有什麼辦法來避免集合中被添加不希望添加的類型呢?

泛型則是規定了某個集合只可以存放特定類型的對象,會在編譯期間進行類型檢查,可以直接指定類型擷取的集合元素。

泛型:指規定了某個集合只能存放特定類型的對象。

文法:ArrayList<String> array=new ArrayList<String>();  //規定array中只能存放String類型的對象

那麼,瞭解了泛型之後,上面的例子裡都可以加上泛型了,修改如下(只列出修改的部分):(自行對比)

1 private Set<Course> courses;//所選課程的set集合2 this.courses=new HashSet<Course>();//初始化集合3 public Set<Course> getCourses() {4         return courses;5     }6     public void setCourses(Set<Course> courses) {7         this.courses = courses;8     }
 1 private List<Course> CoresesToSelect;// 備選課程 2 public ListCourse() { 3         this.CoresesToSelect = new ArrayList<Course>();// 初始化List集合 4     } 5 public List<Course> getCoresesToSelect() { 6         return CoresesToSelect; 7     } 8  9     public void setCoresesToSelect(List<Course> coresesToSelect) {10         CoresesToSelect = coresesToSelect;11     }

foreach迴圈的修改:

1 for (Course obj : CoresesToSelect) {        2     System.out.println("添加了課程:" + obj.getId() + " " + obj.getName());4 }

運用了泛型的話,用foreach語句時 儲存變數應該為泛型的類型。for(Course a:courseToSelect),不必再用Object取出再強轉,因為已經規定容器裡裝的都是Course類型。

使用泛型要注意

1.泛型集合中,不能添加泛型規定的類型和其子類以外的對象,否則會報錯!

2.泛型中可以添加規定的類型的子類型的對象。如:

1 public void testChild() {2         ChildCourse ccr = new ChildCourse();3         ccr.id = "3";4         ccr.name = "我是子類型的課程對象執行個體~~";5         courses.add(ccr);6 }

3.不能直接添加基本類型(int,float等)的對象,如果要添加,需要使用其封裝類。如:

1 public void testBasicType() {2 List<Integer> list = new ArrayList<Integer>();3 list.add(1);4 System.out.println("基本類型必須使用封裝類作為泛型!" + list.get(0));5 }
五、通過Set集合管理課程

Set集合和List一樣是Collection介面的子介面。它的方法跟List類似,但有稍許不同,因為Set集合是無序且不重複的。

1)新增學生選課的課程

add方法跟ArrayList一樣

 1 li.stu=new Student("1","小明"); 2         System.out.println("歡迎"+li.stu.getName()+"同學選擇課程"); 3         for(int i=0;i<3;i++){//迴圈三次添加選課 4             System.out.println("請選第"+(i+1)+"門課程:"); 5             String Id=in.next(); 6             for(Course c:li.getCoresesToSelect()){ 7                 if(c.getId().equals(Id)){ 8                     li.stu.getCourses().add(c); 9                 }10             }11             12         }

注意:Set 中添加某個對象,無論添加多少次,最終只會保留一個該對象(的引用)。同時,保留的是第一次添加的那一個。Set集合是無序的不可重複的。

2)列印輸出學生選的課程
1 //輸出學生選的課程2         for(Course c:li.stu.getCourses()){3             System.out.println(c.getId()+" "+c.getName());4 5         }

注意:迴圈遍曆Set中的每一個元素只能用foreach或iterator,不能像List一樣用get()方法。因為是無序的每次的輸出結果都有些差別。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

總結:

1、Set沒有像List中set()方法一樣就修改,因為List是有序的,可以指定位置,而Set是無序的,可以用迴圈遍曆方式修改。

2、查詢遍曆時,Set不能用get()方法去擷取,因為無序沒有指定索引ID,但可以使用foreach和iterator來遍曆,但是每次遍曆出來可能順序都不一樣,還是因為無序造成的。

3、Set中的size(),add(),addAll(),remove(),removeAll()與List類似。

4、Set還可以添加null(但只能添加一個null,因為不重複);

本篇主要講述了List和Set的基本操作:增刪改查,下一篇我將介紹Map介面的基本操作,有興趣的小夥伴可以加一下方的"關注"哦!博主正在努力載入中。。。。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.