集合中list、ArrayList、LinkedList、Vector的區別、Collection接口的共性方法以及數據結構的總結


List (鏈表|線性表)

     特點: 接口,可存放重復元素,元素存取是有序的,允許在指定位置插入元素,並通過索引來訪問元素

1、創建一個用指定可視行數初始化的新滾動列表。默認情況下,不允許進行多項選擇。

     注意,這是 List(rows, false) 的一種便捷方法。還要注意,列表中的可視行數一旦創建就不能更改。

  public List(int rows)------------------row-----要顯示的項數

 2、創建一個初始化為顯示指定行數的新滾動列表。

      注意,如果指定了零行,則會按默認的四行創建列表。還要注意,列表中的可視行數一旦創建就不能更改。

      如果 multipleMode 的值為 true,則用戶可從列表中選擇多項。如果為 false,則一次只能選擇一項。

   public List(int rows,boolean multipleMode)-------rows - 要顯示的項數。
-------multipleMode - 如果為 true,則允許進行多項選擇;否則,一次只能選擇一項。

 綜上所述:如果拋出為throws-----GraphicsEnvironment.isHeadless(),則返回 true。

Set(集)

       特點: 不可以存放重復元素,元素存取是無序的

Collection(接口)

      1、特點:描述的是集合共有的功能(描述所有接口的共性

      2、Collection接口有兩個子接口:

 

             List(鏈表|線性表)

 

             Set(集)

 

 

集合整理

Collection

我們需要保存若干個對象的時候使用集合。

 

List

 

 

如果我們需要保留存儲順序, 並且保留重復元素, 使用List.

如果查詢較多, 那么使用ArrayList

如果存取較多, 那么使用LinkedList

如果需要線程安全, 那么使用Vector

 

 

Set

 

如果我們不需要保留存儲順序, 並且需要去掉重復元素, 使用Set.

如果我們需要將元素排序, 那么使用TreeSet

如果我們不需要排序, 使用HashSet, HashSet比

TreeSet效率高.

如果我們需要保留存儲順序, 又要過濾重復元素, 那么使用LinkedHashSet

 

 

 

 

 

 

 

 

 

 

 

 

Collection接口的共性方法

增加:

       1:add()   將指定對象存儲到容器中

                      add 方法的參數類型是Object 便於接收任意對象

       2:addAll() 將指定集合中的元素添加到調用該方法和集合中

刪除:

       3:remove() 將指定的對象從集合中刪除

       4:removeAll() 將指定集合中的元素刪除

修改

       5:clear() 清空集合中的所有元素

判斷

       6:isEmpty() 判斷集合是否為空

       7:contains() 判斷集合何中是否包含指定對象

           

       8:containsAll() 判斷集合中是否包含指定集合

                            使用equals()判斷兩個對象是否相等 

獲取:   9:int size()    返回集合容器的大小

 

轉成數組10: toArray()   集合轉換數組

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

實例練習:

 1 //創建Person類
 2 class Person {
 3     private String name; 4 private int age; 5 6 public Person() { 7 8  } 9 10 public Person(String name, int age) { 11 12 this.name = name; 13 this.age = age; 14  } 15 16  @Override 17 public int hashCode() { 18 return this.name.hashCode() + age; 19  } 20 21  @Override 22 public boolean equals(Object obj) { 23 if (!(obj instanceof Person)) { 24 return false; 25  } 26 Person p = (Person) obj; 27 return this.name.equals(p.name) && this.age == p.age; 28  } 29 30  @Override 31 public String toString() { 32 return "Person :name=" + name + ", age=" + age; 33  } 34 35 } 36 37 public static void main(String[] args) { 38 Person p1 = new Person("李華", 19); 39 Person p2 = new Person("尹樂樂", 20); 40 Person p3 = new Person("洛洛", 18); 41 Collection list = new ArrayList(); 42  list.add(p1); 43  list.add(p2); 44  list.add(p3); 45 // isEmpty() 判斷集合是否為空 46 boolean empty = list.isEmpty(); 47  System.out.println(empty); 48 // 返回集合容器的大小 49 int size = list.size(); 50  System.out.println(size); 51 // contains()判斷集合何中是否包含指定對象 52 boolean contains = list.contains(p1); 53  System.out.println(contains); 54 55 // remove(); 將指定的對象從集合中刪除 56  list.remove(p1); 57 58 // clear() 清空集合中的所有元素 59  list.clear(); 60  System.out.println(list); 61 62 }

 

分析總結:

1:Person類

    1:姓名和年齡

    2:重寫hashCode和equals方法

            1、如果不重寫,調用Object類的equals方法,判斷內存地址,為false

            2、如果是Person類對象,並且姓名和年齡相同就返回true

            3、如果不重寫,調用父類hashCode方法,如果equals方法相同,那么hashCode也要相同,需要重寫hashCode方法

     3:重寫toString方法

           注:不重寫,直接調用Object類的toString方法,打印該對象的內存地址

注:list、ArrayList、LinkedList、Vector的區別

 1、List:元素是有序的(怎么存的就怎么取出來,順序不會亂),元素可以重復(角標1上有個3,角標2上也可以有個3)因為該集合體系有索引。

           List:特有的方法,凡是可以操作角標的方法都是該體系特有的方法。

 2、ArrayList:1、底層的數據結構使用的是數組結構(數組長度是可變的百分之五十延長)。

                    2、特點:是查詢很快,但增刪較慢,線程不同步(數組查詢快的原因是:數組的內存空間地址是連續的)。

                    3、ArrayList底層維護了一個Object[] 用於存儲對象,默認數組的長度是10,當默認的或者指定的容量不夠存儲對象的時候,容量自動增長為原來的容量的1.5倍。

                    4、單線程效率高。

實例:  去除ArrayList集合中重復元素

             1:存入字符串元素

             2:存入自定義對象元素(如Perosn對象)

原理:

     循環遍歷該集合,每取出一個放置在新的集合中,放置之前先判斷新的集合是否以包含了新的元素。

 1 public class Demo2 {
 2     public static void main(String[] args) {
 3         ArrayList arr = new ArrayList();
 4         Person p1 = new Person("jack", 20);
 5         Person p2 = new Person("rose", 18);
 6         Person p3 = new Person("rose", 18);
 7         arr.add(p1);
 8         arr.add(p2);
 9         arr.add(p3);
10         System.out.println(arr);
11         ArrayList arr2 = new ArrayList();
12         for (int i = 0; i < arr.size(); i++) {
13             Object obj = arr.get(i);
14             Person p = (Person) obj;
15             if (!(arr2.contains(p))) {
16                 arr2.add(p);
17             }
18         }
19         System.out.println(arr2);
20     }
21 }
22 
23 class Person {
24     private String name;
25     private int age;
26 
27     public Person() {
28 
29     }
30 
31     public Person(String name, int age) {
32 
33         this.name = name;
34         this.age = age;
35     }
36 
37     public String getName() {
38         return name;
39     }
40 
41     public void setName(String name) {
42         this.name = name;
43     }
44 
45     public int getAge() {
46         return age;
47     }
48 
49     public void setAge(int age) {
50         this.age = age;
51     }
52 
53     @Override
54     public int hashCode() {
55         return this.name.hashCode() + age * 37;
56     }
57 
58     @Override
59     public boolean equals(Object obj) {
60         if (!(obj instanceof Person)) {
61             return false;
62         }
63         Person p = (Person) obj;
64 
65         return this.name.equals(p.name) && this.age == p.age;
66     }
67 
68     @Override
69     public String toString() {
70         return "Person@name:" + this.name + " age:" + this.age;
71     }
72 
73 }

  3、LinkedList:底層的數據結構是鏈表結構(特點是查詢較慢,增刪較快)。         

          特有方法:addFirst(E e)、getFirst(E e) 、removeFirst(E e) 

         如果集合中沒有元素,獲取或者刪除元素拋:NoSuchElementException


  4、Vector:1、底層是數組數據結構 線程同步(數組長度是可變的百分之百延長),(無論查詢還是增刪都很慢,被ArrayList替代了)

                   2、多線程安全的,所以效率低。

                   3、特有的方法:

                      void addElement(E obj)  在集合末尾添加元素

                      E elementAt( int index) 返回指定角標的元素

                      Enumeration elements()  返回集合中的所有元素,封裝到Enumeration對象中測試此枚舉是否包含更多的元素。

                      E nextElement()    如果此枚舉對象至少還有一個可提供的元素,則返回此枚舉的下一個元素。

        Enumeration 接口: boolean hasMoreElements() 

 

 

注:1、可以使用該集合去模擬出隊列(先進先出) 或者堆棧(后進先出) 數據結構,堆棧(后進先出)。

     2、有一批數據要存儲,要求存儲這批數據不能出現重復數據,ArrayList、LinkedList都沒法滿足需求。解決辦法:使用 set集合。

 

數據結構

       1:棧 (1.6)

            先進后出

              push()

               pop()

       2:隊列(雙端隊列1.5)

                  先進先出

                  offer()

                  poll()

       3:返回逆序的迭代器對象   descendingIterator()   返回逆序的迭代器對象

 1   //迭代
 2   import java.util.Iterator;
 3   import java.util.LinkedList;
 4   
 5   public class Demo3 {
 6       public static void main(String[] args) {
 7           LinkedList list = new LinkedList();
 8           list.add("微信");
 9           list.add("微博");
10          list.add("淘寶");
11          list.add("京東");
12          list.add("阿里巴巴");
13          Iterator it = list.iterator();
14                 // Iterator it = list.descendingIterator();//逆序迭代
15          while (it.hasNext()) {
16              String next = (String) it.next();
17              System.out.println(next);
18          }
19      }
20  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM