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)按照指定的方式排序
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()方法可以粗略判斷出兩個物件是否相同。
如果雜湊值不同,兩個物件一定不同,如果雜湊值相同,兩個物件不一定相同
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(); } });
總結: