List、Set
目錄
一、數據結構
1.什么是數據結構?
2.常見的數據結構
二、List接口
1.List接口的特點
2.List接口中的常用方法以及常用子類
3.ArrayList的數據結構以及使用
4.LinkedList的數據結構以及使用
5.LinkedList的常用方法
三、Set接口
1.Set接口的特點
2.Set接口中的方法以及常用子類
3.HashSet的數據結構和使用
4.哈希表結構的拓展
5.LinkedHashSet的數據結構和使用
6.可變參數
四、Collections工具類
1.Collections的介紹
2.常用功能方法
3.Comparable自然排序接口
4.Comparator比較器排序接口
一、數據結構
1.什么是數據結構?
容器中存儲數據結構的方式。
2.常見的數據結構
堆棧結構:先進后出
隊列結構:后進先出
數組結構:查詢快,增刪慢,在內存中是連續的
鏈表結構:查詢慢,增刪快,在內存中是不連續的
二、List接口
1.List接口的特點
(1)元素存取有序
(2)有索引
(3)集合中元素可重復
2.List接口中的常用方法以及常用子類
常用方法:
public void add(int index, E element) : 將指定的元素,添加到該集合中的指定位置上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
boolean remove(Object o) :從列表中刪除指定元素的第一個出現(如果存在)(可選操作)。
public E set(int index, E element) :用指定元素替換集合中指定位置的元素,返回值的更新前的元素。
常用子類:
ArrayList? ? ? ? ? ?LinkedList? ? ? ? ? ? ? ? ?Vector
3.ArrayList的數據結構以及使用
ArrayList沒有特有方法,方法和List接口中的方法一樣。
集合數據存儲的結構是數組結構。元素增刪慢,查找快。
思考題:
List集合中存儲的是Integer元素時,remove()方法調用的是哪個?
ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);//刪除角標1位置的元素list.remove(1);//刪除ArrayList集合中元素為1的元素//list.remove(Integer.valueOf(1));System.out.println(list); }4.LinkedList的數據結構以及使用
集合數據存儲的結構是鏈表結構。方便元素添加、刪除的集合。
5.LinkedList的常用方法
public void addFirst(E e) :將指定元素插入此列表的開頭。
public void addLast(E e) :將指定元素添加到此列表的結尾。
public E getFirst() :返回此列表的第一個元素。
public E getLast() :返回此列表的最后一個元素。
public E removeFirst() :移除并返回此列表的第一個元素。
public E removeLast() :移除并返回此列表的最后一個元素。
public E pop() :從此列表所表示的堆棧處彈出一個元素。(和removeFist()一樣)
public void push(E e) :將元素推入此列表所表示的堆棧。(和addFirst()一樣)
public boolean isEmpty() :如果列表不包含元素,則返回true。
三、Set接口
1.Set接口的特點
(1)無序
(2)不重復
(3)無索引
2.Set接口中的方法以及常用子類
Set接口包括其實現類都沒有特有方法。與Collection接口完全一樣。
常用子類:
HashSet? ? ? ? ? ? ? ?LinkedHashSet? ? ? ? ? ? ? ? ?TreeSet
3.HashSet的數據結構和使用
底層使用哈希表,查詢快,增刪快
面試題:
向哈希表集合中添加重復元素時,并沒有覆蓋原有重復元素,根本沒有添加進去,add()方法返回的是false。
4.哈希表結構的拓展
(1)Java規定每一個對象都有一個哈希碼值,調用對象的HashCode()方法就可以拿到。
(2)Java中的地址值是假的
打印出來的地址值是哈希碼值的16進制體現
(3)Java中沒有真正的地址值,地址值在對象名中
但是打印對象名會調用對象的ToString()方法,打印不出來真實地址值
哈希表如何保證元素的唯一性?
只有兩個元素的哈希值相等,并且equals方法返回true,才判斷這兩個元素重復。
如果保存自定義元素,需重寫equals方法和HashCode方法。
5.LinkedHashSet的數據結構和使用
底層使用鏈表+哈希表(數組+鏈表+紅黑樹),查詢快,增刪快
LinkedHashSet是有序的,HashSet是無序的。
6.可變參數
在JDK1.5之后,如果我們定義一個方法需要接受多個參數,并且多個參數類型一致,
可變參數的本質是數組。
我們可以對其簡化成如下格式:
修飾符 返回值類型 方法名(參數類型... 形參名){ }
等價于
修飾符 返回值類型 方法名(參數類型[] 形參名){ }
注意:
(1)如果在方法書寫時,這個方法擁有多參數,參數中包含可變參數,可變參數一定要寫在參數列表的末尾位置。
(2)一個方法中只能有一個可變參數
四、Collections工具類
1.Collections的介紹
集合工具類,用來對集合進行操作
2.常用功能方法
public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。
public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
public static <T> void sort(List<T> list) :將集合中元素按照默認規則升序排序。
static void reverse(List<?> list) 反轉指定列表中元素的順序。
3.Comparable<T>自然排序接口
public int compareTo(Student o)
強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現compareTo()一次,不能經常修改類的代碼實現自己想要的排序。
實現此接口的對象列表(和數組)可以通過Collections.sort(和Arrays.sort)進行自動排序,對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
4.Comparator<T>比較器排序接口
public int compare(String o1, String o2) :比較其兩個參數的順序。
強行對某個對象進行整體排序。這種排序我們稱為比較器排序.可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以為那些沒有實現Comparable接口的對象的集合提供排序。
練習題:分別用Comparable和Comparator兩個接口對下列四位同學的成績做降序排序,如果成績一樣,那在成績排序的基礎上按照年齡由小到大排序。
List<Student> list = new ArrayList<>(); list.add(new Student("張三豐", 20, 90)); list.add(new Student("陳真", 22, 90)); list.add(new Student("葉問", 20, 99)); list.add(new Student("李小龍", 22, 100)); Collections.sort(list, (o1, o2) -> {int i = (int) (o2.getScore() - o1.getScore());if (i != 0) {return i;} else {return o1.getAge() - o2.getAge();} }); for (Student s : list) {System.out.println(s); }?
?
總結
- 上一篇: Collection、泛型
- 下一篇: 异常、线程入门