List集合&Set集合
基礎題
練習一:List介面的特點
一、請簡述List介面的特點。
v它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麼集合中,元素的儲存就是按照11、22、33的順序完成的)。
v它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與陣列的索引是一個道理)。
v集合中可以有重複的元素,通過元素的equals方法,來比較是否為重複的元素。
練習二:hashCode和equals方法
二、請簡述HashSet去除重複元素的原理。
v呼叫被新增元素的hashCode(),和HashSet中已有元素的hashCode比較是否相同
v如果不相同,直接儲存
v如果相同,呼叫
v不相同,直接儲存元素
v相同,認為是同一元素.不儲存
練習三:資料結構
三、簡述常見的資料結構中元素的存取特點。
v棧:stack,又稱堆疊,對元素的存取特點是:先進後出。即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素。
v佇列:queue,簡稱隊,對元素的存取特點是:先進先出。即,存進去的元素,要在後它前面的元素依次取出後,才能取出該元素。
v陣列:Array,是有序的元素序列,對元素的存取特點是:
1、查詢元素快:通過索引,可以快速訪問指定位置的元素
2、增刪元素慢
(1)指定索引位置增加元素:需要建立一個新陣列,將指定新元素儲存在指定索 引位置,再把原陣列元素根據索引,複製到新陣列對應索引的位置。
(2)指定索引位置刪除元素:需要建立一個新陣列,把原陣列元素根據索引,復 制到新陣列對應索引的位置,原陣列中指定索引位置元素不復制到新陣列中。
v連結串列:linked list,對元素的存取有如下的特點:
1、多個結點之間,通過地址進行連線。例如,多個人手拉手,每個人使用自己的 右手拉住下個人的左手,依次類推,這樣多個人就連在一起了。
2、查詢元素慢:想查詢某個元素,需要通過連線的節點,依次向後查詢指定元素。
3、增刪元素快:
增加元素:只需要修改連線下個元素的地址即可。
刪除元素:只需要修改連線下個元素的地址即可。
練習四:Comparable和Comparator比較器
四、簡述Comparable和
vComparable:強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現compareTo()一次,不能經常修改類的程式碼實現自己想要的排序。實現此介面的物件列表(和陣列)可以通過Collections.sort(和Arrays.sort)進行自動排序,物件可以用作有序對映中的鍵或有序集合中的元素,無需指定比較器。
vComparator強行對某個物件進行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以使用Comparator來控制某些資料結構(如有序set或有序對映)的順序,或者為那些沒有自然順序的物件collection提供排序。
練習五:LinkedList方法的使用
五、根據要求練習LinkedList方法:
(1)基本方法:add, set, get, remove, clear, size等方法;
(2)特有方法:addFirst, addLast, getFirst, getLast, removeFirst, removeLast, push, pop, clear等方法。
(1)基本方法:
public class LinkedListTest01 { public static void main(String[] args) { // 1.建立LinkedList LinkedList<String> arr = new LinkedList<String>(); // 2.使用add方法新增元素 arr.add("西門吹雪"); arr.add("西門吹雪"); arr.add("西門吹雪"); arr.add("西門吹風"); arr.add("西門吹水"); // 3.使用add方法在指定索引新增元素 arr.add(2, "西門吹雨"); // 4.使用set方法修改指定位置索引 arr.set(0, "東門"); for (String str : arr) { System.out.println(str); } System.out.println("--------------"); // 5.使用get方法獲取指定索引的元素 System.out.println(arr.get(1)); // 6.使用size方法獲取集合大小 System.out.println(arr.size()); // 7.使用remove方法刪除指定索引的元素 arr.remove(3); // 8.使用clear清空集合中的元素 arr.clear(); System.out.println(arr); } }
(2)特有方法
public class LinkedListTest02 { public static void main(String[] args) { // 1.建立LinkedList LinkedList<String> linked = new LinkedList<String>(); // 2.使用add方法新增元素 linked.add("周杰倫"); linked.add("周星馳"); linked.add("周華健"); linked.add("周潤發"); // 3.使用addFirst新增元素到集合最前面 linked.addFirst("周傳雄"); // 4.使用addLast新增元素到集合最後面 linked.addLast("周渝民"); System.out.println(linked); // 5.使用getFirst獲取集合第一個元素 System.out.println(linked.getFirst()); // 6.使用getLast獲取集合最後一個元素 System.out.println(linked.getLast()); // 7.使用removeLast刪除集合第一個元素 String first = linked.removeFirst(); System.out.println(first); // 8.使用removeLast刪除集合最後一個元素 String last = linked.removeLast(); System.out.println(last); System.out.println(linked); // 9.使用pop彈出第一個元素 String p = linked.pop(); System.out.println(p); // 10.使用push在集合開頭插入元素 linked.push("周立波"); System.out.println(linked); // 11.使用clear清空集合 linked.clear(); System.out.println(linked); } }
練習六:HashSet儲存自定義型別
六、定義人類,包含姓名和年齡屬性。建立4個人儲存到HashSet中,姓名和年齡相同的人看做同一人不儲存。
Person類: // 1.定義Person類.包好姓名年齡屬性,重寫hashCode()和equals()方法 public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
測試類
public class HashSetTest01 { public static void main(String[] args) { // 2.建立HashSet用於儲存Person型別 HashSet<Person> hashSet = new HashSet<Person>(); // 3.新增多個Person到HashSet中 hashSet.add(new Person("王昭君", 21)); hashSet.add(new Person("西施", 21)); hashSet.add(new Person("楊玉環", 20)); hashSet.add(new Person("貂蟬", 19)); hashSet.add(new Person("楊玉環", 20)); hashSet.add(new Person("貂蟬", 19)); // 4.遍歷獲取HashSet中的內容 for (Person p : hashSet) { System.out.println(p); } } }
練習七:List集合元素替換
七、向list集合新增姓名{張三,李四,王五,二丫,錢六,孫七},將二丫替換為王小丫。
public class ListTest01 { public static void main(String[] args) { //1.建立List集合物件 List<String> list = new ArrayList<>(); //2.存入資料 list.add("張三"); list.add("李四"); list.add("王五"); list.add("二丫"); list.add("錢六"); list.add("孫七"); //3.遍歷集合,找到"二丫",便將其替換為"王小丫" //利用普通for迴圈遍歷List集合 for(int i = 0;i<list.size();i++) { //獲取當前元素 String thisName = list.get(i); //如果當前元素是"二丫" if("二丫".equals(thisName)) { //將其改為"王小丫" list.set(i, "王小丫"); } } System.out.println(list); } }
練習八:LinkedHashSet基本使用
八、使用LinkedHashSet儲存以下元素:"王昭君","王昭君","西施","楊玉環","貂蟬"。使用迭代器和增強for迴圈遍歷LinkedHashSet。
public class LinkedHashSetTest01 { public static void main(String[] args) { // 1.建立LinkedHashSet LinkedHashSet<String> lhSet = new LinkedHashSet<String>(); // 2.使用add方法新增元素到LinkedHashSet lhSet.add("王昭君"); lhSet.add("王昭君"); lhSet.add("王昭君"); lhSet.add("西施"); lhSet.add("楊玉環"); lhSet.add("貂蟬"); // 3.使用迭代器獲取LinkedHashSet中的元素 Iterator<String> iterator = lhSet.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // 4.使用增強for獲取LinkedHashSet中的元素 System.out.println("---------------------"); for (String string : lhSet) { System.out.println(string); } } }
練習九:Collections工具類使用
九、ArrayList集合中有如下內容:{33,11,77,55},使用Collections.sort()對ArrayList集合中的資料進行排序,並打印出排序後的結果。
public class CollectionsTest01 { public static void main(String[] args) { // 1.建立ArrayList ArrayList<Integer> arr = new ArrayList<Integer>(); // 2.使用add方法新增{33,11,77,55}四個元素 arr.add(33); arr.add(11); arr.add(77); arr.add(55); // 3.呼叫Collections的sort方法,對集合排序 Collections.sort(arr); // 4.使用增強for遍歷ArrayList集合 for (Integer integer : arr) { System.out.println(integer); } } }