JAVA集合的區別,常用的方法、遍歷、迭代器、泛型
阿新 • • 發佈:2018-12-26
這兩天又把集合複習了一遍,這裡做一個總結。
常用的集合型別有,List Set Map
list和set表面最簡單的區別是:
list有序集合,有索引,可以出現重複的元素
set 無序集合,無索引,不能出現重複的元素
集合泛型:
List<String> list3 = new ArrayList<>();
上面這個程式碼中 <String>就是泛型。泛型可以確定資料的型別,不至於在程式後面出現各種型別的錯誤。
說明:
java中泛型是一個偽泛型,只是在編譯的時候存在,編譯後的class檔案沒有泛型,這麼做是為了保證程式的安全。
迭代器:
List: list介面常用的子介面有:ArrayList類,LinkedList類 1)ArrayList的底層是基於動態陣列,LinkedList的底層是基於連結串列來完成的。 2)基於(1)的存在,所以在使用查詢,或者get(int index)(返回此列表中指定位置上的元素。)、 set(int index,E element)(用指定的元素替代此列表中指定位置上的元素。),方法時ArrayList更有優勢, 而在新增,刪除的時候,LinkedList更好。(因為陣列大小是確定的,所以如果要在ArrayList裡面插入元素, 需要進行陣列的複製。因為LinkedList是連結串列,查詢元素的時候需要指標慢慢移動,而陣列有索引,相對會更快)
3)但是在實際操作中一般是查詢會更多一點所以建議用ArrayList,當然還是以實際情況決定。
Set: set介面常用的子介面有:Hashset類,Linkedhashset類 1)hashset由雜湊表(實際上是一個HashMap)支援。它不保證存取的順序一致,可以存null元素。 2)LinkedHashSet由雜湊表和連結列表實現,它可以按照插入的順序進行迭代(輸出)。 3)set的使用方法和list大同小異就不一一列舉了。
Map的兩種遍歷:
//建立三種集合 List<String> Array = new ArrayList<String>(); Set<String> set = new HashSet<String>(); Map<Integer, String> map = new HashMap<Integer, String>(); //建立集合的迭代器 Iterator<String> iterator = Array.iterator(); Iterator<String> iterator2 = set.iterator(); //Map不能直接迭代,先呼叫keySet()方法,獲得所有key值 放入一個set中 Set<Integer> keySet = map.keySet(); Iterator<Integer> iterator3 = keySet.iterator(); //迭代器的兩個常用方法 //如果仍有元素可以迭代,則返回 true。 iterator.hasNext(); //返回迭代的下一個元素。 String next = iterator.next();
List: list介面常用的子介面有:ArrayList類,LinkedList類 1)ArrayList的底層是基於動態陣列,LinkedList的底層是基於連結串列來完成的。 2)基於(1)的存在,所以在使用查詢,或者get(int index)(返回此列表中指定位置上的元素。)、 set(int index,E element)(用指定的元素替代此列表中指定位置上的元素。),方法時ArrayList更有優勢, 而在新增,刪除的時候,LinkedList更好。(因為陣列大小是確定的,所以如果要在ArrayList裡面插入元素, 需要進行陣列的複製。因為LinkedList是連結串列,查詢元素的時候需要指標慢慢移動,而陣列有索引,相對會更快)
//ArrayList&LinkedList的簡單的使用,和常用的方法 //介面多型的方式呼叫 List<String> Array1 = new ArrayList<String>(); List<String> Linked1 = new LinkedList<String>(); //直接new相對應的集合 ArrayList<String> Array2 = new ArrayList<String>(); LinkedList<String> Linked2 = new LinkedList<String>(); //這兩種建立集合的方法建議使用第一種,因為程式碼的擴充套件性好一些 Array1.add("aaa"); Array1.add("bbb"); Linked1.add("ccc"); Linked1.add("ddd"); System.out.println(Array1); System.out.println(Linked1); //列印結果 //[aaa, bbb] //[ccc, ddd] //常用的方法 //將指定的元素新增到此列表的尾部 Array1.add("aaa"); //將指定的元素新增到指定的位置,第一個index不能超過集合的長度 Array1.add(2, "ccc"); //移除此列表中所以的元素,但是集合還存在 //Array1.clear(); //查詢集合中是否有某個元素,引數是Object型別,有返回true,沒有返回false boolean aaa = Array1.contains("aaa"); //返回下標所對應的元素 String ccc = Array1.get(1); //判斷集合是否為空 boolean empty = Array1.isEmpty(); //刪除引數 下標的元素 返回該元素 String remove = Array1.remove(1); //刪除集合中 函式引數的元素 返回成功或失敗 boolean remove2 = Array1.remove("aa"); //返回集合的元素個數 int size = Array1.size(); //把集合轉化成陣列 Object[] array = Array1.toArray(); //因為LinkedArray是基於連結串列實現的 //所以LinkedArray會有一些對頭 和尾操作的方法,詳細見API //基於Collections介面的方法 //對集合進行排序,只能對list排序 Collections.sort(Array1); //找到集合中最大的值 String max = Collections.max(Array1); //對集合進行隨機排序 Collections.shuffle(Array1);
Set: set介面常用的子介面有:Hashset類,Linkedhashset類 1)hashset由雜湊表(實際上是一個HashMap)支援。它不保證存取的順序一致,可以存null元素。 2)LinkedHashSet由雜湊表和連結列表實現,它可以按照插入的順序進行迭代(輸出)。 3)set的使用方法和list大同小異就不一一列舉了。
Map:
這裡主要介紹一個HashMap: 1)Map裡面的val(值)可以相同,但是key(鍵)不能相同。如果用put()方法新增的時候(list和set新增是用add,而map使用put),如果鍵值相同了,那麼後面的val覆蓋了前面的val。 2)Map裡面的key和val都可以為空,但是key只能存一個null(這也和key不能重複相符合)。 3)當key是Integer型別時,按照數字(key)大小依次輸出,key值為null排在第一位。 Map常用方法: //建立一個HashMap
Map<Integer, String> map = new HashMap<Integer, String>();
//HashMap常使用的方法
//新增一個對映關係(簡單理解為向Map裡面新增一個值)
map.put(1, "aaa");
map.put(2, "bbb");
map.put(3, "ccc");
//從此對映關係裡面移除所有對映(Map依然存在)
map.clear();
//分別檢視Map裡面是否存在此鍵,或者此值的對映,返回boolean
boolean containsKey = map.containsKey(1);
boolean containsValue = map.containsValue("aaa");
//用key獲得相對應的val,引數是key型別,返回值是val型別
String string = map.get(1);
//判斷此Map中是否有 鍵-值 對映關係,返回boolean
boolean empty2 = map.isEmpty();
//通過key移除對應的對映關係,返回val
String remove3 = map.remove(1);
//返回Map中對映關係數(鍵值對的個數)
int size2 = map.size();
//返回Map中每個鍵值對雜湊值的和
int hashCode = map.hashCode();
//返回Map中所有的鍵值,裝到一個set集合裡面
Set<Integer> keySet = map.keySet();
//返回此對映所包含的對映關係的set檢視(API上的說明)
//個人理解:返回一個set,set裡面存放Entry物件,Entry裡面放的是
//相對應的key,val
Set<Entry<Integer, String>> entrySet2 = map.entrySet();
Map的兩種遍歷:
//Map兩種遍歷方法(筆者常使用的兩種)
//方法一: 使用keySet()方法 + 迭代器 iterator()
//獲取存在的所有key
Set<Integer> keySet2 = map.keySet();
//對儲存key的set進行迭代
Iterator<Integer> iterator3 = keySet2.iterator();
//使用while迴圈來遍歷
while(iterator3.hasNext()){
//取出每一個key
Integer next = iterator3.next();
//通過key來取val
String string2 = map.get(next.intValue());
System.out.println(next.intValue() +"---"+ string2);
}
//使用增強for來遍歷
for (Integer integer : keySet2) {
String string3 = map.get(integer.intValue());
System.out.println(integer.intValue() +"---"+ string3);
}
//方法二:
//獲取鍵值對的 set
Set<Entry<Integer, String>> entrySet3 = map.entrySet();
//用迭代方法取出鍵值對
Iterator<Entry<Integer, String>> iterator5 = entrySet3.iterator();
//使用while迴圈遍歷
while(iterator5.hasNext()){
//取出每一個鍵值對物件 next
Entry<Integer, String> next = iterator5.next();
System.out.println(next.getKey() +"---"+ next.getValue());
}
//使用增強for遍歷
for (Entry<Integer, String> entry : entrySet3) {
//使用增強for可以不要上面迭代去取鍵值對的方法和取出每一個鍵值對物件 next
System.out.println(entry.getKey() +"---"+ entry.getValue());
}
//通過上面來看,推薦使用增強for來遍歷,可以減少程式碼量