Collection集合習題
文章目錄
- Collection集合習題
- 練習一:集合框架概念
- 問:爲何Collection不從Cloneable和Serializable接口繼承?
- 問:Collections類是什麼?
- 問:與Java集合框架相關的有哪些最好的實踐?
- 問:Java集合框架是什麼?說出一些集合框架的優點?
- 問:集合框架中的泛型有什麼優點?
- 練習二:Collection集合統計元素出現次數
- 練習三:Collection集合數組轉集合
- 練習四:Collection集合轉數組
- 練習五:Collection集合contains()方法使用
- 練習六:Collection集合isEmpty()方法的使用
- 練習七:簡述迭代器的實現原理
- 問:Iterator是什麼?
- 問:迭代器的優點
- 練習八:Collection集合返回首次出現索引
- 2、參考資料
練習一:集合框架概念
一、請簡述集合框架。
集合框架按照其存儲結構可以分爲兩大類:Collection(一組對象)單列集合java.util.Collection和Map(一組映射關係、一組鍵值對)雙列集合java.util.Map
Collection:接口
(1)它是根接口
(2)它沒有直接的實現類,有更具體的子接口:List和Set…
(3)有一些的元素是可以重複的,有些集合的元素是不能重複,有些集合的元素是有序的,有些集合的元素是無序的
Collection是代表一種對象的集合,它是Collection系列的根接口。
它們雖然:有些可能是有序的,有些可能是無序的,有些可能可以重複的,有些不能重複的,但是它們有共同的操作規範,因此這些操作的規範就抽象爲了Collection接口。
Collection:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。其中,List的特點是元素有序、元素可重複。Set的特點是元素無序,而且不可重複。List接口的主要實現類有java.util.ArrayList和java.util.LinkedList,Set接口的主要實現類有java.util.HashSet和java.util.TreeSet。
Map概述
用來存儲鍵值對,映射關係的集合。所有的Map的key都不能重複。
鍵值對、映射關係的類型:Entry類型
Entry接口是Map接口的內部接口。所有的Map的鍵值對的類型都實現了這個接口。
HashMap中的映射關係,是有一個內部類來實現Entry的接口,JDK1.7是一個叫做Entry的內部類實現Entry接口。
JDK1.8是一個叫做Node的內部類實現Entry接口。
TreeMap中的映射關係,是有一個內部類Entry來實現Entry的接口
Map概述
用來存儲鍵值對 映射關係的集合。
問:爲何Collection不從Cloneable和Serializable接口繼承?
參考答案:
克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現相關的。因此,應該由集合類的具體實現來決定如何被克隆或者是序列化。
集合類的具體實現來決定如何被克隆或者是序列化。
問:Collections類是什麼?
參考答案:
Java.util.Collections是一個工具類僅包含靜態方法,它們操作或返回集合。它包含操作集合的多態算法,返回一個由指定集合支持的新集合和其它一些內容。這個類包含集合框架算法的方法,比如折半搜索、排序、混編和逆序等。
問:與Java集合框架相關的有哪些最好的實踐?
參考答案:
(1)根據需要選擇正確的集合類型。比如,如果指定了大小,我們會選用Array而非ArrayList。如果我們想根據插入順序遍歷一個Map,我們需要使用TreeMap。如果我們不想重複,我們應該使用Set。
指定了大小 選擇Array數組
不知道大小 動態數據ArrayList
插入順序遍歷一個Map,使用TreeMap
不想重複 使用Set
(2)一些集合類允許指定初始容量,所以如果我們能夠估計到存儲元素的數量,我們可以使用它,就避免了重新哈希或大小調整。
指定初始化容量
(3)基於接口編程,而非基於實現編程,它允許我們後來輕易地改變實現。
面向接口編程 易於擴展 容易改變
(4)總是使用類型安全的泛型,避免在運行時出現ClassCastException。
類轉換異常
使用類型安全的泛型
(5)使用JDK提供的不可變類作爲Map的key,可以避免自己實現hashCode()和equals()。
(6)儘可能使用Collections工具類,或者獲取只讀、同步或空的集合,而非編寫自己的實現。它將會提供代碼重用性,它有着更好的穩定性和可維護性。
有,就用。 代碼重用性 更好的穩定性和可維護性。
問:Java集合框架是什麼?說出一些集合框架的優點?
數據結構,容器:
用來裝對象…,等各種管理對象的容器。
容器有相同的操作標準:
(1)增
(2)刪
(3)改
(4)查
…
因爲集合的類型很多,那麼我們把它們稱爲集合框架。
參考答案:
每種編程語言中都有集合。集合框架的部分優點如下:
(1)使用核心集合類降低開發成本,而非實現我們自己的集合類。
使用核心集合類
(2)隨着使用經過嚴格測試的集合框架類,代碼質量會得到提高。
使用高質量的集合框架類 代碼質量提高
(3)通過使用JDK附帶的集合類,可以降低代碼維護成本。
使用JDK的集合類 降低代碼維護成本
(4)複用性和可操作性。
複用性 可操作性
問:集合框架中的泛型有什麼優點?
參考答案:
Java1.5引入了泛型,所有的集合接口和實現都大量地使用它。
泛型允許我們爲集合提供一個可以容納的對象類型,因此,如果你添加其它類型的任何元素,它會在編譯時報錯。這避免了在運行時出現ClassCastException,因爲你將會在編譯時得到報錯信息。泛型也使得代碼整潔,我們不需要使用顯式轉換和instanceOf操作符。它也給運行時帶來好處,因爲不會產生類型檢查的字節碼指令。
Java1.5引入了泛型 所有的集合接口和實現都大量使用它
泛型
練習二:Collection集合統計元素出現次數
一、給定以下代碼,請定義方法listTest()統計集合中指定元素出現的次數,如"a": 2,“b”: 2,“c” :1, “xxx”:0。
統計集合中指定元素出現的次數
Collection<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
System.out.println("a:"+listTest(list, "a"));
System.out.println("b:"+listTest(list, "b"));
System.out.println("c:"+listTest(list, "c"));
System.out.println("xxx:"+listTest(list, "xxx"));
統計集合中指定元素出現的次數
遍歷集合每一個元素是否等於指定元素 count++
code
public class CollectionTest01 {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
System.out.println("a:" + listTest(list, "a"));
System.out.println("b:" + listTest(list, "b"));
System.out.println("c:" + listTest(list, "c"));
System.out.println("xxx:" + listTest(list, "xxx"));
//a:2
//b:2
//c:1
//xxx:0
}
//定義方法統計集合中指定元素出現的次數
public static int listTest(Collection<String> list, String s) {
//定義計數器,初始化爲0
int count = 0;
//增強for遍歷集合
for (String string : list) {
//判斷傳入方法的字符與遍歷集合的是否一致
if (s.equals(string)) {
//如果一致,加1
count++;
}
}
return count;
}
}
練習三:Collection集合數組轉集合
一、定義一個方法,要求此方法把int數組轉成存有相同元素的集合(集合裏面的元素是Integer),並返回。()
定義個集合 遍歷數組元素add到集合中 返回打印
public class CollectionTest02 {
public static void main(String[] args) {
//定義int數組
int[] arr = {1, 2, 3, 4, 5};
ArrayList<Integer> list = listTest(arr);
System.out.println(list);//[1, 2, 3, 4, 5]
}
public static ArrayList<Integer> listTest(int[] arr) {
//定義集合
ArrayList<Integer> list = new ArrayList<Integer>();
//遍歷數組,把元素依次添加到集合當中
for (int a : arr) {
list.add(a);
}
return list;
}
}
練習四:Collection集合轉數組
定義一個集合,並把集合(集合裏面的元素是Integer)轉成存有相同元素的數組,並將結果輸出在控制檯。(可以使用Object[]數組類型接收轉換的數組)
toArray()
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
public class CollectionTest03 {
public static void main(String[] args) {
//定義集合,添加數據
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(100);
list.add(200);
list.add(300);
//Object[] toArray()轉換成一個Object數組
Object[] obj = list.toArray();
// 遍歷數組
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
//Result
//100
//200
//300
}
}
練習五:Collection集合contains()方法使用
定義一個方法listTest(ArrayList al, String s),要求使用contains()方法判斷al集合裏面是否包含s。
public class CollectionTest04 {
public static void main(String[] args) {
//定義集合,添加數據
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
System.out.println(listTest(list, "java"));
}
public static boolean listTest(ArrayList<String> al, String s) {
//判斷s是否在集合中存在,存在返回true,不存在返回false
if (al.contains(s)) {
return true;
}
return false;
}
}
練習六:Collection集合isEmpty()方法的使用
一、定義一個方法listTest(ArrayList al), 要求使用isEmpty()判斷al裏面是否有元素。
public class CollectionTest05 {
public static void main(String[] args) {
//定義集合,添加數據
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.remove(0);
System.out.println(listTest(list));//true
}
public static boolean listTest(ArrayList<String> al) {
//判斷al集合是否爲空,爲空返回true,不爲空返回false
if (al.isEmpty()) {
return true;
}
return false;
}
}
練習七:簡述迭代器的實現原理
一、請簡述迭代器的實現原理
當遍歷集合時,首先通過調用集合的iterator()方法獲得迭代器對象,然後使用hashNext()方法判斷集合中是否存在下一個元素,如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。
Iterator迭代器對象在遍歷集合時,內部採用指針的方式來跟蹤集合中的元素,在調用Iterator的next()方法之前,迭代器的索引位於第一個元素之前,不指向任何元素,當第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。
問:Iterator是什麼?
參考答案:
Iterator接口提供遍歷任何Collection的接口。我們可以從一個Collection中使用迭代器方法來獲取迭代器實例。迭代器取代了Java集合框架中的Enumeration。迭代器允許調用者在迭代過程中移除元素。
問:迭代器的優點
參考答案:
如果用的是for循環,就用集合自帶的remove(),而這樣就改變了集合的Size()循環的時候會出錯。但如果把集合放入迭代器,既iterator迭代可以遍歷並選擇集合中的每個對象而不改變集合的結構,而把集合放入迭代器,用迭代器的remove()就不會出現問題
練習八:Collection集合返回首次出現索引
一、定義一個方法listTest(ArrayList al, Integer s),要求返回s在al裏面第一次出現的索引,如果s沒出現過返回-1。
public class CollectionTest06 {
public static void main(String[] args) {
//定義集合,添加數據
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(listTest(list, 5));//4
}
public static int listTest(ArrayList<Integer> al, Integer s) {
//遍歷集合,獲取元素,判斷元素是否與s相等,相等返回索引
for (int i = 0; i < al.size(); i++) {
if (al.get(i).equals(s)) {
return i;
}
}
return -1;
}
}
2、參考資料
記錄
記錄 - 搞定Java核心技術
高薪之路–Java面試題精選集
【Java】Java->JavaWeb->Spring全家桶->社區、教育、電商項目等等
從Hello到goodbye