天天看點

泛型以及ArrayList類

本文主要内容:

1.ArrayList與LinkList差別

2.泛型的基本使用

3.自動裝箱與拆箱

4.ArrayList類

5.楊輝三角

1.ArrayList 和 LinkedList 的差別是什麼?

ArrayList是封裝的數組,LinkList是封裝的連結清單,ArrayList可以支援随機通路,時間複雜度為1,LinkList的時間複雜度為n,且性能高。

2.泛型的基本使用:

泛型時編譯期間的魔法,類的位元組碼中沒有泛型,運作期間也沒有。

  • 誕生的意義

    順序表本身是一種抽象資料類型,儲存的資料不隻是int類型。如果沒有泛型的支援,我們必須為每一種要儲存的資料類型定義一個順序表。為了解決類似順序表的結構,支援通用類型元素的類型。為了解決這個問題:

    第一階段:Object是所有類的基類

    元素類型:Object類類型的引用,Object引用可以指向任意類的對象

    第二階段:新的問題

    無法在編譯期間快速找到一些問題,可能會出現運作時異常:ClassCastException

ArrayList list = new ArrayList();
    list.add(new Person());
    String o = (String)list.get(0);//(錯誤)運作期間會抛異常
           

為了讓錯誤盡可能在編譯期間出現,引入泛型:

ArrayList<Person> list = new ArrayList<>();
    list.add(new Person());
    String o = (String)list.get(0);//編譯時報錯
           
  • 泛型類的使用

    (1)如何使用泛型類

    new ArrayList<String[類型變量的實參]>{}

1)嵌套
 ArrayList<ArrayList<String>> q;
 Set<Map.Entry<String,String>>[Map.Entey<String,String>是鍵值對]
2)類型推導
ArrayList<String> a = new ArrayList<String>();[可推導]
3)多類型參數
Map<String,Integer> grade;
           

(2)自己定義泛型類

class ArrayList<類型變量形參>{}

3.自動裝箱與自動拆箱[編譯期間的魔法]

(1)自動裝箱

class ArrayList<E>{
    E[] array; //Object[] array
    int size
}
           

順序表中的裡面的元素為int,怎麼辦?引出包裝類

int i = 10; 
Integer i1  = i;//裝箱
Integer i2 = new Integer(i);//裝箱
           

基本資料類型的包裝類:大多數将首字母大寫。特殊:char(Character)、int(Integer)

(2)自動拆箱

Integer i = new Integer(10);//裝箱
int j = i;//拆箱
int m = i.intValue();//拆箱
           

4.List接口

泛型以及ArrayList類

(1)ArrayList的構造方法

ArrayList() :構造一個初始容量為十的空清單。

ArrayList(Collection<? extends E> c) :構造一個包含指定集合的元素的清單,按照它們由集合的疊代器傳回的順序。

ArrayList(int initialCapacity) :構造具有指定初始容量的空清單。

(2)ArrayList的重要方法

add(E e) :将指定的元素追加到此清單的末尾。

void add(int index, E element) :在此清單中的指定位置插入指定的元素。

addAll(Collection<? extends E> c) :按指定集合的Iterator傳回的順序将指定集合中的所有元素追加到此清單的末尾。

void clear() :從清單中删除所有元素。

contains(Object o) :如果此清單包含指定的元素,則傳回 true 。

ensureCapacity(int minCapacity) :如果需要,增加此 ArrayList執行個體的容量,以確定它可以至少儲存最小容量參數指定的元素數。

get(int index) :傳回此清單中指定位置的元素。

int indexOf(Object o) :傳回此清單中指定元素的第一次出現的索引,如果此清單不包含元素,則傳回-1。

isEmpty() :如果此清單不包含元素,則傳回 true 。

代碼實作:

public class Test1 {
     private static class Person{
        private String name;
        private int age;
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<>();
        list.add("Java");
        list.add("C++");
        list.add(2,1);
        System.out.println(list);
        Person person = new Person("小明",20);
        list.add(person);
        for(Object o:list){
            System.out.println(o);
        }
        System.out.println(list.contains("Java"));
        Object o = list.get(2);
        System.out.println(o);
        list.clear();
        System.out.println(list.isEmpty());
    }
}
//運作結果:
[Java, C++, 1]
Java
C++
1
Person{name='小明', age=20}
true
1
true
           

5.楊輝三角

public class Test2 {
    //列印楊輝三角
    public static List<List<Integer>> generate (int numRows){
         List<List<Integer>> list = new ArrayList<>(numRows);
         //list是一種引用,List類型的接口引用,list邏輯上是一個線性表,其元素類型為List<Integer>
        for(int i = 0;i<numRows;i++){
            List<Integer> arrayList = new ArrayList<>(i+1);
            list.add(arrayList);
            if(i == 0){
                arrayList.add(1);
            }else if(i == 1){
                arrayList.add(1);
                arrayList.add(1);
            } else {
                List<Integer> num = list.get(i);
                num.add(1);
                for(int j = 1;j < i;j++){
                    num.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
                }
                num.add(1);
            }
        }
        return list;
    }
    public static List<List<Integer>> generate1 (int numRows) {
         List<List<Integer>> list = new ArrayList<>(numRows);
         for(int i = 0;i< numRows ;i++){
             List<Integer> arrayList = new ArrayList<>(i+1);
             list.add(arrayList);
             arrayList.add(1);
             for(int j = 1;j < i;j++){
                 arrayList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
             }
             if(i != 0) {
                 arrayList.add(1);
             }
         }
         return list;
    }
    public static void main(String[] args) {
        List<List<Integer>> lists = generate(5);
        System.out.println(lists);
        List<List<Integer>> lists1 = generate1(5);
        System.out.println(lists1);
      }
}
//運作結果:
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
           

6.連結清單

泛型以及ArrayList類

繼續閱讀