1. 程式人生 > 實用技巧 >java回顧之集合List

java回顧之集合List

java回顧之集合List

一、List介面

list的特點,元素有索引,元素可以重複,元素存取有序(存的時候和取得時候順序是一樣的)

常用方法 add、get、remove、set

1.2ArrayList

ArrayList是具體的類,這個類的底層用的陣列資料結構,查詢快,增刪慢。

1.3LinkedList集合

LinkedList集合底層是用雙向連結串列來實現的,增刪快,查詢慢。

常用方法:

addFirst 往開頭新增元素

addLast 往末尾新增元素

getFirst 獲取開頭的元素

getLast  獲取末尾的元素

removeFirst  刪除開頭的元素

removeLast  刪除末尾的元素

pop()  模擬棧的結構,彈出一個元素

push()  模擬棧的結構,推入一個元素

原理圖

二、Collections工具類

Collection是集合的工具類,工具類提供了靜態方法。

shuffle(list) 隨機打亂集合元素的順序

sort(list)  集合的排序從小到大

sort(list,Comparator)按照指定的方式排序

compare的意思是比較,可以用這個方法來規定比較的規則:

​ 引數: ​ o1代表要比較的數字, o2代表已經比較完的數字

返回值: ​ 如果返回值是正數,代表o1 > o2,就會把o1移動到後面

如果返回值是負數,代表o1 < o2,就會把o1移動到前面

如果返回值是零,代表o1 == o2,就不會移動

為什麼Integer類,String類可以排序呢,應該類底層實現了Comparable介面。[知道就可以了]

   Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

排列自定義型別

public class Demo02比較器對自定義型別比較 {
public class Demo02比較器對自定義型別比較 {
    public static void main(String[] args) {
        //建立集合
        ArrayList<Student> list = new ArrayList<>();

        //新增元素
        list.add(new Student("柳巖",36));
        list.add(new Student("美美",26));
        list.add(new Student("羅志美美",26));
        list.add(new Student("郭美美",26));
        list.add(new Student("老王",62));

        //列印集合
        System.out.println(list);//存取有序

        //排序
        //按照年齡從小到大排序,如果年齡相同,按照姓名長度從小到大排序
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                //年齡從小到大
                if(o1.getAge() != o2.getAge()){
                    return o1.getAge() - o2.getAge();
                }else{
                    //如果年齡相同
                    //按照姓名長度從小到大
                    return o1.getName().length() - o2.getName().length();
                }

            }
        });
        
        //列印集合
        System.out.println(list);

    }
}  

三、可變引數

可以接受同種型別任意個數的引數。

public static void method(int... a){}//可變引數的本質其實是一個數組

  • 可變引數可以接受任意個引數,也可以接受一個數組

  • 一個方法只能有一個可變引數,並且可變引數必須放在最後。

  • 可變引數的本質其實就是陣列,在方法中可以把可變引數當做陣列來使用

四、Set介面及子類

4.1HashSet

特點:元素不可重複、元素沒有索引、元素存取無序,底層是雜湊表

4.2hash值

  在Object類中有一個方法hashCode(),這個方法的返回值是一個整數型別,在子類中會重寫這個方法,我們把返回值成為hash值。在子類中重寫的hashCode()方法可以粗略判斷出兩個物件是否相同。

如果雜湊值不同,兩個物件一定不同,如果雜湊值相同,兩個物件不一定相同

HashSet保證元素不重複依靠的是hashCode()和equals()方法

p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))

判斷兩個物件的hash值是否相同,
如果物件的hash值不同,說明兩個物件一定不同就【可以儲存】
如果物件的hash值相同,那麼就呼叫equals方法判斷
如果equals返回的結果是false,代表兩個物件不同,【可以儲存】
如果equals返回的結果是true,代表兩個物件相同,【不可以儲存】

儲存自定義型別的時候要重寫hoshcode()和equal()兩個方法,比如定義一個Student類,後面建立一個HashSet

HashSet<Student> set = new HashSet<>();這個時候hashCode和equal方法需要重寫

   @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }
}

4.2LinkedHashSet集合

元素不可重複、元素沒有索引、元素存取有序

因為HashSet是存取無序集合,他兒子想要讓存取變的有序,所以LinkedHashSet就是在HashSet的基礎上加了一個連結串列,加的這個連結串列的作用記錄元素的儲存順序。

4.3、TreeSet集合

TreeSet集合的底層是紅黑樹,元素不可重複,元素沒有索引,元素會預設被排序

比如Integer類,String類他們自帶排序方式,因為這些類底層實現Comparable介面。不需要我們指定排序方式這就是自然排序。

//建立集合
        TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
            /*
                compare的意思是比較,可以用這個方法來規定比較的規則:
                      引數:
                          o1代表要比較的數字, o2代表已經比較完的數字
                      返回值:
                          如果返回值是正數,代表o1 > o2,就會把o1移動到後面
                          如果返回值是負數,代表o1 < o2,就會把o1移動到前面
                          如果返回值是零,代表o1 == o2,就不會移動
             */
            @Override
            public int compare(Student o1, Student o2) {
                //按照年齡排序,年齡小的在前,年齡大的在後
                return o1.getAge() - o2.getAge();

            }
        });

  

總結: