1、HashSet和TreeSet集合
1 Set單列集合接口特徵:
1 無序:存和取的順序不一定一致。
2 不可以存儲重複元素(重點研究爲什麼不能存儲重複元素)
3 沒有索引,不能使用fori遍歷,只能使用增強for循環遍歷。
hash值的作用:
默認前情況下用來表示對象在內存中的地址,一般情況下不同的對象hash值是不一樣的,所以我們常說地址值不一樣。除非重寫了hashCode()方法hash值纔可能一。
2 HashSet集合(重點)
特點;底層使用哈希表結構(數組中存放鏈表)。
Set集合中元素唯一的條件:(重要)
結論:Set集合要想保證元素唯一,必須要重寫hashCode()方法和equals()方法
3 LinkedHasSet:有序並且不可以存儲重複元素,特例
特點:底層結構是鏈表+哈希表;鏈表保證有序。
4 TreeSet集合
排序的條件:條件二選一
1、TreeSet集合中的元素實現Comparable自然排序的接口,定義排序規則。
2、元素不需要實現Comparable接口,但是在創建TreeSet集合對象的時候傳遞一個Comparator比較器對象
5 Comparable和Comparator區別?
Comparable自然排序的接口,需要元素對象去實現這個接口。
Comparator比較器接口,給TreeSet對象使用。
總結:Set集合
共同特點:
無序、不能存儲重複着、沒有索引
HashSet:(重點)
底層是哈希表結構
元素唯一的條件:元素要重寫hashCode()方法和equals()方法。
LinkedHashSet:
底層是鏈表+哈希表結構
特殊:元素有序:存和取的順序一致
元素唯一的條件:元素要重寫hashCode()方法和equals()方法。
TreeSet:(掌握)
特殊: 元素默認自然排序
排序的條件:條件二選一
1、TreeSet集合中的元素實現Comparable自然排序的接口,定義排序規則。
2、元素不需要實現Comparable接口,但是在創建TreeSet集合對象的時候傳遞一個Comparator比較器對象
定義比較規則:
升序:自己跟別人比就是升序,傳遞進來的參數就是別人
降序:別人跟自己比就是降序
2、泛型(瞭解)
概念:將固定的數據類型參數化,也叫做參數化類型。
好處:
1、將運行期的異常提前到了編譯器,保證存儲的數據的正確性。
2、避免了強制類型轉換。
泛型的分類:
泛型類(常用一點):
第一步:在類名後面定義泛型,那麼這個類的任何地方都可以使用泛型。
public class GenericClass<T> {
//data只能保存String類型的數據
//private String data;
/*
需求:需要data能保存任意類型的數據
*/
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
第二步:在創建對象的時候確定泛型
public static void main(String[] args) {
//創建GenericClass對象,並確定泛型
GenericClass<String> gc1 = new GenericClass<>();
gc1.setData("java");
System.out.println(gc1.getData());
//存儲Student類型
GenericClass<Student> gc2 = new GenericClass<>();
gc2.setData(new Student("真皮沙發", 22));
System.out.println(gc2.getData());
}
泛型接口:
第一步:在接口名後面定義泛型,接口中的任何地方都可以使用泛型
public interface GenericInterface<T>{
//在抽象方法中使用泛型
public T method(T t);
}
第二步:爲接口定義實現類,和泛型類的定義一樣
public class GenericInterfaceImpl<T> implements GenericInterface<T>{
public T method(T t){
}
}
第三步:創建實現類對象的時候確定泛型
GenericInterface<String> gif=new GenericInterfaceImpl<String>();
泛型方法:
第一步:在方法的的修飾符後面定義泛型,在方法的任意位置(返回值、參數列表,方法體中)都可以使用泛型。
public class GenericMethod {
//定義一個泛型方法
public static <E> E show(E e){
//判斷e是否是String類型
if(e instanceof String){
String s= (String) e;
s="hello "+s;
return (E) s;
}
return e;
}
}
第二步:在調用方法的時候通過傳遞的參數值確定泛型的類型
public static void main(String[] args) {
//創建對象
GenericMethod gm=new GenericMethod();
//調用show方法
String s = gm.show("java");
System.out.println(s);
Student stu = gm.show(new Student("zhangsan", 20));
System.out.println(stu);
}
通配符泛型:<?>表示泛型的父類,一般應用在方法參數列表中
public class GenericTest {
public static void main(String[] args) {
//創建集合對象
List<Number> list1=new ArrayList<Number>();
//調用method方法
method(list1);
//創建集合對象
/*List<Integer> list2=new ArrayList<Integer>();
//調用method方法
method(list2);*/
//創建集合對象
List<Object> list3=new ArrayList<Object>();
//調用method方法
method(list3);
}
/*
Number和Integer是子父類關係,但是裝有Number的list集合和裝有Integer的list集合不是子父類關係
List<? extends Number>:定義通配符?的上限,最大類型只能是Number類型,所以傳遞List<Object>報錯
List<? super Number>:定義通配符?的下限,最小類型只能是Number類型,所以傳遞List<Integer>報錯
*/
/*public static void method(List<? extends Number> list){
System.out.println(list);
}*/
public static void method(List<? super Number> list){
System.out.println(list);
}
}