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 }