java集合就像一個容器,這些對象能夠是任意的數據類型,且長度可變。集合按照其存儲結構能夠分爲兩大類,即單列集合Collection,和雙列集合Map。
這兩種集合特色以下:
(1)Collection:單列集合接口,用於存儲一系列元素。
Collection集合有兩個重要的子接口,分別是List和Set。其中List集合的特色是元素有序,可重複;Set集合的特色是元素無序而且不可重複。List接口的主要實現類有ArrayList和ListedList;Set接口的主要實現類有HashSet和TreeSet。
(2)Map:雙列集合的根接口,用於存儲具備鍵(Key),值(Value)映射關係的元素。
Map集合中每一個元素都包含一對鍵值,而且Key是惟一的,在使用Map集合時能夠經過指的Key找到對應的Value。Map接口的主要實現類有HashMap和TreeMap。java
List接口繼承於Collection接口,在List集合中容許出現重複的元素,在程序中能夠經過索引來訪問集合中的指定元素,另外List集合還有一個特色就是存取有序。面試
ArrayList內部封裝了一個長度可變的數組對象(初始容量爲8,按1.5倍擴容),在ArrayList中進行增刪改查效率會比較低,可是在遍歷和查找元素時顯得很是高效。
LinkedList集合
爲了克服ArrayList增刪效率低的問題,能夠用LinkedList,該集合內有一個雙向循環鏈表,增刪效率較高。數組
Iterator對象被稱爲迭代器,用來訪問Collection中的元素。在使用迭代器對集合元素迭代是,若是調用了remove的方法去刪除元素,,會出現異常。緣由是集合中刪除元素會致使迭代器語氣的迭代次數發生改變,致使迭代器的結果不許確。架構
public class Test1 { public static void main(String[] args) { // 建立ArrayList對象 ArrayList list = new ArrayList(); // 添加元素 list.add("data_1"); list.add("data_2"); list.add("data_3"); Iterator iterator = list.iterator(); while (iterator.hasNext()){ //hasNext()判斷集合中是否存在下一個元素 Object object = iterator.next(); //若是存在,則調用next()將其取出,不然說明已經到達了集合末尾,中止遍歷 System.out.println(object); } } } //輸出結果爲 data_1 data_2 data_3
foreach是一種簡介的for循環,也被稱爲加強for循環。foreach循環用於遍歷數組或集合中的元素,具體語法格式以下ide
for( 容器中的元素類型 臨時變量 : 容器變量 ){ //執行語句 } public class Test1 { public static void main(String[] args) { // 建立ArrayList對象 ArrayList list = new ArrayList(); // 添加元素 list.add("data_1"); list.add("data_2"); list.add("data_3"); for (Object object : list) { System.out.println(object); } } }
foreach也存在侷限性,當時用foreach循環時,不能對集合中元素進行修改。性能
在JDK8中,根據Lambda表達式的特性還增長了一個forEach方法來遍歷集合,演示以下學習
public class Test1 { public static void main(String[] args) { // 建立ArrayList對象 ArrayList list = new ArrayList(); // 添加元素 list.add("data_1"); list.add("data_2"); list.add("data_3"); list.forEach(obj-> System.out.println("迭代器集合元素"+obj)); } } //輸出結果爲 迭代器集合元素data_1 迭代器集合元素data_2 迭代器集合元素data_3
Set接口中的元素無序,而且保證存入的元素不會重複。Set接口主要有兩個實現類,分別是HashSet和TreeSet,其中HashSet是根據對象的哈希值來肯定元素集合中的存儲位置,所以具備良好的存取和查找性能。TreeSet則以二叉樹的方式來存儲元素,它能夠實現對集合中的元素排序。this
HashSet是set接口的一個實現類,它所存儲的元素是不可重複的,而且元素都是無序的。當想HashSet集合中添加元素時,首先會調用hashcode方法來肯定元素的存儲位置,而後再調用元素對象的equals()方法來確保該位置沒有重複元素。編碼
public class Test1 { public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add("Jack"); hashSet.add("Rose"); hashSet.add("Eve"); hashSet.add("Rose"); hashSet.forEach(obj-> System.out.println(obj)); } } //輸出結果爲 Eve Rose Jack
向集合中存入元素時,爲了保證HashSet正常工做,要求在存入對象是,須要重寫Object類中的hashCode()和equals()方法。上個例子將字符串存入HashSet時,String類已經默認重寫了hashCode的方法,可是有時候傳入自定義類型的對象存入HashSet,須要重寫方法。spa
package Demo01; import java.util.ArrayList; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add(new Student("2","zhang")); hashSet.add(new Student("8","name")); hashSet.add(new Student("4","jack")); hashSet.add(new Student("6","row")); hashSet.forEach(); } } class Student{ String id; String name; public Student(String id, String name) { this.id = id; this.name = name; } @Override public String toString(){ return id+" "+name; } @Override public int hashCode(){ return id.hashCode(); } @Override public boolean equals(Object object){ if(this == object){ //判斷是不是同一個對象 return true; //若是是,返回true } if(!(object instanceof Student)){ //判斷對象是爲Student類型 return false; //若是不是,返回false } Student student = (Student) object; //將對象強轉爲Student類型 boolean b = this.id.equals(student.id); //判斷id值是否相同 return b; //返回判斷結果 } } //輸出結果爲 [2 zhang, 4 jack, 6 row, 8 name]
TreeSet採用平衡二叉樹來存儲元素,這樣的結構能夠保證TreeSet集合中沒有重複的元素,且能夠排序。集合中的元素在進行比較時,都會調用compareTo()方法,該方法是Comparable定義的。在向TreeSet傳入自定義數據時,沒有實現Comparable接口。爲了解決這個問題java提供了兩種方法分別爲天然排序和定製排序。
//天然排序 package Demo01; import java.util.ArrayList; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { TreeSet treeSet = new TreeSet(); treeSet.add(new Teacher("jack",18)); treeSet.add(new Teacher("rose",19)); treeSet.add(new Teacher("tom",19)); treeSet.add(new Teacher("rose",19)); System.out.println(treeSet); } } // 定義Teacher類實現Comparable接口 class Teacher implements Comparable{ String name; int age; public Teacher(String name, int age) { this.name = name; this.age = age; } @Override public String toString(){ return name +":"+age; } // 重寫Comparable接口的compareTo()的方法 @Override public int compareTo(Object obj){ Teacher teacher = (Teacher) obj; // 定義比較方式,先比較年齡,再比較名稱name if(this.age- teacher.age>0){ return 1; } if(this.age- teacher.age==0){ return this.name.compareTo(teacher.name); } return -1; } } //輸出結果爲 [jack:18, rose:19, tom:19]
Teacher類實現了Comparable接口,並重寫compareTo()方法。在compareTo()方法中,首先針對age值進行修改,根據比較結果返回-1和1,當age相同時,再對name進行比較。教師Teacher對象首先按照年齡升序排序,年齡相同時會按照姓名進行升序排序,而且TreeSet集合會將重複的元素去掉。
//定製排序 package Demo01; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { // 1.建立集合時,傳入Comparator接口實現定製排序規則 TreeSet treeSet = new TreeSet(new MyComparator()); treeSet.add("jack"); treeSet.add("hello"); treeSet.add("tom"); System.out.println(treeSet); // 2.建立集合時,使用Lambda表達式定製排序規則 TreeSet treeSet1 = new TreeSet((obj1,obj2)->{ String s1 = (String) obj1; String s2 = (String) obj2; return s1.length() - s2.length(); }); treeSet1.add("jack"); treeSet1.add("tom"); treeSet1.add("hello"); System.out.println(treeSet1); } } class MyComparator implements Comparator{ @Override public int compare(Object obj1, Object obj2){ //定製排序方式 String str1 = (String) obj1; String str2 = (String) obj2; int temp = str1.length()-str2.length(); return temp; } }
Map接口是一個雙列集合,它的每一個元素都包含一個鍵對象Key和值對象Value,鍵和值對象之間存在一種對應關係,稱爲映射。Map中key和value能夠是任意數據類型,而且鍵對象Key不容許重複,在訪問Map集合中的元素時,只要指定了Key,就能找到對應的Value。
HashMap集合時Map接口的一個實現類,它用於存儲鍵值映射關係,該集合的鍵和值容許爲空,但鍵不能重複,且集合中的元素是無序的。
使用Iterator遍歷集合須要先將Map集合轉換爲Iterator接口對象,而後進行遍歷。因爲Map集合中元素是有鍵值對構成的,因此使用Iterator遍歷,有兩種方法,即keySet()和entrySet()
keySet()方法須要將Map集合中全部的鍵對象轉換爲Set單列集合,接着將含鍵對象的Set集合轉換爲Iterator接口對象,而後遍歷Map集合中全部的鍵,再根據鍵獲取相應的值。
//該方法是keySet()方法 import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); Set keySet = map.keySet();//獲取鍵的集合 Iterator iterator = keySet.iterator();//迭代鍵的集合 while (iterator.hasNext()) { Object key = map.keySet(); Object value = map.get(key);//獲取每一個鍵所對應的值 System.out.println(key + ":" + value); } } }
entrySet()方法將原有的Map集合中的鍵值對做爲一個總體返回Set集合,接着將包含鍵值對對象的Set集合轉換爲Iterator接口對象,而後獲取集合中的全部鍵值對映射關係,在從映射關係中取出鍵和值。
//該方法是entrySet()方法 package Demo01; import java.util.*; /** * @author Dell */ public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); Set entrySet = map.entrySet(); Iterator iterator = entrySet.iterator();//獲取Iterator對象 while (iterator.hasNext()){ Map.Entry entry = (Map.Entry)(iterator.next());//獲取集合中鍵值對映射關係 Object key = entry.getKey();//獲取Entry中的鍵 Object value = entry.getValue();//獲取Entry中的值 System.out.println(key + ":" + value); } } }
public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); map.forEach((key, value) -> System.out.println(key + ":" + value)); } }
在map集合中還提供了一個values()的方法,經過這個方法,能夠直接獲取Map中存儲全部值的Collection集合
public class Test1 { public static void main(String[] args) { Map map = new HashMap(); map.put("3", "Jack"); map.put("1", "Rock"); map.put("2", "Tom"); Collection values = map.values();//獲取map集合中values值集合對象 values.forEach(v-> System.out.println(v)); } }
建立LinkedHashMap集合,可保證存取順序一致。
Properties集合是HashTable的子類,Properties主要用來存儲字符串類型的鍵和值。
在文件目錄中添加配置文件 文件名爲test.properties
下面來展現如何對properties配置文件進行讀取和寫入操做
Background = black name = zhang age = 19
package Demo01; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public class Test1 { public static void main(String[] args) throws Exception { // 1.經過properties進行屬性文件讀取操做 Properties pps = new Properties(); // 加載要讀取的文件test.properties pps.load(new FileInputStream("test.properties")); // 遍歷test.properties鍵值對元素信息 pps.forEach((k,v)-> System.out.println(k +":"+ v)); // 2.經過properties進行屬性文件寫入操做 // 指定要寫入操做的文件名稱和位置 FileOutputStream out = new FileOutputStream("test.properties"); // 向properties類文件進行希爾鍵值對信息 pps.setProperty("charset","UTF-8"); // 將此properties集合中新增的鍵值對信息寫入配置文件中 pps.store(out,"新增charset編碼"); } } //第一次輸出結果爲 background:black name:zhang age:19 //第二次輸出結果爲 charset:UTF-8 background:black name:zhang age:19
在文章的最後做者爲你們整理了不少資料!包括java核心知識點+全套架構師學習資料和視頻+一線大廠面試寶典+面試簡歷模板+阿里美團網易騰訊小米愛奇藝快手嗶哩嗶哩面試題+Spring源碼合集+Java架構實戰電子書等等!有須要的朋友關注公衆號:前程有光,自行下載便可!