7.27作業
容器作業
一、 填空題
- Java集合框架提供了一套性能優良、使用方便的接口和類,包括Collection和Map兩大類,它們都位於 ___java.Util__________ 包中
- 隊列和堆棧有些相似,不同之處在於 _隊列是先進先出,堆棧是先進後出___________ 。
- ______鏈表_______ 結構是一種由多個節點組成的線性數據結構,並且每個節點包含有數據以及指向下一個節點的引用。
- _________linkedList_____是一種集合類,它 采用鏈表作為的存儲結構,便於刪除和添加元素,但是按照索引查詢元素效率低下。
- ___________TreeSet__ 是一種Collection類型的集合類,其中元素唯一,並采用二叉樹作為存儲結構,元素按照自然順序排列。
- 如果希望將自定義類Student的多個對象放入集合TreeSet,實現所有元素按照某個屬性的自然順序排列,則需要Student類實現____Comparable___接口。
- 在Java中 ___________Map__ 集合的訪問時間接近穩定,它是一種鍵值對映射的數據結構。這個數據結構是通過數組來實現的。
- 叠代器Iterator為集合而生,專門實現集合遍歷,該接口有三個方法,分別是hasNext() 、______next()______、remove()。
二、 選擇題
1. |
以下選項中關於Java集合的說法錯誤的是( AC )。(選擇二項) |
|
|
|
|
|
A. |
List接口和Set接口是Collections接口有兩個子接口 |
|
B. |
List接口中存放的元素具有有序,不唯一的特點 |
|
C. |
Set接口中存放的元素具有無序,不唯一的特點 |
|
D. |
Map接口存放的是映射信息,每個元素都是一個鍵值對 |
2. |
如下Java代碼,輸出的運行結果是( A )。(選擇一項) |
|
|
public class Test { public static void main(String[ ] args) { List<String> list=new list.add("str1"); list.add(2, "str2"); String s=list.get(1); System.out.println(s); } 下標越界異常 } |
|
|
|
|
|
A |
運行時出現異常 |
|
B. |
正確運行,輸出str1 |
|
C. |
正確運行,輸出str2 |
|
D. |
編譯時出現異常 |
3. |
以下Java代碼的作用是首先將一個數組的內容存入集合,然後判斷集合中是否有指定的元素存在,其中共有( D )處錯誤。(選擇一項) |
|
|
import java.util.List; public class Test { public int getIndexofArray(float[] f){ int rtn=-1; float objf=3.4;1 List list=null;2 for(int i=0;i<f.size( );i++){3 list.add(f[i]); } for(int i=0;i<list.size( );i++){ float tmp=(float)list.get(i); if(objf==tmp){ rtn=i; } } return rtn; } } |
|
|
|
|
|
A |
0 |
|
B. |
1 |
|
C. |
2 |
|
D. |
3 |
4. |
分析如下Java 代碼,編譯運行後將輸出( B )。(選擇一項) |
|
|
public class Test { public Test() { } static void print(List<Integer> al) { al.add(2); al = new ArrayList<Integer>(); al.add(3); al.add(4); } public static void main(String[] args) { List<Integer> al = new ArrayList<Integer>(); al.add(1); print(al); System.out.println(al.get(1)); } } |
|
|
|
|
|
A |
1 |
|
B. |
2 |
|
C. |
3 |
|
D. |
4 |
5. |
在Java中,下列集合類型可以存儲無序、不重復的數據的是( D )。(選擇一項) |
|
|
|
|
|
A |
ArrayList |
|
B. |
LinkedList |
|
C. |
TreeSet |
|
D. |
HashSet |
6. |
以下代碼的執行結果是( C )。(選擇一項) |
|
|
Set<String> s=new HashSet<String>(); s.add("abc");1 s.add("abc");1 s.add("abcd");2 s.add("ABC");3 System.out.println(s.size()); |
|
|
|
|
|
A. |
1 |
|
B. |
2 |
|
C. |
3 |
|
D. |
4 |
7. |
給定如下Java代碼,編譯運行的結果是( C )。(選擇一項) |
|
|
public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); String s = "code"; map.put(s, "1"); map.put(s, "2"); System.out.println(map.size()); }元素的個數 } |
|
|
|
|
|
A |
編譯時發生錯誤 |
|
B. |
運行時引發異常 |
|
C. |
正確運行,輸出:1 |
|
D. |
正確運行,輸出:2 |
8. |
下面集合類中屬於非線程安全,且結構采用了哈希表的是( C )。(選擇一項) |
||
|
|
|
|
|
A. |
Vector |
|
|
B. |
ArrayList |
|
|
C. |
HashMap |
|
|
D. |
Hashtable |
|
9. |
在Java中,LinkedList類與ArrayList類同屬於集合框架類,下列( CD )選項中是LinkedList類有而ArrayList類沒有的方法。(選擇兩項) |
||
|
|
|
|
|
A |
add(Object o) |
|
|
B. |
add(int index,Object o) |
|
|
C. |
getFirst() |
|
|
D. |
removeLast() |
三、 判斷題
- 數組和集合中的元素可以是任何數據類型,包括基本類型和引用類型。( ? )
- Java集合中的Set接口和List接口都是從Collection接口派生出來的。( ? )
- Collection 接口存儲一組不唯一,有序的對象,它有兩個子接口:List和Set。( ? )無序
- Collection是Java集合頂級接口,其中的元素無序,唯一。Java平臺不提供這個接口任何直接的實現。( ? )不唯一
- List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引來訪問List中的無素,這類似於Java的數組。( ? )
- HashSet采用哈希表存儲結構,特點是查詢速度快,但是其中元素無序排列。( ? )
- LinkedHashMap是一種有序的HashMap,查詢速度快,便於添加刪除操作。( ? )
- 基本數據類型的值可以被直接存儲在Vector對象中。( ? )
- Dictionary建立了關鍵字和值的映射,只要提供一個關鍵字,Dictionary就會返回一個相應的值。( ? )
- 泛型是JavaSE1.7的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。Java語言引入泛型的好處是安全簡單。( ? )
- Collection是專門操作集合的工具類,提供一系列靜態方法實現對各種集合操作。( ? )
- Iterator接口可以遍歷任何Collection接口的實現類,可以從一個Collection中使用iterator( )方法來獲取叠代器實例。叠代器取代了Java集合框架中的Enumeration。( ? )
四、 簡答題 (首先熟練掌握筆記上 與集合相關的面試簡答題)
- 熟練掌握Collection集合和Map集合的體系圖
- 簡述List、Set、Collection、Map的特點和區別及什麽時候使用該集合。
Collection是Java集合頂級接口,存儲一組不唯一,無序的對象;
Map集合是存儲鍵值對的集合,特點:key 唯一 value 允許重復
List接口和Set接口是Collections接口有兩個子接口;
List 接口存儲一組不唯一,有序的對象;
Set 接口存儲一組唯一,無序的對象;
- Vector和ArrayList的區別和聯系。
實現原理相同,功能相同,都是長度可變的數組結構,很多情況下可以互用
兩者的主要區別如下
Vector是早期JDK接口,ArrayList是替代Vector的新接口
Vector線程安全,效率低下;ArrayList重速度輕安全,線程非安全
- 請你簡述HashMap和Hashtable的區別?
實現原理相同,功能相同,底層都是哈希表結構,查詢速度快,在很多情況下可以互用
兩者的主要區別如下
Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口
Hashtable繼承Dictionary類,HashMap實現Map接口
Hashtable線程安全,HashMap線程非安全
Hashtable不允許null值,HashMap允許null值
五、 編碼題 (首先熟練掌握筆記上 與集合相關的需求小案例)
- 使用List和Map存放多個圖書信息,遍歷並輸出。其中商品屬性:編號,名稱,單價,出版社;使用商品編號作為Map中的key。
package test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; public class Books { String id; // 編號 String name; // 名稱 double price; // 價格 String press; // 出版社 // 全參構造方法 public Books(String id, String name, double price, String press) { super(); this.id = id; this.name = name; this.price = price; this.press = press; } // 重寫toString() @Override public String toString() { return "Books [id=" + id + ", name=" + name + ", price=" + price + ", press=" + press + "]"; } public static void main(String[] args) { // new5個圖書對象 Books b1 = new Books("001", "第1本書", 55.8, "第1出版社"); Books b2 = new Books("002", "第2本書", 49.9, "第2出版社"); Books b3 = new Books("003", "第3本書", 55.0, "第3出版社"); Books b4 = new Books("004", "第4本書", 48.5, "第4出版社"); Books b5 = new Books("005", "第5本書", 55.8, "第5出版社"); Books b6 = new Books("006", "第6本書", 53.6, "第6出版社"); // new一個List對象 List<Books> l = new ArrayList<Books>(); // 添加圖書對象到l l.add(b1); l.add(b2); l.add(b3); l.add(b4); l.add(b5); l.add(b6); // 遍歷輸出 for (Books s : l) { System.out.println(s); } System.out.println("======================================================"); // new一個HashMap對象 HashMap<String, Books> hm = new HashMap<String, Books>(); // 以編號做為key添加圖書對象到hm hm.put(b1.id, b1); hm.put(b2.id, b2); hm.put(b3.id, b3); hm.put(b4.id, b4); hm.put(b5.id, b5); hm.put(b6.id, b6); // 獲得所有key Set<String> ss = hm.keySet(); // 遍歷輸出 for (String s : ss) { System.out.println(hm.get(s)); } } }
- 使用HashSet和TreeSet存儲多個商品信息,遍歷並輸出;其中商品屬性:編號,名稱,單價,出版社;要求向其中添加多個相同的商品,驗證集合中元素的唯一性。
提示:向HashSet中添加自定義類的對象信息,需要重寫hashCode和equals( )
向TreeSet中添加自定義類的對象信息,需要實現Comparable接口,指定比較規則
package test; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; import bean.TestSet; public class TestSett { public static void main(String[] args) { TestSet b1 = new TestSet(1994, "b1", 15.5, "wty"); TestSet b1 = new TestSet(1994, "b1", 30, "wty"); TestSet b2 = new TestSet(1994, "b2", 50, "wty"); TestSet b3 = new TestSet(1993, "b3", 15.5, "wty"); TestSet b4 = new TestSet(1992, "b4", 15.5, "wty"); TestSet b5 = new TestSet(1991, "b5", 50, "wty1"); //使用HashSet存儲圖書並遍歷 Set<TestSet> hashSet = new HashSet<TestSet>(); hashSet.add(b1); hashSet.add(b1); hashSet.add(b2); hashSet.add(b3); hashSet.add(b4); hashSet.add(b5); hashSet.add(b1_1); System.out.println("遍歷輸出hashset"); System.out.println(hashSet.size()); for(TestSet book:hashSet){ System.out.println(book.toString()); } //使用TreeSet存儲圖書並遍歷 Set<TestSet> treeSet = new TreeSet<TestSet>(); treeSet.add(b1); treeSet.add(b1); treeSet.add(b2); treeSet.add(b3); treeSet.add(b4); treeSet.add(b5); treeSet.add(b1_1); System.out.println("遍歷輸出treeset"); System.out.println(treeSet.size()); for(TestSet book:treeSet){ System.out.println(book.toString()); } } } package bean; public class TestSet implements Comparable<TestSet> { public int id; public String name; public double price; public String press; public TestSet() { super(); } public TestSet(int id, String name, double price, String press) { super(); this.id = id; this.name = name; this.price = price; this.press = press; } public int compareTo(TestSet o) { return this.id-o.id; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((press == null) ? 0 : press.hashCode()); long temp; temp = Double.doubleToLongBits(price); result = prime * result + (int) (temp ^ (temp >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TestSet other = (TestSet) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (press == null) { if (other.press != null) return false; } else if (!press.equals(other.press)) return false; if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price)) return false; return true; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", press=" + press+ ", price=" + price + "]"; } }
- 實現List和Map數據的轉換。具體要求如下:
功能1:定義方法public void listToMap( ){ }將List中Student元素封裝到Map中
1) 使用構造方法Student(int id,String name,int age,String sex )創建多個學生信息並加入List
2) 遍歷List,輸出每個Student信息
3) 將List中數據放入Map,使用Student的id屬性作為key,使用Student對象信息作為value
4) 遍歷Map,輸出每個Entry的key和value
功能2:定義方法public void mapToList( ){ }將Map中Student映射信息封裝到List
1) 創建實體類StudentEntry,可以存儲Map中每個Entry的信息
2) 使用構造方法Student(int id,String name,int age,String sex )創建多個學生信息,並使用Student的id屬性作為key,存入Map
3) 創建List對象,每個元素類型是StudentEntry
4) 將Map中每個Entry信息放入List對象
六、 可選題
- 假如有以下email數據“[email protected],[email protected],[email protected],..”現需要把email中的用戶部分和郵件地址部分分離,分離後以鍵值對應的方式放入HashMap?
package test; import java.util.HashMap; import java.util.Map; public class Email { public static void main(String[] args) { String str = "[email protected],[email protected],[email protected]"; System.out.println(str); //得到每一個email String strs[] = str.split(","); //存放分離後email的信息 Map<String,String> emailMap = new HashMap<String, String>(); for(String email:strs){ String temp[] = email.split("@"); //分割email存入map emailMap.put(temp[0], temp[1]); } System.out.println(emailMap.toString()); } }
- 由控制臺按照固定格式輸入學生信息,包括學號,姓名,年齡信息,當輸入的內容為exit退出;將輸入的學生信息分別封裝到一個Student對象中,再將每個Student對象加入到一個集合中,要求集合中的元素按照年齡大小正序排序;最後遍歷集合,將集合中學生信息寫入到記事本,每個學生數據占單獨一行。
推薦步驟:
a) 創建Student類,並指定按照年齡正序排列
b) 通過控制臺輸入多個不同Student信息。格式規定為:編號#姓名#年齡
c) 取出字符串中相應信息放入Student對象,並將Student加入到集合中
d) 遍歷集合的過程中將學生的信息輸入到記事本
難點:
e) 如何指定學生按照年齡正序排列
f) 如果從字符串“編號#姓名#年齡”中提取學生信息
g) 放入哪種集合後可以保證學生按照年齡大小正序排列
h) 如何將集合中學生信息寫入記事本,每個學生數據占單獨一行
7.27作業