1. 程式人生 > >JAVA集合的區別,常用的方法、遍歷、迭代器、泛型

JAVA集合的區別,常用的方法、遍歷、迭代器、泛型

這兩天又把集合複習了一遍,這裡做一個總結。 常用的集合型別有,List Set Map list和set表面最簡單的區別是: list有序集合,有索引,可以出現重複的元素 set 無序集合,無索引,不能出現重複的元素 集合泛型:  List<String> list3 = new ArrayList<>(); 上面這個程式碼中 <String>就是泛型。泛型可以確定資料的型別,不至於在程式後面出現各種型別的錯誤。 說明: java中泛型是一個偽泛型,只是在編譯的時候存在,編譯後的class檔案沒有泛型,這麼做是為了保證程式的安全。 迭代器:
				//建立三種集合
				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是連結串列,查詢元素的時候需要指標慢慢移動,而陣列有索引,相對會更快)
 3)但是在實際操作中一般是查詢會更多一點所以建議用ArrayList,當然還是以實際情況決定。
//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來遍歷,可以減少程式碼量