java中的集合框架_JAVA中的集合框架(上)List
第一節 JAVA中的集合框架概述
集合的概念,現實生活中:很多事物湊在一起就是一個集合;數學中的集合:具有相同屬性事物的總體;JAVA中的集合:是一種工具類,就像是容器,儲存任意數量的具有共同屬性的對象。集合的作用:在類的內部,對數據進行組織(如果有些屬性類型相同,但意義與作用不同,咱們就不能把它們放到集合,如學生的姓名和性別屬性),簡單而快速的搜索大數量的條目。
有的集合接口,提供了一系列排列有序的元素,并且可以在序列中間快速的插入或者刪除有關元素;
有的集合接口,提供了映射關系,可以通過關鍵字key去快速查找到對應的唯一對象,而這個關鍵字可以是任意類型。
集合其實就是用來承裝其它對象的容器。
與數組相比,為何選擇集合而不是數組?數組的長度固定,還得復制,集合的長度可變。數組只能通過數組下標訪問元素,類型固定,而有的集合可以通過任意類型查找所映射的具體對象,數組還要遍歷元素比較麻煩。
集合的框架體系結構:
將collection想象成單身宿舍,三個子接口。
1.List(序列):排列有序,可重復
2.Queue(隊列):排列有序,可重復
3.set(集):無序,不可重復
將map當成成對出現,Collection 是存儲的一個一個的對象,而Map提供映射的關系,內部以的Key,Value兩個對象為一個映射來存儲數據,Entry類(鍵值對)是Map的內部類,Key,Value就是Entry的實例,key和value可以是任意類型的對象。兩個根接口:Collection和Map,Collection的子接口有:List序列(有序可重復)、Queue隊列、Set集(無序不可重復)。實現類分別:ArrayList數組序列,LinkedList鏈表也是List的接口實現類,HashSet哈希集;Map的實現類有:HashMap哈希表。
在Collection或Map內部是如何存儲對象呢?在每一個Collection類中,存儲的就是一個個獨立的對象,而Map內部有些特殊。有些集合內部能提供一種映射的關系,就是指Map類,在Map類的內部,一個key一個value兩個對象為一個映射去存儲數據,這樣的一個映射就是Entry類的實例,這個Entry類是Map類的一個內部類,咱們把它翻譯成鍵值對,一個鍵一個值,兩個湊成映射的一對,其中key和value可以是任意類型的對象。
在Collection和Map眾多子接口和實現類當中,ArrayList、HashSet、HashMap使用最多的三個實現類
第二節 Collection接口List接口簡介
Collection接口、子接口及其實現類,Collection接口是java框架中的根接口,也是List、Set和Queue接口的父接口;定義了很多方法,可用于操作List、Set和Queue的方法,對集合的增刪改查,可在API中查看Collection的介紹和方法。
List接口和其實現類 ArrayList
1.List是元素有序并且可以重復的集合,被稱為序列
2.List可以精確的控制每個元素的插入位置,或刪除某個指定位置的元素
3.ArrayList 數組序列,是List的一個重要實現類
4.ArrayList底層是由數組實現的
第三節 學生選課--創建學生類和課程類
/**
* 課程類
* Created by Administrator on 2017/4/2.
*/
public class Course {
private String id;
private String name;
public String getId() {
return id;
}
public String getName(){
return name;
}
public void setId(String id){
this.id=id;
}
public void setName(String name) {
this.name = name;
}
public Course(String id,String name){
this.id=id;
this.name=name;
}
}
import java.util.HashSet;
import java.util.Set;
/**
* 學生類
* Created by Administrator on 2017/4/2.
*/
public class Student {
private String id;
private String name;
public Set courses;
//課程信息存放在set屬性里,和list一樣是一個子接口
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 Student(String id,String name){
this.id=id;
this.name=name;
this.courses=new HashSet();
//構造方法里不能直接實例化,因為set是一個接口,通過HashSet()對courses實例化,HashSet是一個重要的實現類
}
}
第四節 學生選課--添加課程I
在這里注意在List中添加元素,如果插入位置如果大于容量的長度就會報越界異常,如等于容量會在隊尾添加一個,小于0也會報錯。
import java.util.ArrayList;
import java.util.List;
/**
* 添加課程
* Created by Administrator on 2017/4/2.
*/
//既然學生要選課就要存放備選課程,用一個List容器來存放備選課程
public class ListTest {
//新建ListTest類
//創建一個List類型的屬性,用于存放備選課程的容器List
public List courseToSelect;
//給類添加一個構造方法
public ListTest(){
this.courseToSelect=new ArrayList();
//因為List是一個接口,咱們不能直接將它實例化,這里就引入了ArrayList來實現接口的實例化
}
//用于往courseToSelect添加課程對象
public void testAdd(){
//首先要有一個課程對象的實例
Course cr1=new Course("1","數據結構");
//調用add方法添加
courseToSelect.add(cr1);
//打印輸出 courseToSelect.get(0)的數據
//當一個對象存入集合后它就變成了Object類型的數據取出時就要把類型轉換回來
Course temp=(Course) courseToSelect.get(0);
System.out.println("成功添加課程:"+temp.getId()+":"+temp.getName());
Course cr2=new Course("2","C語言");
//重載的add方法可以指定位置添加元素
courseToSelect.add(0,cr2);
Course temp2=(Course) courseToSelect.get(0);
System.out.println("成功添加課程:"+temp2.getId()+":"+temp2.getName());
}
//調用main方法測試
public static void main(String[] args) {
ListTest lt=new ListTest();
lt.testAdd();
}
}
第五節 添加課程II
add和addAll分別各有兩個方法,參數不同。其中addAll 需要先把數組轉換成list Arrays.asList();這個方法也是有兩種用法,可以指定位置添加元素。
Course[] cr3={new Course("3","離散數學"),new Course("4","匯編語言")};
//創建一個課程數組
//調用addAll把數組添加進去,但是這兒的參數要是Collection的實例,
// 就需要把數組轉換成List,用Arrays.asList()方法
courseToSelect.addAll(Arrays.asList(cr3));
//輸出
Course temp3=(Course)courseToSelect.get(2);
Course temp4=(Course)courseToSelect.get(3);
System.out.println("成功添加課程:"+temp3.getId()+":"+temp3.getName()+";"
+temp4.getId()+":"+temp4.getName());
Course[] cr4={new Course("5","高等數學"),new Course("6","大學英語")};
courseToSelect.addAll(2,Arrays.asList(cr4));
Course temp5=(Course)courseToSelect.get(2);
Course temp6=(Course)courseToSelect.get(3);
System.out.println("成功添加課程:"+temp5.getId()+":"+temp5.getName()+";"
+temp6.getId()+":"+temp6.getName());
}
第六節 學生選課--課程查詢
get方法可以取到指定位置的元素,如果想取出每一個則可以使用for循環來遍歷List,由于List中的數據類型是Object,再輸出時需要強制轉換下類型。長度集合.size()方法。
/**
* 定義方法循環遍歷List中的元素
*/
public void test1(){
System.out.println("使用for循環遍歷List中一共有以下課程");
for(int i=0;i
//因為類型不同需要強制類型轉換
System.out.println("課程:"+((Course)courseToSelect.get(i)).getId()+":"+
((Course)courseToSelect.get(i)).getName());
}
}
public void test2(){
System.out.println("使用foreach循環遍歷List中一共有以下課程");
for(Object obj:courseToSelect){
//因為類型不同需要強制類型轉換
System.out.println("課程:"+((Course)obj).getId() +":"+((Course)obj).getName());
}
}
接下來還可以試驗下List的重復性問題,List中可以重復元素
還有一種的特殊遍歷方法,是通過迭代器來遍歷集合中的元素 Iterator
Iterator就是迭代器的意思,在Collection接口中定義了iterator方法,通過這個方法可以返回一個當前集合對象的迭代器,再通過這個迭代器去遍歷集合中的每個元素,Iterator本身也是一個接口。迭代器本身只是用來遍歷元素的,它自己不具備任何存儲的功能,可以理解為迭代器依賴于某個集合而存在,本身不能獨立存在。
public void test3(){
System.out.println("通過迭代器遍歷集合中元素,共有以下課程:");
//通過集合的iterator方法來創建迭代器的實例
Iterator it=courseToSelect.iterator();
//遍歷元素如有元素則輸出它的真值
while(it.hasNext()){
Course cr=(Course) it.next();
System.out.println("課程:"+cr.getId()+":"+cr.getName());
}
}
第七節 學生選課--課程修改
如何修改List張的元素?用set方法,用指定元素替換列表中指定位置的元素。
set(int index,E element)
參數,要替換元素的索引,要在指定位置存儲的元素
courseToSelect.set(4, new Course("7","毛概"));
第八節 學生選課--課程刪除
刪除List中的元素,刪除的方法有remove 和removeAll方法
remove(int index)移除列表中指定位置的元素
remove(object o)此列表中移除第一次出現的指定元素(如果存在)
removeAll(Collection> c)從此列表中移除指定Collection中包含的其所有元素,在某個集合中將另一個集合中的所有元素完全刪除,注意要將數組轉換成List——Arrays.asList();
public void test5(){
Course[] courses={(Course)courseToSelect.get(4),(Course)courseToSelect.get(5)};
courseToSelect.removeAll(Arrays.asList(courses));
courseToSelect.remove(0);
courseToSelect.remove(courseToSelect.get(0));
}
第九節 學生選課--應用泛型管理
是否有方法可以控制我往某個List或某個集合中添加元素的類型呢?
這時我們就要用到泛型。
泛型:集合中的元素,可以是任意類型的對象(對象的引用),集合里儲存的都是一個個引用,它們都是指向某個具體的對象的。如果把某個對象放入集合,則會忽略他的類型,僅僅把它當做Object來處理,取出也是把它當做Object來取出。泛型則是規定了某個集合只能存放特定類型的對象,并且會在編譯期間對其進行類型檢查,可以直接按指定類型獲取出集合中的元素,這樣我們在后續獲取并使用時不用因為Object類型再去強制轉換了,直接就能使用。
public class ListText {
public List courses;
public ListText(){
this.courses=new ArrayList();
}
}
第十節 應用泛型管理課程
其實在泛型集合中,除了可以保存泛型類型的對象實例,還可以存入泛型的子類型的對象實例。泛型集合可以添加泛型子類型的對象實例,泛型不能是基本類型,必須是引用類型,如果非要用基本類型,可以通過使用包裝類限定允許存入的基本數據類型。int Integer long Long boolean Boolean泛型是基本類型的包裝類的實例化 舉例:
List< Integer > list=new ArrayList < Integer > ();
第十一節 通過Set集合來管理課程
Set接口及其實現類——HashSet,Set是元素無序并且不可以重復的集合,被稱為集,HashSet——哈希集,是Set的一個重要實現類,Set沒有提供方法去修改某個位置上的元素,由于List有序,Set無序且不可重復,所以Set不可能提供一個指定索引位置,去修改相應元素的辦法。沒有set()方法,一樣有add addAll remove removeAll size()等方法,Set方法的遍歷只能用foreach或者iterator,不能用get方法,因為無序,也無法查詢指定索引位置的元素。
package student;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
/**
* Created by Administrator on 2017/4/3.
*/
public class SetTest {
/**
*案例功能:
* 提供備選課程
* 創建學生對象,并給該學生添加三門課程添加在學生的courses—Set
* 類型的屬性當中
* 顯示備選課程
* 循環三次,每次輸入課程ID
* 往學生的courses屬性中添加與輸入的ID相匹配的課程,
* 輸出學生選擇的課程
*/
//定義一個課程List,并且調用構造方法初始化。后將之前的添加方法賦值過來并遍歷課程輸出
public List courseToSelect;
public SetTest(){
this.courseToSelect=new ArrayList();
}
public void testAdd(){
//首先要有一個課程對象的實例
Course cr1=new Course("1","數據結構");
//調用add方法添加
courseToSelect.add(cr1);
//打印輸出 courseToSelect.get(0)的數據
//當一個對象存入集合后它就變成了Object類型的數據取出時就要把類型轉換回來
Course temp=(Course) courseToSelect.get(0);
System.out.println("成功添加課程:"+temp.getId()+":"+temp.getName());
Course cr2=new Course("2","C語言");
//重載的add方法可以指定位置添加元素
courseToSelect.add(0,cr2);
Course temp2=(Course) courseToSelect.get(0);
System.out.println("成功添加課程:"+temp2.getId()+":"+temp2.getName());
Course[] cr3={new Course("3","離散數學"),new Course("4","匯編語言")};
//創建一個課程數組
//調用addAll把數組添加進去,但是這兒的參數要是Collection的實例,
// 就需要把數組轉換成List,用Arrays.asList()方法
courseToSelect.addAll(Arrays.asList(cr3));
//輸出
Course temp3=(Course)courseToSelect.get(2);
Course temp4=(Course)courseToSelect.get(3);
System.out.println("成功添加課程:"+temp3.getId()+":"+temp3.getName()+";"
+temp4.getId()+":"+temp4.getName());
Course[] cr4={new Course("5","高等數學"),new Course("6","大學英語")};
courseToSelect.addAll(2,Arrays.asList(cr4));
Course temp5=(Course)courseToSelect.get(2);
Course temp6=(Course)courseToSelect.get(3);
System.out.println("成功添加課程:"+temp5.getId()+":"+temp5.getName()+";"
+temp6.getId()+":"+temp6.getName());
}
public void test2(){
System.out.println("使用foreach循環遍歷List中一共有以下課程:");
for(Object obj:courseToSelect){
//因為類型不同需要強制類型轉換
System.out.println("課程:"+((Course)obj).getId() +":"+((Course)obj).getName());
}
}
public static void main(String[] args) {
SetTest st=new SetTest();
st.testAdd();
st.test2();
Student st1=new Student("1","宮園薰");
System.out.println("歡迎"+st1.getName()+"同學選課!每位同學可以選取三門課程哦");
Scanner sc=new Scanner(System.in);
//for循環循環三次,通過對比ID來存入對應的課程信息
for(int i=0;i<3;i++) {
System.out.println("請輸入您選擇的課程ID:");
String courseId = sc.next();
for (Course cr : st.courseToSelect) {
if (courseId.equals(cr.getId())) {
st1.courses.add(cr);
break;
}
}
}
for(Course cr2:st1.courses){
System.out.println("您選擇了課程:ID:"+cr2.getId()+":"+cr2.getName());
}
}
}
總結
以上是生活随笔為你收集整理的java中的集合框架_JAVA中的集合框架(上)List的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从DevOps到Cloud Native
- 下一篇: 用结构化思维策划一个会议