java集合總結
一:Java集合產生的原因
一方面,面向對 象語言對事物的體現 都是以物件的形式,為了方便對多 個物件的操作,就要對物件進行儲存。 另-方面,使用Array儲存對 象方面具有一些弊端,大小不能動態改變,而Java 集合就像一 種容器,可以動態地把多 個物件的引用放入容器中。所以,Java集合類可以用於儲存數量不等的多個物件,還可用於儲存具有對映關係的關聯陣列。
二:集合架構體系圖
●Java集合可分為Collection和Map兩種體系
➢Collection介面:
➢Set:元素無序、不可重複的集合--類似高中的"集合”
➢List:元素有序,可重複的集合--”動態”陣列
➢Map介面:具有對映關係“key-value對” 的集合--類似於高中的“函式”y=f(x) (x1,y1) (x2,y2)
三:Collection介面
●Collection介面是List、Set 和Queue介面的父介面,該接口裡定義的方法既可用於操作Set集合,也可用於操作List和Queue集合。
3.1:List介面
Java中陣列用來儲存資料的侷限性,List集合類中元素有序、且可重複,集合中的每個元素都有其對應的順序索引。List容器中的元素都對應一個整數型的序號記載其在容器中的位置,
可以根據序號存取容器中的元素。JDK API中List介面的實現類常用的有: ArrayList、 LinkedList和Vector。
1 package Set; 2 importorg.junit.Test; 3 4 import java.util.*; 5 6 /* 7 * 1.儲存物件可以考慮:①陣列 ②集合 8 * 2.陣列儲存物件的特點:Student[] stu = new Student[20]; stu[0] = new Student();.... 9 * >弊端:①一旦建立,其長度不可變。②真實的陣列存放的物件的個數是不可知。 10 * 3.集合 11 * Collection介面 12 * |------List介面:儲存有序的,可以重複的元素 13 * |------ArrayList(主要的實現類)、LinkedList(對於頻繁的插入、刪除操作)、Vector(古老的實現類、執行緒安全的)14 * |------Set介面:儲存無序的,不可重複的元素 15 * |------HashSet、LinkedHashSet、TreeSet 16 * Map介面:儲存“鍵-值”對的資料 17 * |-----HashMap、LinkedHashMap、TreeMap、Hashtable(子類:Properties) 18 */ 19 public class CollectionTest { 20 @Test 21 public void testCollection1() { 22 //size()方法判斷集合的大小,add(Object obj)用來向集合新增元素,addAll(Collection coll),將一個集合中的所有元素新增到另一個集合裡面 23 // isEmpty()用來判斷集合是否為空,clear()用來清空集合裡的元素,contains用來判斷集合是否包含指定的obj元素,對於自定義類物件要重寫equals作為判斷的依據 24 //containsAll(Collection coll):判斷當前集合中是否包含coll中所有的元素,retainAll(Collection coll):求當前集合與coll的共有的元素,返回給當前集合 25 //equals判斷兩個集合中元素是否相同,toArray()變成陣列,Arrays.toList()陣列變成集合,集合可以通過.iterator()來進行遍歷元素,包含next和hasnext方法,也可以增強for迴圈 26 Collection coll = new ArrayList(); 27 coll.add(1); 28 coll.add("hello"); 29 coll.add(new Person("nihao",12));//新增元素 30 System.out.println(coll.size());//判斷大小, 31 coll.add(1); 32 System.out.println(coll.size());//重複的元素可以新增 33 ArrayList arrayList = new ArrayList(); 34 arrayList.add(10); 35 coll.addAll(arrayList);//新增一個集合 36 System.out.println(coll.isEmpty());//判斷是否為空 37 boolean b = (boolean) arrayList.remove(Integer.valueOf(10));//刪除元素10,注意數字是表示按照下標進行刪除,包裝類則是安裝元素進行刪除 38 System.out.println(b); 39 System.out.println(arrayList.isEmpty());//現在為空 40 //coll.clear();//清空元素, 41 //System.out.println(coll); 42 System.out.println(coll.contains(Integer.valueOf(1)));//包含一個元素 43 arrayList.add(1); 44 System.out.println(coll.containsAll(arrayList));//包含一個集合 45 System.out.println(coll.retainAll(arrayList));//求交集 46 System.out.println(coll.equals(arrayList));//判斷兩個集合是否相同 47 System.out.println(arrayList.hashCode());//集合的hashcode值 48 arrayList.add(2); 49 System.out.println(arrayList.hashCode());//hashcode是對所有元素計算的到的。 50 Object []obj = coll.toArray();//集合變成陣列 51 for (int i = 0; i < obj.length; i++) { 52 System.out.println(obj[i]); 53 } 54 int[] a = {1,2,3}; 55 List<int[]> ints = Arrays.asList(a);//陣列變成集合 56 Iterator iterator = ints.iterator(); 57 while (iterator.hasNext()){ 58 System.out.println(iterator.next()); 59 } 60 for (Object ob:coll){ 61 System.out.println(ob); 62 } 63 } 64 //ArrayList:List的主要實現類 65 /* 66 * List中相對於Collection,新增加的方法 67 * void add(int index, Object ele):在指定的索引位置index新增元素ele 68 boolean addAll(int index, Collection eles) 69 Object get(int index):獲取指定索引的元素 70 Object remove(int index):刪除指定索引位置的元素 71 Object set(int index, Object ele):設定指定索引位置的元素為ele 72 int indexOf(Object obj):返回obj在集合中首次出現的位置。沒有的話,返回-1 73 int lastIndexOf(Object obj):返回obj在集合中最後一次出現的位置.沒有的話,返回-1 74 List subList(int fromIndex, int toIndex):返回從fromIndex到toIndex結束的左閉右開一個子list 75 76 List常用的方法:增(add(Object obj)) 刪(remove) 改(set(int index,Object obj)) 77 查(get(int index)) 插(add(int index, Object ele)) 長度(size()) 78 */ 79 @Test 80 public void testArrayList(){ 81 ArrayList ints = new ArrayList(); 82 ints.add(1); 83 ints.add("a"); 84 Collection arrayList = new ArrayList(); 85 arrayList.add("a"); 86 arrayList.add(1); 87 System.out.println(arrayList.equals(ints));//判斷相等不僅看元素,還要看順序, 88 System.out.println(arrayList.hashCode());//一般hashcode除了要看內容,還要看順序,因此若hashcode不相等,equals一般也不想等,互等價 89 System.out.println(ints.hashCode()); 90 ints.addAll(0,arrayList); 91 System.out.println(ints); 92 System.out.println(ints.get(0)); 93 System.out.println(ints.remove(0));//刪除指定位置的元素 94 System.out.println(ints.indexOf("a"));//首次出現的位置, 95 System.out.println(ints.lastIndexOf("a"));//最後一次出現的位置 96 System.out.println(ints.subList(0,2));//返回左閉右開的區間的內容 97 System.out.println(ints.set(0,"b"));//指定位置修改 98 System.out.println(ints); 99 100 } 101 102 }
3.2 set介面
1 package Set; 2 3 import org.junit.Test; 4 5 import java.util.*; 6 7 public class Set { 8 @Test 9 public void test(){//測試hashset 10 HashSet hashSet = new HashSet(); 11 hashSet.add(123); 12 hashSet.add(222); 13 hashSet.add("BB"); 14 System.out.println(hashSet);//儲存無順序,輸出也無順序。 15 work work1 = new work("ll",10); 16 work work2 = new work("ll",10); 17 hashSet.add(work1); 18 hashSet.add(work2); 19 System.out.println(work1.hashCode()); 20 System.out.println(work2.hashCode()); 21 System.out.println(hashSet);//對類物件,只有重寫hashCode方法和equals方法後,生成的物件的hash值才可以相同,才能保證set集合的無重複性 22 } 23 /* 24 * LinkedHashSet:使用連結串列維護了一個新增進集合中的順序。導致當我們遍歷LinkedHashSet集合 25 * 元素時,是按照新增進去的順序遍歷的! 26 * 27 * LinkedHashSet插入效能略低於 HashSet,但在迭代訪問 Set 裡的全部元素時有很好的效能。 28 */ 29 @Test 30 public void test2(){//測試LinkedHashSet() 31 LinkedHashSet linkedHashSet = new LinkedHashSet(); 32 linkedHashSet.add(1); 33 linkedHashSet.add(2); 34 linkedHashSet.add(null); 35 Iterator iterator1 = linkedHashSet.iterator(); 36 while (iterator1.hasNext())//因為測試LinkedHashSet在hashset的基礎上添加了連結串列,因此所有新增的元素連線起來,遍歷有序,這是主要的不同 37 { 38 System.out.println(iterator1.next()); 39 } 40 41 } 42 @Test//自然排序 43 public void test3(){//在people類裡面重寫 44 TreeSet set = new TreeSet(); 45 set.add(new work("liulei",16)); 46 set.add(new work("ww",12)); 47 set.add(new work("cc",13)); 48 for (Object str1:set){ 49 System.out.println(str1); 50 } 51 52 } 53 @Test 54 public void test4(){//因為只有相同類的兩個例項才會比較大小,所以向 TreeSet 中新增的應該是同一個類的物件 55 56 Comparator com = new Comparator() {//定製排序 57 @Override 58 public int compare(Object o1, Object o2) { 59 if(o1 instanceof work && o2 instanceof work){ 60 work c1 = (work) o1; 61 work c2 = (work) o2; 62 int i = c1.getAge().compareTo(c2.getAge());//小於負值大於正值 63 if(i==0){//相等,繼續比較 64 return c1.getName().compareTo(c2.getName()); 65 } 66 return i; 67 } 68 return 0; 69 } 70 }; 71 TreeSet set = new TreeSet(); 72 set.add(new work("liulei",16)); 73 set.add(new work("ww",12)); 74 set.add(new work("cc",13)); 75 for (Object str1:set){ 76 System.out.println(str1); 77 } 78 79 } 80 81 }
對於自然排序,people裡面實驗Comparable,重寫compareTo方法
package Set; public class Person implements Comparable{ private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Person() { super(); } public Person(String name, Integer age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } //static int init = 1000; @Override public int hashCode() {//return age.hashCode() + name.hashCode();û�����Ľ�׳�Ժá� final int prime = 31; int result = 1; result = prime * result + ((age == null) ? 0 : age.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; //return init++;//���������� } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } //����TreeSet�����Person��Ķ���ʱ�����ݴ˷�����ȷ�������ĸ��������С� @Override public int compareTo(Object o) { if(o instanceof Person){ Person p = (Person)o; //return this.name.compareTo(p.name); //return -this.age.compareTo(p.age); int i = this.age.compareTo(p.age); if(i == 0){ return this.name.compareTo(p.name); }else{ return i; } } return 0; } }View Code
自然排序
1 @Override 2 public int compareTo(Object o) { 3 if(o instanceof Person){ 4 Person p = (Person)o; 5 //return this.name.compareTo(p.name); 6 //return -this.age.compareTo(p.age); 7 int i = this.age.compareTo(p.age); 8 if(i == 0){ 9 return this.name.compareTo(p.name); 10 }else{ 11 return i; 12 } 13 } 14 return 0; 15 }
定製排序
Comparator com = new Comparator() {//定製排序 @Override public int compare(Object o1, Object o2) { if(o1 instanceof work && o2 instanceof work){ work c1 = (work) o1; work c2 = (work) o2; int i = c1.getAge().compareTo(c2.getAge());//小於負值大於正值 if(i==0){//相等,繼續比較 return c1.getName().compareTo(c2.getName()); } return i; } return 0; } };
四:Map介面
3.1 hashmap
3.2 Linkedhashmap
3.3 Treemap
3.4 Hashtable
3.5 properties
1 @Test 2 public void Test5() throws IOException { 3 Properties pros = new Properties(); 4 pros.load(new FileInputStream(new File("D:/config.txt"))); 5 String user = pros.getProperty("user"); 6 System.out.println(user); 7 }
五:Collections工具類
1 package com.atguigu.java; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.List; 7 8 import org.junit.Test; 9 10 /* 11 * 操作Collection以及Map的工具類:Collections 12 * 13 * 面試題:區分Collection與Collections 14 * 15 */ 16 public class TestCollections { 17 /* 18 * Object max(Collection):根據元素的自然順序,返回給定集合中的最大元素 19 Object max(Collection,Comparator):根據 Comparator 指定的順序,返回給定集合中的最大元素 20 Object min(Collection) 21 Object min(Collection,Comparator) 22 int frequency(Collection,Object):返回指定集合中指定元素的出現次數 23 void copy(List dest,List src):將src中的內容複製到dest中 24 boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替換 List 物件的所有舊值 25 26 */ 27 @Test 28 public void testCollections2(){ 29 List list = new ArrayList(); 30 list.add(123); 31 list.add(456); 32 list.add(12); 33 list.add(78); 34 list.add(456); 35 Object obj = Collections.max(list); 36 System.out.println(obj); 37 int count = Collections.frequency(list, 4567); 38 System.out.println(count); 39 //實現List的複製 40 //List list1 = new ArrayList();//錯誤的實現方式 41 List list1 = Arrays.asList(new Object[list.size()]); 42 Collections.copy(list1, list); 43 System.out.println(list1); 44 //通過如下的方法保證list的執行緒安全性。 45 List list2 = Collections.synchronizedList(list); 46 System.out.println(list2); 47 } 48 /* 49 * reverse(List):反轉 List 中元素的順序 50 shuffle(List):對 List 集合元素進行隨機排序 51 sort(List):根據元素的自然順序對指定 List 集合元素按升序排序 52 sort(List,Comparator):根據指定的 Comparator 產生的順序對 List 集合元素進行排序 53 swap(List,int, int):將指定 list 集合中的 i 處元素和 j 處元素進行交換 54 55 */ 56 @Test 57 public void testCollections1(){ 58 List list = new ArrayList(); 59 list.add(123); 60 list.add(456); 61 list.add(12); 62 list.add(78); 63 System.out.println(list); 64 Collections.reverse(list); 65 System.out.println(list); 66 Collections.shuffle(list); 67 System.out.println(list); 68 Collections.sort(list); 69 System.out.println(list); 70 Collections.swap(list, 0, 2); 71 System.out.println(list); 72 } 73 }