Java學習之隨堂筆記系列——day15

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);
                }
            }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章