- Java高級程序設(shè)計實戰(zhàn)教程
- 戴遠(yuǎn)泉 李超 秦爭艷
- 1020字
- 2019-10-23 17:28:12
2.3 任務(wù)實施
任務(wù)一 使用List存取用戶信息,并做增刪改查操作
1. 任務(wù)知識
(1)List接口
List繼承自Collection接口。List是一種有序集合,List中的元素可以根據(jù)索引(順序號:元素在集合中處于的位置信息)進行查詢/刪除/插入操作。
跟Set集合不同的是,List允許有重復(fù)元素。對于滿足e1.equals(e2)條件的e1與e2對象元素,可以同時存在于List集合中。
(2)List實現(xiàn)類
List接口的實現(xiàn)類主要有ArrayList、LinkedList、Vector、Stack等。
(3)ArrayList常用方法
一般主要使用的ArrayList方法,如表2-2所示。
表2-2 ArrayList主要方法

(4)List一般用法
在使用List集合時,通常情況下聲明為List類型,實例化時根據(jù)實際情況的需要,實例化為ArrayList或LinkedList。
① 聲明一個list的示例如下:
List<String> l1 = new ArrayList<String>(); //利用ArrayList類實例化List集合 List<String> l2 = new LinkedList<String>(); //利用LinkedList類實例化List集合
② 向list中存值的示例如下:
l1.add("張三"); l2.set(1, "汪涵"); //將索引位置為1的對象e修改為對象“汪涵”
③ 遍歷list的示例如下:
Iterator it = l2.iterator(); while (it.hasNext()) { System.out.println(it.next()); } }
2. 任務(wù)需求
使用List存取用戶信息,并做增刪改查操作。
3. 任務(wù)分析
一個班級之中存在若干個學(xué)生,通過一個實體類定義一個學(xué)生相對應(yīng)的基本信息,然后通過一個List集合進行存儲,實現(xiàn)對學(xué)生基本信息的CURD。類圖如圖2-3所示。

圖2-3 測試存取用戶信息的類圖
4. 任務(wù)實現(xiàn)
User.java
package com.daiinfo.seniorjava.ken2.implement.list; public class User { String name; String email; public User(String name, String emailString) { this.name = name; this.email = emailString; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
TestList.java
package com.daiinfo.seniorjava.ken2.implement.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class TestList { public static void main(String[] args) { List<User> list=new ArrayList<User>(); list.add(new User("小明", "xiaoming@qq.com")); User xiaozhang=new User("小張","xiaozhang@qq.com"); User xiaohu=new User("小胡", "xiaohu@qq.com"); list.add(xiaozhang); list.add(xiaohu); //遍歷 //方法1 ListIterator<User> it1 = list.listIterator(); System.out.println("方法1 "); while(it1.hasNext()){ User user=it1.next(); System.out.println(user.getName()+user.getEmail()); } //方法2 System.out.println("方法2 "); for(Iterator<User> it2 = list.iterator();it2.hasNext();){ User user=it2.next(); System.out.println(user.getName()+user.getEmail()); } //方法3 System.out.println("方法3 "); for(User tmp:list){ System.out.println(tmp.getName()+tmp.getEmail()); } //方法4 System.out.println("方法4 "); for(int i = 0;i < list.size(); i ++){ System.out.println(list.get(i).getName()+list.get(i).getEmail()); } //移除列表中的元素 list.remove(1); System.out.println("方法3 "); for(User tmp:list){ System.out.println(tmp.getName()+tmp.getEmail()); } } }
運行結(jié)果如圖2-4所示。

圖2-4 ArrayList測試運行結(jié)果圖
說明:
① 使用add()方法向列表的尾部或指定位置添加指定的元素。
list.add(new User("小明", "xiaoming@qq.com")); User xiaozhang=new User("小張","xiaozhang@qq.com"); list.add(xiaozhang);
② 使用set()方法替換列表中指定位置的元素;使用get()方法返回列表中指定位置的元素。
list.get(i); list.set(1,"小胡");
③ 使用remove(int index)方法移除列表中指定位置的元素。
④ 使用listIterator()方法返回此列表元素的列表迭代器。利用迭代最大的好處就程序員不用再去為了索引越界等等異常所苦惱了,只需在迭代過程中對列表元素進行操作即可。
ListIterator<Integer> iterator = list.listIterator(); while (iterator.hasNext()) { System.out.println(); }
任務(wù)二 使用Set存取數(shù)據(jù),并做增刪改查操作
1. 任務(wù)知識
(1)Set接口
Set是繼承于Collection的接口。Java中的set接口有如下特點。
? 不允許出現(xiàn)重復(fù)元素;
? 集合中的元素位置無順序;
? 有且只有一個值為null的元素。
(2)Set接口的實現(xiàn)類
實現(xiàn)了Set接口的主要有HashSet、TreeSet、LinkedHashSet。
HashSet依賴于HashMap,它實際上是通過HashMap實現(xiàn)的。HashSet中的元素是無序的。
TreeSet依賴于TreeMap,它實際上是通過TreeMap實現(xiàn)的。TreeSet中的元素是有序的。
(3)HashSet常用方法
HashSet是存在于Java.util包中的類。同時也被稱為集合,一般常用的方法如表2-3所示。
表2-3 HashSet常用方法

(4)Set接口的一般用法。
在使用Set集合時,通常情況下聲明為Set類型,實例化時根據(jù)實際情況的需要,實例化為HashSet或TreeSet。
① 創(chuàng)建HashSet對象的示例如下:
HashSet hashSet=new HashSet();
② 添加元素的示例如下:
hashset.add("abc");
③ 刪除元素的示例如下:
hashset.clear() //從此 set 中移除所有元素。 hashset.remove(Object o) //如果指定元素存在于此 set 中,則將其移除。
④ 遍歷HashSet的示例如下:
Iterator it = hashset.iterator(); while(it.hasNext()){}
2. 任務(wù)需求
使用Set存儲學(xué)生信息,并進行CRUD操作。
3. 任務(wù)分析
一個班級之中存在若干個學(xué)生,通過一個實體類定義一個學(xué)生相對應(yīng)的基本信息,然后通過一個Set集合進行存儲,實現(xiàn)對學(xué)生基本信息的CURD。
類圖關(guān)系如圖2-5所示。

圖2-5 HashSet測試類圖
4. 任務(wù)實現(xiàn)
Student.java
package com.daiinfo.seniorjava.ken2.implement.hashset; class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // 復(fù)寫hashCode方法 @Override public int hashCode() { return 60; } // 復(fù)寫equals方法 @Override public boolean equals(Object arg0) { if (!(arg0 instanceof Student)) { return false; } Student studet = (Student) arg0; return this.name.equals(studet.name) && this.age == studet.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
TestHashSet.java
package com.daiinfo.seniorjava.ken2.implement.hashset; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.Set; public class TestHashSet{ public static void hashSet1() { HashSet<String> hashSet = new HashSet<String>(); hashSet.add("java001"); hashSet.add("java01"); hashSet.add("java011"); hashSet.add("java002"); hashSet.add("java004"); // 使用常用迭代器獲取輸出內(nèi)容 Iterator<String> iterator = hashSet.iterator(); while (iterator.hasNext()) { String next = iterator.next(); System.out.println(next); } } public static void hashSet2() { HashSet<Student> hashSet = new HashSet<Student>(); hashSet.add(new Student("zhangsan1", 21)); hashSet.add(new Student("zhangsan1", 21)); hashSet.add(new Student("zhangsan2", 21)); hashSet.add(new Student("zhangsan3", 23)); hashSet.add(new Student("zhangsan4", 24)); // 使用常用迭代器獲取值 Iterator<Student> iterator = hashSet.iterator(); while (iterator.hasNext()) { Student next = (Student) iterator.next(); System.out.println(next.getName() + " " + next.getAge()); } } public static void main(String[] args) { hashSet1(); hashSet2(); } }
運行結(jié)果如圖2-6所示。

圖2-6 HashSet測試運行結(jié)果圖
任務(wù)三 使用Map存取數(shù)據(jù),并做增刪改查操作
1. 任務(wù)知識
(1)Map接口
Map提供了一種映射關(guān)系,其中的元素是以鍵值對(key-value)的形式存儲的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value。Map中的鍵值對以Entry類型的對象實例形式存在。鍵值(key值)不可重復(fù),value值可以重復(fù),一個value值可以和很多key值形成對應(yīng)關(guān)系,每個鍵最多只能映射到一個值。Map支持泛型,形式如:Map<K,V>。Map中使用put(K key, V value)方法添加。
(2)已知實現(xiàn)類
在Java.util包中接口Map<K,V>存儲鍵值對,作為一個元組存入。元組以鍵作為標(biāo)記,鍵相同時,值覆蓋。
類型參數(shù)有:
? K——此映射所維護的鍵的類型;
? V——映射值的類型。
其已知實現(xiàn)類為HashMap、TreeMap。
(3)HashMap常用操作說明
HashMap是一個散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。HashMap繼承于AbstractMap,實現(xiàn)了Map、Cloneable、Java.io.Serializable接口。HashMap的實現(xiàn)不是同步的,這意味著它不是線程安全的。它的key、value都可以為null。
HashMap的一般主要方法如表2-4所示。
表2-4 HashMap接口主要方法

(4)Map的一般用法
① 聲明一個Map的示例如下:
Map map = new HashMap();
② 向map中存值的示例如下(注意map是以key-value的形式存放的):
map.put("sa","dd");
③ 從map中取值的示例如下:
String str = map.get("sa").toString,
結(jié)果是:
str = "dd'
④ 遍歷一個map,從中取得key和value的示例如下:
Map map = new HashMap(); for (Object obj : map.keySet()) { Object value = map.get(obj); }
2. 任務(wù)需求
使用Map存儲學(xué)生信息,并進行CRUD操作。
3. 任務(wù)分析
一個班級之中存在若干個學(xué)生,通過一個實體類定義一個學(xué)生相對應(yīng)的基本信息,然后通過一個Map集合進行key-value鍵值存儲,實現(xiàn)對學(xué)生基本信息的CURD。類圖如圖2-7所示。

圖2-7 HashMap測試類圖
4. 任務(wù)實現(xiàn)
Student.java
package com.daiinfo.seniorjava.ken2.implement.hashmap; import java.util.HashSet; import java.util.Set; / ** * 學(xué)生類 * @author daiyuanquan * @version 1.0 * / public class Student { public String id; public String name; / ** * 構(gòu)造函數(shù) * @param id * @param name * / public Student(String id,String name){ this.id = id; this.name = name; } }
TestMap.java
package com.daiinfo.seniorjava.ken2.implement.hashmap; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; import java.util.Set; / ** * 測試Map應(yīng)用 * @author daiyuanquan * * / public class TestMap { //創(chuàng)建一個Map屬性用來承裝學(xué)生對象 public Map<String,Student> student; 知識領(lǐng)域2 / * * 在構(gòu)造器中初始化學(xué)生屬性 * / public TestMap(){ this.student = new HashMap<String,Student>(); } / * * 添加方法:輸入學(xué)生ID,判斷是否被占用, * 如果未被占用,則輸入姓名,創(chuàng)建新學(xué)生對象,添加到student中 * / public void testPut(){ //創(chuàng)建一個Scanner對象,輸入學(xué)生ID Scanner sc = new Scanner(System.in); int i = 0; while(i<3){ System.out.println("請輸入學(xué)生ID:"); String stuID = sc.next(); Student stu = student.get(stuID); if(stu == null){ System.out.println("請輸入學(xué)生姓名:"); String stuName = sc.next(); Student newStudent = new Student(stuID,stuName); student.put(stuID, newStudent); System.out.println("成功添加學(xué)生:"+student.get(stuID).name); i++; }else{ System.out.println("該學(xué)生ID已被占用!"); continue; } } } / * * 測試Map的keySet方法 * / public void testKeySet(){ //通過keySet方法,返回Map中所有“鍵”的Set集合 Set<String> keySet = student.keySet(); //取得student的容量 System.out.println("總共有"+student.size()+"個學(xué)生;"); //遍歷keySet,取得每一個鍵,再調(diào)用get方法取得每個鍵對應(yīng)的value for (String stuID : keySet) { Student stu = student.get(stuID); if(stu != null){ System.out.println("學(xué)生:"+stu.name); } } } / * * 通過entrySet來遍歷Map * / public void testEntrySet(){ //通過entrySet返回Map中所有的鍵值對 Set<Entry<String,Student>> entrySet = student.entrySet(); for(Entry<String,Student> entry:entrySet){ System.out.println("取得鍵:"+entry.getKey()); System.out.println("對應(yīng)的值為:"+entry.getValue().name); } } / * * 刪除Map中的映射 * / public void testRemove(){ Scanner sc = new Scanner(System.in); while(true){ System.out.println("請輸入要刪除的學(xué)生ID:"); String stuID = sc.next(); //判斷輸入的ID是否存在對應(yīng)的學(xué)生對象 Student stu = student.get(stuID); if(stu == null){ System.out.println("輸入的學(xué)生ID不存在!"); continue; } student.remove(stuID); System.out.println("成功刪除學(xué)生"+stu.name); break; } testEntrySet(); } / * * 使用put方法修改Map中已有的映射 * / public void testModify(){ System.out.println("請輸入要修改的學(xué)生ID:"); Scanner sc = new Scanner(System.in); while(true){ String id = sc.next(); Student stu = student.get(id); if(stu == null){ System.out.println("ID不存在!"); continue; } System.out.println("當(dāng)前學(xué)生是:"+stu.name); System.out.println("請輸入新的學(xué)生:"); String name = sc.next(); Student newStu = new Student(id,name); student.put(id, newStu); System.out.println("修改成功!"); break; } } / * * 測試Map中是否存在某個key值或value值 * / public void testContainsKey(){ System.out.println("請輸入學(xué)生ID:"); Scanner sc = new Scanner(System.in); String stuID = sc.next(); //用containsKey()方法來判斷是否存在某個key值 System.out.println("輸入的ID為:"+stuID+",在學(xué)生列表中是否存在:"+student.containsKey(stuID)); if(student.containsKey(stuID)){ System.out.println("學(xué)生的姓名為:"+student.get(stuID).name); } System.out.println("請輸入學(xué)生姓名:"); String name = sc.next(); //用containsValue()方法來判斷是否存在某個value值 if(student.containsValue(new Student(null,name))){ System.out.println("存在學(xué)生"+name); }else{ System.out.println("學(xué)生不存在!"); } } public static void main(String[] args) { TestMap mt = new TestMap(); mt.testPut(); mt.testKeySet(); } }
運行結(jié)果如圖2-8所示。

圖2-8 HashMap測試結(jié)果圖
- ASP.NET Core:Cloud-ready,Enterprise Web Application Development
- Git Version Control Cookbook
- Developing Mobile Web ArcGIS Applications
- Django開發(fā)從入門到實踐
- Developing Middleware in Java EE 8
- Django Design Patterns and Best Practices
- Essential Angular
- PHP 編程從入門到實踐
- 教孩子學(xué)編程:C++入門圖解
- 零代碼實戰(zhàn):企業(yè)級應(yīng)用搭建與案例詳解
- C++從入門到精通(第6版)
- Android移動應(yīng)用項目化教程
- Beginning C# 7 Hands-On:The Core Language
- C語言王者歸來
- Thymeleaf 3完全手冊