重溫Java基礎(八)

1.泛型

1.1.泛型的定義,T 不指定類型的時候,就是Object類型。

public class TestGeneric<T> {
    T x;
    T y;

    @Override
    public String toString() {
        return "TestGeneric{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }

    public static void main(String[] args) {
        TestGeneric<String> tg = new TestGeneric<String>();
        tg.x = "10";
        tg.y = "20";
        System.out.println(tg);
    }
}

1.2.泛型的注意點,

  • 泛型的前後類型必須一致,1.7之後,後面的可以不寫
  • 泛型是沒有繼承的  ArrayList<Object> arrayList= new ArrayList<String>();  報錯。
  • 泛型是語法糖,真正編譯的時候,還是Object類型。(class 強轉類型)

1.3.泛型類,

  • 在類上面定義的泛型,創建的時候需要指定泛型的類型,沒有指明就是Object類型。
  • 泛型類中定義的泛型方法,不能使用在static修飾,因爲靜態方法是類名調用的,泛型在對象創建的時候才指定類型。

1.4.自定義泛型方法,方法單獨使用泛型,必須得有參數纔有意義。

public class TestGenericMethod {

    <T> void test(T a) {
        System.out.println(a.getClass());
    }

    static <E> void test2(E name) {
        System.out.println(name.getClass());
    }

    public static void main(String[] args) {
        TestGenericMethod genericMethod = new TestGenericMethod();
        genericMethod.test("a");
        TestGenericMethod.test2("haoren");
    }
}

1.5.泛型通配符,只能作接收操作,不能做添加

public class TestWildcardCharacter {
    static void test1(List<?> list) {

    }

    static void test2(List<? extends Number> list) {

    }

    static void test3(List<? super Number> list) {

    }

    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        test1(arrayList);
    }

}

1.6.泛型的上限和下限,

  • extends泛型的上限,用來限定元素的類型必須是Number的子類。
  • super泛型的下限,用來限定元素的類型必須是Number的父類。

1.7.泛型的擦除,把泛型給去掉了,把原來有泛型的list賦值給沒有泛型的list,泛型沒有了。

2.list和數組的轉換

  • Arrays.asList轉成集合之後不能添加和刪除元素,而且把數組裏面的元素整體當成一個對象。
  • 一般不會把基本數據類型的數組轉成集合,引用數據類型纔去轉成集合。
  • new String[10] ,靜態開闢空間。如果空間不夠,自動創建和size一樣大小的空間。
public class TestTransfer {
    public static void main(String[] args) {
        //數組轉集合
        int[] arr = {1, 2, 3, 4};
        List<int[]> list=Arrays.asList(arr);
        System.out.println(list);
        Integer[] arr2 ={10,20,30,40};
        List<Integer> list2=Arrays.asList(arr2);
        System.out.println(list2);
        //集合轉數組
        List<String> list3=new ArrayList<>();
        list3.add("a");
        list3.add("b");
        Object[] obj=list3.toArray();
        String[] strs=list3.toArray(new String[10]);
        System.out.println(Arrays.asList(strs));
    }
}

3.set是無序的(元素添加的順序),不重複的,對象的去重,重寫equals方法和hashCode方法,可以去重。

  • HashSet
  • TreeSet

4.hashCode,每一個對象都有一個hashCode值。跟內存地址對應的編號。每一個對象的hashCode值都不一樣。

5.HashSet去重原理

  • 每次調用add方法,添加對象的時候,每次都生成不同的hashcode值。
  • 當添加的對象hashcode值相同的時候,纔會調用equals方法,如果對象是相同的則返回false,不允許添加

6. LinkedHashSet

  • 是HashSet的子類
  • 底層是鏈表實現,保證元素怎麼存怎麼出。是Set集合唯一的保證順序的集合。

7.隨機生成10個1~20之間隨機數,不重複,代碼如下,

        Random random = new Random();
        TreeSet treeSet = new TreeSet();
        while (treeSet.size()<10){
            int num = random.nextInt(20) + 1;
            treeSet.add(num);
        }
        System.out.println(treeSet.toString());

8.TreeSet用來對元素進行排序,按照數字大小,按照字母順序,按照Unicode(包含了assic碼)

  • TreeSet存放的類型必須是相同的類型
  • 自定義的對象不能添加到TreeSet當中,對象必須實現Comparable接口,並且重寫compareTo方法
  • compareTo的返回值,爲0的話,只添加第一個元素,爲正數,就是順序添加,順序顯示,負數,就是倒序顯示。
  • 二叉樹實現的,在添加元素的時候,會調用compareTo方法,返回正數就是 大於根元素,放在右邊。
  • 二叉樹從左往右取

9.treeset添加自定義對象實例如下,自定義compareTo屬性,源碼TreeSet自定義屬性比較

10.TreeSet比較器

 

 

 

 

 

 

 

 

 

 

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