1. 程式人生 > 其它 >list介面及其常用方法

list介面及其常用方法

  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 }
此為本人學習筆記,若有錯誤,請不吝賜教