結合框架的體系結構:
一、List(列表)
1. List的特點
(1)List是元素有序並且可以重復的集合,稱為序列
(2)List可以精確的控制每個元素的插入位置,或刪除某個位置的元素
(3)List的兩個主要實現類是ArrayList和LinkList
2. ArrayList的特點
(1)ArrayList底層是由數組實現的
(2)動態增長,以滿足應用程序的需求
(3)在列比餓哦尾部插入或刪除數據非常有效
(4)更適合查找和更新元素
(5)ArrayList中的元素可以為null
以下是通過例題演示常用方法的使用:
在ArrayList中存儲並操作字符串信息
例一需求:用ArrayList存儲編程語言的名稱並輸出,名稱報告Java,C,C++,Go,Swift
package com.mpp.set; import java.util.ArrayList; import java.util.List; public class ListDemo1 { public static void main(String[] args) { List list = new ArrayList(); list.add("java"); list.add("python"); list.add("c"); list.add("swift"); //輸出list中的元素個數 System.out.println(list.size()); //遍歷輸出所有變成語言 for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+" "); } System.out.println(); //移除Python // list.remove(1); //根據indexof移除 list.remove("python"); //根據元素內容移除 for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+" "); } } }
在ArrayList中添加自定義的類的對象
例二需求:公告管理,公告的添加和顯示,在指定位置處插入公告,刪除公告,修改公告
公告類屬性:編號id,標題title,創建人creator,創建時間createTime
公告類方法:構造方法,獲取和設置屬性值的方法(get/set方法)
公告類的代碼:
package com.mpp.set; import java.util.Date; public class Notice { //屬性:id,title,crator,creatTime private int id; private String title; private String creator; private Date createTime; public Notice(){} //無參構造 //帶參構造 public Notice(int id,String title,String creator,Date createTime){ super(); this.id = id; this.title = title; this.creator = creator; this.createTime = createTime; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCreator() { return creator; } public void setCreator(String creator) { this.creator = creator; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
公告管理類的代碼:package com.mpp.set;
package com.mpp.set; import com.sun.tools.corba.se.idl.constExpr.Not; import java.util.ArrayList; import java.util.Date; public class NoticeTest { public static void main(String[] args) { //創建notice的對象,生成三條公告 Notice no1 = new Notice(1,"hello word!","admin",new Date()); Notice no2 = new Notice(2,"交作業!","teacher",new Date()); Notice no3 = new Notice(3,"考勤通知","teacher",new Date()); //添加公告 ArrayList noList = new ArrayList(); noList.add(no1); noList.add(no2); noList.add(no3); //顯示公告 System.out.println("公告的內容為:"); for(int i=0;i<noList.size();i++){ Notice notice = (Notice)(noList.get(i)); System.out.println(i+1+":"+notice.getTitle()); } System.out.println("************************"); //在第一條公告后面添加一條新公告 Notice no4 = new Notice(4,"在線編輯器可以使用了","admin",new Date()); noList.add(1,no4); System.out.println("公告的內容為:"); for(int i=0;i<noList.size();i++){ Notice notice = (Notice)(noList.get(i)); System.out.println(i+1+":"+notice.getTitle()); } System.out.println("************************"); //刪除公告 noList.remove(2); System.out.println("公告的內容為:"); for(int i=0;i<noList.size();i++){ Notice notice = (Notice)(noList.get(i)); System.out.println(i+1+":"+notice.getTitle()); } System.out.println("************************"); //修改公告 no4.setTitle("修改title:python在線編譯器可以使用了"); noList.set(1,no4); //我發現有沒有這一行都不影響修改后的list的顯示 System.out.println("公告的內容為:"); for(int i=0;i<noList.size();i++){ Notice notice = (Notice)(noList.get(i)); System.out.println(i+1+":"+notice.getTitle()); } } }
二、Set(集合)
1.Set的特點
(1)Set是元素無序並且不可以重復的集合, 被稱為集
2.HashSet的特點
(1)HashSet是Set的一個重要實現類,稱為哈希集
(2)HashSet中的元素無序並且不可以重復
(3)HashSet中只允許一個null元素
(4)具有良好的存取和查找性能
注意:在Set顯示所有元素需要用到Iterator(迭代器),迭代器有以下特點:
(1)Iterator接口可以以統一的方式對各種集合元素進行遍歷
(2)hasNext()方法檢測集合中是否還有下一個元素
(3)next()方法返回集合中的下一個元素
以下是通過例題演示常用方法的使用:
在HashSet中存儲並操作字符串信息
例一需求:用HashSet存儲多個標識顏色的英文單詞,並輸出,比如:blue,red,black,yellow等等
package com.mpp.set; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class WordDemo { public static void main(String[] args) { //將英文檔次添加到HashSet中 Set set = new HashSet(); //向集合中添加元素 set.add("red"); set.add("blue"); set.add("black"); set.add("yellow"); set.add("white"); //顯示集合的內容 System.out.println("集合中的元素為:"); Iterator it = set.iterator(); //放進迭代器,使用迭代器遍歷顯示元素 //遍歷迭代器並輸出元素 while(it.hasNext()){ System.out.print(it.next()+ " "); } // set.add("green"); //set是無序的,所以插入就是增加 System.out.println(); set.add("red"); //set不允許插入重復元素,插入失敗,但是不會報錯 it = set.iterator(); System.out.println("插入重復元素后:"); while(it.hasNext()){ System.out.print(it.next()+ " "); } } }
運行結果如下:
集合中的元素為:
red blue white black yellow
插入重復元素后:
red blue white black yellow
在HashSet中添加自定義的類的對象
例二需求:寵物貓信息管理
添加和顯示寵物貓信息
查找某只寵物貓的信息並輸出
修改寵物貓的信息
刪除寵物貓的信息
寵物貓的屬性:name,month,species
寵物貓的方法:構造方法,獲取和設置屬性值的方法(get/set),其他方法
Cat類:
package com.mpp.set; public class Cat { private String name; //名字 private int mounth; //年齡 private String species;//品種 public Cat(String name,int mounth,String species){ super(); this.setName(name); this.setMounth(mounth); this.setSpecies(species); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getMounth() { return mounth; } public void setMounth(int mounth) { this.mounth = mounth; } public String getSpecies() { return species; } public void setSpecies(String species) { this.species = species; } }
CatTest類:
package com.mpp.set; import javax.swing.text.html.HTMLDocument; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class CatTest { public static void main(String[] args) { //定義寵物貓對象 Cat cafe = new Cat("cafe",12,"英短"); Cat milk = new Cat("milk",1,"藍貓"); //將寵物貓對象放入HashSet中 Set set = new HashSet(); set.add(cafe); set.add(milk); //顯示寵物貓的信息 Iterator it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
運行結果:
com.mpp.set.Cat@610455d6
com.mpp.set.Cat@511d50c0
這里顯示的是對象再內存中的地址信息,因此我們需要在Cat類中重寫toString方法
//toString方法重寫 @Override public String toString(){ return "[姓名:"+name+",年齡:"+mounth+",品種:"+species+"]"; }
再次運行結果:
[姓名:cafe,年齡:12,品種:英短]
[姓名:milk,年齡:1,品種:藍貓]
添加重復的寵物貓數據
Cat類不變,CatTest類的代碼修改如下:
package com.mpp.set; import javax.swing.text.html.HTMLDocument; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class CatTest { public static void main(String[] args) { //定義寵物貓對象 Cat cafe = new Cat("cafe",12,"英短"); Cat milk = new Cat("milk",1,"藍貓"); //將寵物貓對象放入HashSet中 Set set = new HashSet(); set.add(cafe); set.add(milk); //顯示寵物貓的信息 Iterator it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //再添加一個與milk屬性一樣的貓 Cat milk01 = new Cat("milk",1,"藍貓"); set.add(milk01); System.out.println("添加重復數據,milk01:"); it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
運行結果:
[姓名:cafe,年齡:12,品種:英短] [姓名:milk,年齡:1,品種:藍貓] 添加重復數據,milk01: [姓名:cafe,年齡:12,品種:英短] [姓名:milk,年齡:1,品種:藍貓] [姓名:milk,年齡:1,品種:藍貓]
這里的運行結果,添加重復的寵物貓信息添加成功了
再次修改Cat類的代碼,重寫hashCode和equals方法,CatTest類代碼不動:
package com.mpp.set; public class Cat { private String name; //名字 private int mounth; //年齡 private String species;//品種 public Cat(String name,int mounth,String species){ super(); this.setName(name); this.setMounth(mounth); this.setSpecies(species); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getMounth() { return mounth; } public void setMounth(int mounth) { this.mounth = mounth; } public String getSpecies() { return species; } public void setSpecies(String species) { this.species = species; } //toString方法重寫 @Override public String toString(){ return "[姓名:"+name+",年齡:"+mounth+",品種:"+species+"]"; } @Override public int hashCode(){ final int prime = 31; int result = 1; result = prime * result + mounth; result = prime * result +((name == null)?0:name.hashCode()); result = prime * result +((species == null)?0:species.hashCode()); return result; } @Override public boolean equals(Object obj){ if(this==obj){ //判斷對象是都相等,相等則返回true,不用繼續比較屬性 return true; } if(obj.getClass()==Cat.class){ //判斷obj是是不是Cat的對象 Cat cat = (Cat)obj; return cat.getName().equals(name)&&(cat.getMounth()==mounth)&&(cat.getSpecies().equals(species)); } return false; } }
運行結果:
[姓名:milk,年齡:1,品種:藍貓] [姓名:cafe,年齡:12,品種:英短] 添加重復數據,milk01: [姓名:milk,年齡:1,品種:藍貓] [姓名:cafe,年齡:12,品種:英短]
查找寵物貓信息:
第一種:通過對象名查找
第二種:通過寵物貓的名字查找
在CatTest增加代碼:
//重新插入一個新寵物貓 Cat cafe02 = new Cat("cafe2.0",2,"中華田園貓"); set.add(cafe02); System.out.println("添加cafe2.0后的寵物貓信息"); it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //在集合中查找cafe的信息並輸出,第一種方法:使用對象名去查找 if(set.contains(cafe)){ System.out.println("cafe找到了"); System.out.println(cafe); } else{ System.out.println("cafe沒找到"); } //通過寵物貓的名字查找,遍歷set中的元素,取出name,和要查找的寵物名對比 System.out.println("通過寵物貓名字查找:"); boolean flag = false; Cat c= null; it = set.iterator(); while(it.hasNext()){ c = (Cat)(it.next()); if(c.getName().equals("cafe")){ flag = true; break; } } if(flag){ System.out.println("cafe找到了"); System.out.println(c); } else{ System.out.println("cafe沒找到"); }
引入泛型(<Cat>)的概念后刪除數據,代碼如下:
package com.mpp.set; import javax.swing.text.html.HTMLDocument; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class CatTest { public static void main(String[] args) { //定義寵物貓對象 Cat cafe = new Cat("cafe",12,"英短"); Cat milk = new Cat("milk",1,"藍貓"); //將寵物貓對象放入HashSet中 Set<Cat> set = new HashSet<Cat>(); //<Cat>泛型,限制加入hashset中的元素都得是Cat類型 set.add(cafe); set.add(milk); //顯示寵物貓的信息 Iterator<Cat> it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //再添加一個與milk屬性一樣的貓 Cat milk01 = new Cat("milk",1,"藍貓"); set.add(milk01); System.out.println("添加重復數據,milk01:"); it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //重新插入一個新寵物貓 Cat cafe02 = new Cat("cafe2.0",2,"中華田園貓"); set.add(cafe02); System.out.println("添加cafe2.0后的寵物貓信息"); it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } //在集合中查找cafe的信息並輸出,第一種方法:使用對象名去查找 if(set.contains(cafe)){ System.out.println("cafe找到了"); System.out.println(cafe); } else{ System.out.println("cafe沒找到"); } //通過寵物貓的名字查找,遍歷set中的元素,取出name,和要查找的寵物名對比 System.out.println("通過寵物貓名字查找:"); boolean flag = false; Cat c= null; it = set.iterator(); while(it.hasNext()){ c = (it.next()); if(c.getName().equals("cafe")){ flag = true; break; } } if(flag){ System.out.println("cafe找到了"); System.out.println(c); } else{ System.out.println("cafe沒找到"); } //刪除cafe02的信息並重新輸出 for(Cat cat:set){ if("cafe2.0".equals(cat.getName())){ set.remove(cat); } } System.out.println("刪除cafe2.0后的數據:"); for(Cat cat:set){ System.out.println(cat); } //刪除集合中的所有寵物貓信息 System.out.println("刪除所有寵物貓信息"); boolean flag1 = set.removeAll(set); if(set.isEmpty()){ //這里可以通過判斷flag1是否為空和set.isEmpty()兩種辦法來判斷是否刪除完數據 System.out.println("貓都沒了"); } else{ System.out.println("貓還在---"); } } }
注意:set.remove(set) 這里的第二個set可以是set的一個子集
三、Map
1. Map的特點
(1)Map中的數據是以鍵值對的形式存儲的
(2)k-v以Entry類型的對象實例存在
(3)可以通過key值快速地查找value
(4)一個映射不能包含重復的鍵
(5)每個鍵最多只能映射到一個值
2. HashMap的特點
(1)基於哈希表的Map接口的實現
(2)允許使用null值和null鍵
(3)key值不允許重復
(4)HashMap中的Entry對象是無序排列的
以下是通過例題演示常用方法的使用:
在HashMap中存儲並操作字符串信息
例一需求:完成一個類似字典的功能
將單詞以及單詞的注釋存儲到HashMap中
顯示HashMap中的內容
查找某個單詞的注釋並顯示
package com.mpp.set; import java.util.*; public class DictionaryDemo { public static void main(String[] args) { //定義一個HashMap的對象 Map<String,String> animal = new HashMap<String,String>(); System.out.println("請輸入三組單詞對應的注釋,並存放到HashMap中"); Scanner console = new Scanner(System.in); //添加數據 int i = 0; while(i<3){ System.out.println("請輸入key值:"); String key = console.next(); System.out.println("請輸入value值:"); String value = console.next(); animal.put(key,value); i++; } //打印輸出value的值(直接使用迭代器) System.out.println("使用迭代器輸出所有value:"); Iterator<String> it = animal.values().iterator(); while (it.hasNext()){ System.out.print(it.next()+" "); } System.out.println(); //打印輸出key和value的值 //通過entrySet方法 System.out.println("通過entrySet得到k-v:"); Set<Map.Entry<String,String>> entrySet = animal.entrySet(); for(Map.Entry<String,String> entry:entrySet){ System.out.print(entry.getKey()+"-"); System.out.print(entry.getValue()); System.out.println(); } //通過單詞找到注釋並輸出 //使用keySet方法 System.out.println("請輸入要查找的單詞:"); String strSearch =console.next(); //1. 取到keySet Set<String> keySet = animal.keySet(); //2.遍歷keySet for(String key:keySet){ if(strSearch.equals(key)){ System.out.println("找到了!鍵值對為:"+key+animal.get(key)); break; } } } }
在HashMap中添加自定義的類的對象
例二需求:商品信息管理
使用HashMap對商品信息進行管理
其中key為商品編碼,value為商品對象
對HashMap中的商品信息進行增刪改查操作
商品信息類
屬性:商品編號,名稱,價格
方法:構造方法,獲取和設置屬性值的方法,其他方法
商品類:
package com.mpp.set; public class Goods { private String id; private String name; private double price; public String getId() { return id; } public String getName() { return name; } public double getPrice() { return price; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setPrice(double price) { this.price = price; } public Goods(String id,String name,double price){ this.id = id; this.name = name; this.price = price; } public String toString(){ return "商品編號:"+id+",商品名稱:"+name+",商品價格:"+price; } }
商品信息類:
package com.mpp.set; import java.util.*; public class GoodsTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //定義HashMap對象 Map<String,Goods> goodsMap = new HashMap<String,Goods>(); System.out.println("請輸入三條商品信息:"); int i= 0; while(i<3){ System.out.println("請輸入第"+(i+1)+"條商品信息:"); System.out.println("請輸入商品編號:"); String goodsId = sc.next(); //判斷商品編號id是否已存在 if(goodsMap.containsKey(goodsId)){ System.out.println("商品編號已存在!請重新輸入!"); continue;//結束當前循環,進入下一次循環 } System.out.println("請輸入商品名稱:"); String goodsName = sc.next(); System.out.println("請輸入商品價格:"); double goodsPrice = 0; try{ goodsPrice = sc.nextDouble(); } catch (InputMismatchException e){ System.out.println("商品價格的格式不正確,請輸入數值型數據!"); sc.nextInt(); //如果沒有這一句,出現異常時,這里輸入的價格直接變成下一個輸入的商品編號 continue; } Goods goods = new Goods(goodsId,goodsName,goodsPrice); //將商品信息添加到HashMap中 goodsMap.put(goodsId,goods); i++; } //比那里Map,輸出商品信息 System.out.println("商品的全部信息為:"); Iterator<Goods> itGoods = goodsMap.values().iterator(); while(itGoods.hasNext()){ System.out.println(itGoods.next()); } } }