Java集合類的詳解與應用 集合簡介: 1.定義:可以同時存儲不同類型的數據 他的存儲空間會隨著數據的增大而增大 2.缺點:只能存儲引用數據類型 3.優點:更加合理的利用空間,封裝了更多的方法,用起來更加方便 4.分類:集合分為:Collection(介面): List介面:ArrayList類,L ...
Java集合類的詳解與應用
集合簡介:
1.定義:可以同時存儲不同類型的數據
他的存儲空間會隨著數據的增大而增大
2.缺點:只能存儲引用數據類型
3.優點:更加合理的利用空間,封裝了更多的方法,用起來更加方便
4.分類:集合分為:Collection(介面):
List介面:ArrayList類,LinkedList類,Vector類
Set介面:HashSet類,TreeSet類
Map介面:
HashMap類
TreeMap類
(相比較數組的概念: 數組:可以存儲不同類型的數據 可以存儲簡單數據類型和引用數據類型 缺點:創建的數組長度是一個定值,只能存儲固定長度的數據)
5.詳細方法和註意項:
Collection是一個介面,所以無法實例化,
即Collection只能類似於Collection collection = new ArrayList();創建對象
1)List:存儲是有序的(即存儲的順序,不是排序),存儲的元素可以重覆
ArrayList:底層結構是數組,線程是不安全的,添加刪除慢(因為是數組的結構),查找快
LinkedList:底層結構是鏈表,線程是不安全的,添加刪除快(因為是鏈表的結構),查找慢
Vector:底層結構是數組,線程是安全的,添加刪除慢,查找快,(同ArrayList)
Collection的方法:
//方法
Collection collection=new ArrayList(); collection.add("java2"); collection.addAll(); collection.remove(); collection.removeAll();
collection.clear();
collection.size();
System.out.println(collection.contains("java1"));// false
System.out.println(collection.containsAll(collection1));// false
System.out.println(collection.isEmpty());// false
System.out.println(collection.equals(collection));// true
Object[]arr=collection.toArray();// 集合變數組:希望將集合的長度固定下來
// 獲取:
// Iterator<E> iterator() //獲取集合中的對象(迭代器)
// int size() //獲取集合中對象的個數
//hasNext()判斷當前位置是否有元素,如果有返回true沒有返回false
//next()將當前位置的元素取出,並且讓指針指向下一個位置
//程式給每一個集合都準備了一個屬於自己的迭代器對象,我們獲取對象的方法是調用集合的一個方法
Iterator iterator=collection.iterator();
while(iterator.hasNext()) {
Object obj=iterator.next();
System.out.println(obj+" iterator");
}
//註意:
//1.再次遍歷會報錯因為指針在上次遍歷時在最後位置,如果需要重新遍歷需要將指針移到最開始的位置,所以需要重新獲取迭代器的對象Iterator iterator=collection.iterator();
//2.集合中可以存放不同類型的元素 collection.add(new Integer(22));
//容錯處理:當集合中存儲了不同類型的元素,需要進行容錯處理
Iterator iterator2=collection.iterator();
while (iterator2.hasNext()) {
Object object = iterator2.next();
// System.out.println(object+" iterator");
//容錯處理:過濾掉integer類型的22
if(object instanceof String) {
//向下轉型
String string =(String)object;
System.out.println(string+" S");
}
}
//獲取當前元素個數
System.out.println(collection.size());//4
}
LinkedList的特有方法
// LindedList // 特有的方法: // // addFirst()//始終在首位添加 // addLast()//始終在末尾添加 // // getFirst()//獲取的對象不存在會發生異常 // getLast() // // removeFirst()//刪除的對象不存在會發生異常 // removeLast() // // 從jdk1.6開始出現以下方法 // offerFirst() // offerLast() // // peekFirst()//獲取的對象不存在會返回null // peekLast() // // pollFirst()//刪除的對象不存在會返回null // pollLast()
2)Set:沒有順序,不可以重覆
HashSet:底層是哈希表,線程是不安全的
TreeSet:底層是樹,線程是不安全的
HashSet重寫hashCode()和equals()方法
* HashSet實現元素不重覆的過程: * 使用的是元素內部的HashCode()和equals(),首先調用HashCode()方法比較兩個對象的哈希值, * 如果哈希值不相等,認為是兩個對象,就不會再去調用equals()方法了,如果相等再去調用equals()方法,如果返回true,就認為是一個對象,否則認為是兩個對象 HashSet set=new HashSet<>(); //在String內部重寫了Hashcode()和equals()方法,通過對這兩個方法的調用,實現了去重 set.add("java1");//add方法內部實現了去重,預設調用了String里的Hashcode()和equals()方法實現的元素的去重 set.add("java2"); set.add("java3"); set.add("java4"); set.add("java4"); System.out.println(set);//重寫了toString HashSet set1=new HashSet<>(); set1.add(new Person("bb1",11)); set1.add(new Person("bb2",11)); set1.add(new Person("bb3",11)); set1.add(new Person("bb4",11)); set1.add(new Person("bb4",11)); set1.add(new Person("bb5",11)); System.out.println(set1); class Person{ String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { // TODO Auto-generated method stub return name.hashCode()+age*999; } @Override public boolean equals(Object obj) { if(!(obj instanceof Person)) {//容錯處理 throw new RuntimeException(); } Person person=(Person)obj;//向下轉型 return age==person.age && name.equals(person.name); } }
//結果是
[java4, java3, java2, java1] [Person [name=bb4, age=11], Person [name=bb3, age=11], Person [name=bb5, age=11], Person [name=bb2, age=11], Person [name=bb1, age=11]]
分析:1.Set本身有去重功能是因為String內部重寫了hashCode()和equals()方法,在add里實現了去重
而我們模仿這個功能,自己重寫hashCode()和equals()方法對 add(new Person("bb5",11))這種進行去重
2.在列印set時,內部重寫了toString()與後來我們重寫的toString無關,後來重寫的toString是為了列印後
面的帶對象的添加。
TreeSet
1) Comparable 介面里的 compareTo方法
@Override @Override public int compareTo(Object o) { if(!(o instanceof P)) { throw new ClassCastException(); } P p=(P)o; //例如先比較年齡,再比較姓名 int num = age - p.age; return num==0?name.compareTo(p.name):num; }
public class Test1 { public static void main(String[] args) { TreeSet set=new TreeSet<>(); //TreeSet在存儲字元串的時候可以實現自動的排序去重 //原因:作為元素的字元串實現了Comparable介面的comparaTo(Object obj)方法 //compareTo()實現的是排序和去重 //add方法內部調用了字元串的CompareTo()方法 //預設是字典排序升序排序 set.add("java1"); set.add("java2"); set.add("java4"); set.add("java4"); set.add("java0"); System.out.println(set); TreeSet set1=new TreeSet(); set1.add(new P("bb1",11)); set1.add(new P("bb2",12)); set1.add(new P("bb3",13)); set1.add(new P("bb4",14)); set1.add(new P("bb4",14)); set1.add(new P("bb5",11)); System.out.println(set1); } } class P implements Comparable{//實現Comparable介面 String name; int age; public P(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "P [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Object o) { if(!(o instanceof P)) { throw new ClassCastException(); } P p=(P)o; //例如先比較年齡,再比較姓名 int num = age - p.age; return num==0?name.compareTo(p.name):num; } }
//結果是 [java0, java1, java2, java4] [P [name=bb1, age=11], P [name=bb5, age=11], P [name=bb2, age=12], P [name=bb3, age=13], P [name=bb4, age=14]]
2)實現了Comparator介面的類,介面中有比較的方法叫compare(Object obj1,Object obj2)
ublic class Test3 { public static void main(String[] args) { // 2)創建比較器對象 CompareWitnLength compareWitnLength = new CompareWitnLength(); // 3)將比較器對象傳給TreeSet TreeSet set = new TreeSet(compareWitnLength); // 當預設排序和人工排序同時作用於一個類的時候,人工排序優先順序高於預設的 set.add("java1"); set.add("java2"); set.add("java4"); set.add("java4"); set.add("java0"); System.out.println(set); // 按照字元串的長短排序,長度相同再按字典排序 // 1.單獨創建比較器對象,對應的類就是實現了Comparator介面的類,介面中有比較的方法叫compare(Object obj1,Object // obj2) // 2.將比較器對象作用去TreeSet,TreeSet裡面再添加元素的時候,就會按照比較器規定的規則進行比較 // ComWithAgeAndName comWithAgeAndName=new ComWithAgeAndName(); TreeSet set1 = new TreeSet(comWithAgeAndName); set1.add(new Pp("bb1", 11)); set1.add(new Pp("bb2", 12)); set1.add(new Pp("bb3", 13)); set1.add(new Pp("bb4", 14)); set1.add(new Pp("bb4", 14)); set1.add(new Pp("bb5", 11)); System.out.println(set1); } } // 1).創建字元串的比較器按照長短比較 class CompareWitnLength implements Comparator { @Override public int compare(Object arg0, Object arg1) { if (!(arg0 instanceof String)) { throw new ClassCastException(); } if (!(arg1 instanceof String)) { throw new ClassCastException(); } String s1 = (String) arg0; String s2 = (String) arg1; int num = s1.length() - s2.length(); return num; } } class Pp implements Comparable{ String name; int age; public Pp(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "P [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Object o) { if(!(o instanceof P)) { throw new ClassCastException(); } P p=(P)o; //例如先比較年齡,再比較姓名 int num = age - p.age; return num==0?name.compareTo(p.name):num; } } class ComWithAgeAndName implements Comparator { @Override public int compare(Object o1, Object o2) { if (!(o1 instanceof Pp)) { throw new ClassCastException(); } if (!(o2 instanceof Pp)) { throw new ClassCastException(); } Pp p = (Pp) o1; Pp p1 = (Pp) o2; int num = p.age - p1.age; return num == 0 ? p.name.compareTo(p1.name) : num; // return 0; } }