數組長度是固定,當添加的元素超過了數組的長度時須要對數組從新定義,太麻煩,java內部給咱們提供了集合類,能存儲任意對象,長度是能夠改變的,隨着元素的增長而增長,隨着元素的減小而減小 java
數組:既能夠存儲基本數據類型,又能夠儲存引用數據類型,基本數據類型存儲的是值,引用數據類型存儲的是地址值數組
集合:只能存儲引用數據類型(對象)集合中也能夠存儲基本數據類型,可是在存儲的時候會自動裝箱變成對象(Integer, Double) 安全
數組長度是固定的,不能自動增加數據結構
集合的長度是能夠變的,能夠根據元素的增加而增加 併發
若是元素個數是固定的推薦數組測試
若是元素個數不是固定的推薦用集合(用處會不少)spa
Collection集爲單列集合線程
下有兩個分支 list和set list又有ArrayLise ,LinkedList,vecort Set又有 Hashsete 和treesetcode
list集合內add方法永遠返回true,也就是說什麼類型的數據均可以添加進去對象
1 public static void demo2() { 2 //Collection是接口,因此須要父類引用指向子類對象 3 Collection c = new ArrayList(); 4 //add()方法將元素添加到列表尾部 5 c.add("a"); 6 c.add("b"); 7 c.add("c"); 8 c.add("d"); 9 //remove()方法是刪除 10 boolean b = c.remove("a"); 11 System.out.println(b); // true 12 System.out.println(c); // b c d 13 14 //清空集合 15 c.clear(); 16 System.out.println(c); 17 //判斷集合是否包含「c」 18 boolean b1 = c.contains("c"); 19 System.out.println(b1); 20 //判斷集合是否爲空 21 System.out.println(c.isEmpty()); 22 //獲取元素個數 23 int a = c.size(); 24 System.out.println(a); 25 26 }
1 Collection c = new ArrayList(); 2 c.add("a"); 3 c.add("b"); 4 c.add("c"); 5 c.add(5); 6 7 //Collection接口中包含了toSArray方法 8 //把集合轉換成數組,Object類型的數組,再用for循環遍歷 9 Object []obj = c.toArray(); 10 for (int i = 0; i < obj.length; i++) { 11 System.out.println(obj[i]); 12 }
1 //輸出自定義對象,和存儲自定對象的方法 2 Collection c = new ArrayList(); 3 c.add(new Student("z",34)); 4 c.add(new Student("x",45)); 5 c.add(new Student("s",23)); 6 7 //將集合轉爲數組, 8 Object []obj = c.toArray(); 9 for (Object object : obj) { 10 //getset方法輸出 11 System.out.println(object); 12 } 13 for (int i = 0; i < obj.length; i++) { 14 //向下轉型,轉到Student類中,調用getset方法,這樣就能夠本身輸出內容 15 Student s = (Student)obj[i]; 16 System.out.println(s.getName() + " " + s.getAge());
1 Collection c = new ArrayList(); 2 c.add("c"); 3 c.add("b"); 4 c.add("a"); 5 Collection c1 = new ArrayList(); 6 c1.add("c"); 7 c1.add("b"); 8 c1.add("a"); 9 10 //addAll是把c1中每個元素都添加到c中,添加一個元素c長度加一 11 c.addAll(c1);
//輸出結果爲[c, b, a, c, b, a] 長度6 12 13 //add是把c1做爲一個對象,多爲一個總體,直接添加到c中,c1添加進去夠c的長度只加1 14 c.add(c1);
//輸出結果爲[c, b, a,[c, b, a]] 長度4
1 Collection c = new ArrayList(); 2 c.add("c"); 3 c.add("b"); 4 c.add("a"); 5 Collection c1 = new ArrayList(); 6 c1.add("c"); 7 c1.add("b"); 8 9 10 //刪除 調用集合與傳入集合的交集 11 c.removeAll(c1); 12 System.out.println(c); 13 //輸出結果 a
Collection c = new ArrayList(); c.add("c"); c.add("b"); c.add("a"); Collection c1 = new ArrayList(); c1.add("c"); c1.add("b"); //判斷調用集合是否包含傳入集合 c.containsAll(c1);
1 Collection c = new ArrayList(); 2 c.add("c"); 3 c.add("b"); 4 c.add("a"); 5 Collection c1 = new ArrayList(); 6 c1.add("c"); 7 c1.add("b"); 9 10 //若是調用集合改變,就返回true,若是調用者沒改變,就返回false 11 12 c.retainAll(c1);//取調用集合和錄入集合的交集,輸出調用者的話,是不會輸出出來兩個集合之間的交集 13 System.out.println(c); 14 //輸出結果 a
1 Collection c = new ArrayList(); 2 c.add("c"); 3 c.add("b"); 4 c.add("a"); 5 //使用迭代器進行遍歷 6 Iterator iter = c.iterator(); 7 //hasNext是判斷還有沒有下一個元素 8 while(iter.hasNext()) { 9 //next是輸出下一個元素 10 System.out.println(iter.next()); 11 }
1 //遍歷自定義對象
Iterator iter = c.iterator(); 2 3 while(iter.hasNext()) { 4 System.out.println(iter.next()); 5 } 6 7 /*輸出結果 8 * Student [name=z, age=34] 9 * Student [name=x, age=45] 10 * Student [name=s, age=23] 11 */ 12 13 14 while(iter.hasNext()) { 15 Student s = (Student)iter.next(); 16 System.out.println(s.getName() + " " + s.getAge()); 17 } 18 /*輸出結果 19 * z 34 20 * x 45 21 * s 23 22 */ 23
1 // size是集合長度 2 for (int i = 0; i <list.size(); i++) { 3 //System.out.println(list.get(i)); 4 Student s= (Student)list.get(i); 5 System.out.println(s.getName()+"..."+s.getAge());
naex();方法在一個循環中只容許使用一次,不然會對是數據
1 /* 2 * 判斷集合中有沒有word元素,若是有就添加javaee, 3 */ 4 List list = new ArrayList(); 5 list.add("a"); 6 list.add("word"); 7 list.add("c"); 8 list.add("b"); 9 10 //迭代器添加元素 11 ListIterator lis = list.listIterator(); 12 while (lis.hasNext()) { 13 //向下轉型到string類 14 String str = (String)lis.next(); 15 //進行判斷 16 if (str.equals("word")) { 17 //這是使用迭代器去添加元素,而不是list自己去添加 18 lis.add("javaee"); 19 } 20 21 } 22 23 System.out.println(list); 24 //輸出結果爲 [a, word, javaee, c, b]
老師沒講,vector會被Arraylist代替,可是須要知道油脂和氣個東西
,代碼也插一下
1 public static void demo() { 2 Vector v = new Vector(); // 建立集合對象,List的子類 3 v.add("a"); // 在集合出現後,爲了實現list的接口,添加的功能 4 v.addElement("a"); // Vector類出現自己就有的特有的功能 5 v.addElement("b"); 6 v.addElement("c"); 7 v.addElement("d"); 8 9 // Vector迭代s 10 Enumeration en = v.elements(); // 獲取枚舉 11 while (en.hasMoreElements()) { // 判斷集合中是否有元素 12 System.out.println(en.nextElement());// 獲取集合中的元素 13 } 14 }
數組是:查詢快修改快,增刪慢
鏈表是,查詢慢修改慢,增刪快
ArrayList:
底層數據結構是數組,查詢快 ,增刪慢,
線程不安全,效率高
LinkedList:
底層數據結構是鏈表,查詢慢,增刪快
線程不安全,效率高
Vector:
底層數據結構是數組,查詢快,增刪慢。
線程安全,效率低
Vector 相對於 ArrayList 查詢慢(線程安全)
相對於 LinkedList 增刪慢 (數組結構)
Vector 和 ArrayList 的區別:
Vector是線程安全效率低
ArrayList是線程不安全效率高
共同點:都是數組實現的
ArrayList和LinkedList的區別:
ArrayList 底層是是數組結果 查詢快,增刪慢
LinkedList 底層是鏈表結果 查詢慢,增刪快
共同點:線程都是不安全的
List的三個兒子:
查詢多,增刪慢用ArrayList
增刪多,查詢慢用 linkedList
若是都多就用 ArraayList