list介面及其常用方法
阿新 • • 發佈:2021-12-18
1 import org.junit.Test; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Iterator; 6 import java.util.List; 7 8 9 /** 10 * 1.list介面框架 11 * /----Collection介面:單列集合,用來儲存一個一個的物件 12 * /----list介面:儲存有序的、可重複的資料。 ---> “動態”陣列,替換原有的陣列 13 * /----ArrayList:作為List介面的主要實現類,執行緒不安全的,效率高的,底層使用Object[]儲存14 * /----LinkedList:,對於頻繁的插入、刪除操作,使用此類效率比ArrayList高;底層使用雙向連結串列儲存 15 * /----Vector:作為List介面的古老實現類,執行緒安全的,效率不高的,底層使用Object[]儲存 16 * 17 * 2. ArrayList的原始碼分析: 18 * 2.1 jdk 7 情況下: 19 * ArrayList list = new ArrayList();//底層建立了長度為10的 Object[] 陣列elementData 20 * list.add(1);//elementData[0] = new Integer(1);21 * ... 22 * List.add(11);如果此次新增導致底層elementData陣列容量不夠,則擴容。預設情況下,擴容為原來的1.5倍,同時需要將原有陣列的資料複製 23 * 到新的陣列中。 24 * 25 * 結論:建議開發中使用帶參的構造器:ArrayList list = new ArrayList(int initialCapacity); 26 * 27 * 2.2 jdk 8 中ArrayList的變化: 28 * ArrayList list = new ArrayList();//底層Object[] elementData 初始化為 {},並沒有建立長度為10的陣列29 * 30 * list.add(123);//第一次呼叫add()時,底層才建立了長度為10的陣列,並將資料123新增到elementData[0] 31 * ... 32 * 後續的新增和擴容操作和jdk 7無異。 33 * 2.3小結:jdk 7中的ArrayList的物件的建立類似於單例模式中的餓漢式,而jdk8中ArrayList的物件的建立類似於單例的懶漢式, 34 * 延遲了陣列的建立,節省了記憶體。 35 * 36 * 3.linkedList的原始碼分析: 37 * LinkedList list = new LinkedList(); //內部聲明瞭Node型別的first和last屬性,預設值為null, 38 * list.add(123);//將123封裝到Node中,建立了Node物件。 39 * 40 * 其中Node定義:體現了LinkedList的雙向連結串列的說法 41 * private static class Node<E> { 42 * E item; 43 * Node<E> next; 44 * Node<E> prev; 45 * 46 * Node(Node<E> prev, E element, Node<E> next) { 47 * this.item = element; 48 * this.next = next; 49 * this.prev = prev; 50 * } 51 * } 52 * 53 * 54 * 面試題:比較ArrayList,LinkedList,Vector三者的異同? 55 * 同:三個類都實現了List介面,儲存資料相同:儲存有序的、可重複的資料 56 * 不同:見上 57 * 58 * 4.List介面中的常用方法 59 * void add(int index, Object ele):在index位置上插入ele元素 60 * boolean addAll(int index,Collection eles):從index位置開始將eles中的所有元素加進來 61 * Object get(int index):獲取指定位置的元素 62 * int indexOf(Object obj):返回obj在集合中首次出現的位置 63 * int lastIndexOf(Object obj):返回obj在集合中最後一次次出現的位置 64 * Object remove(int index):移除指定index位置上的元素,並返回此元素 65 * Object set(int index, Object ele):設定指定index位置的元素為ele 66 * List subList(int fromIndex, int toIndex):返回從fromIndex到toIndex位置的子元素 67 * 68 * 總結:常用方法 69 * 增:add(Object) 70 * 刪:remove(int index)/remove(Object obj) 71 * 改:set(int index, Object ele) 72 * 查:get(int index) 73 * 插:add(int index, Object ele) 74 * 長度:size() 75 * 遍歷: ① Iterator迭代器方式 76 * ②增強for迴圈 77 * ③普通的迴圈 78 * @author FuJingchao 79 * @Date: 2021/12/17 - 20:30 80 */ 81 public class ListTest { 82 /* 83 List介面中的常用方法測試 84 */ 85 @Test 86 public void test1(){ 87 ArrayList list = new ArrayList(); 88 list.add(123); 89 list.add(456); 90 list.add("AA"); 91 list.add(new Person("Tom",12)); 92 list.add(456); 93 94 System.out.println(list);//[123, 456, AA, Person{name='Tom', age=12}, 456] 95 96 // void add(int index, Object ele):在index位置上插入ele元素 97 list.add(1,"BB"); 98 System.out.println(list);//[123, BB, 456, AA, Person{name='Tom', age=12}, 456] 99 100 //boolean addAll(int index,Collection eles):從index位置開始將eles中的所有元素加進來 101 List list1 = Arrays.asList(1, 2, 3,4,5); 102 list.addAll(list1); 103 System.out.println(list.size());//11 104 System.out.println(list);//[123, BB, 456, AA, Person{name='Tom', age=12}, 456, 1, 2, 3, 4, 5] 105 106 //Object get(int index):獲取指定位置的元素 107 System.out.println(list.get(1));//BB 108 109 } 110 111 @Test 112 public void test2(){ 113 //int indexOf(Object obj):返回obj在集合中首次出現的位置,沒有的話返回-1 114 //int lastIndexOf(Object obj):返回obj在集合中最後一次出現的位置,沒有的話返回-1 115 ArrayList list = new ArrayList(); 116 list.add(123); 117 list.add(456); 118 list.add("AA"); 119 list.add(new Person("Tom",12)); 120 list.add(456); 121 122 System.out.println(list.indexOf(456));//1 123 System.out.println(list.lastIndexOf(456));//4 124 125 //Object remove(int index):移除指定index位置上的元素,並返回此元素 126 // list.remove(3); 127 // System.out.println(list);//[123, 456, AA, 456] 128 129 //Object set(int index, Object ele):設定指定index位置的元素為ele 130 list.set(1,"gg"); 131 System.out.println(list);//[123, gg, AA, Person{name='Tom', age=12}, 456] 132 133 //List subList(int fromIndex, int toIndex):返回從fromIndex到toIndex位置的左閉右開的子集合 134 System.out.println(list.subList(1,3));//[gg, AA] 135 } 136 @Test 137 public void test3(){ 138 //遍歷 139 ArrayList list = new ArrayList(); 140 list.add(123); 141 list.add(456); 142 list.add("AA"); 143 list.add(new Person("Tom",12)); 144 list.add(456); 145 146 //方式一 147 Iterator iterator = list.iterator(); 148 while (iterator.hasNext()){ 149 System.out.println(iterator.next()); 150 } 151 System.out.println("*****************"); 152 153 //方式二 154 for(Object obj : list){ 155 System.out.println(obj); 156 } 157 System.out.println("******************"); 158 159 //方式三 160 for (int i = 0; i < list.size(); i++) { 161 System.out.println(list.get(i)); 162 } 163 } 164 }
1 /** 2 * @author fu jingchao 3 * @creat 2021/12/8-14:53 4 */ 5 public class Person { 6 private String name; 7 private int age; 8 9 public Person() { 10 } 11 12 public Person(String name, int age) { 13 this.name = name; 14 this.age = age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 @Override 34 public String toString() { 35 return "Person{" + 36 "name='" + name + '\'' + 37 ", age=" + age + 38 '}'; 39 } 40 41 @Override 42 public boolean equals(Object o) { 43 System.out.println("Person equals()...."); 44 if (this == o) return true; 45 if (o == null || getClass() != o.getClass()) return false; 46 47 Person person = (Person) o; 48 49 if (age != person.age) return false; 50 return name != null ? name.equals(person.name) : person.name == null; 51 } 52 53 // @Override 54 // public int hashCode() { 55 // int result = name != null ? name.hashCode() : 0; 56 // result = 31 * result + age; 57 // return result; 58 // } 59 }此為本人學習筆記,若有錯誤,請不吝賜教