1. 程式人生 > >Colliction子集(list ,set, Arraylist, Vector.....)

Colliction子集(list ,set, Arraylist, Vector.....)

奮鬥的蝸牛

1.泛型
<數據類型> --- 引用數據類型
泛型:將明確的集合類型的工作推遲到了創建對象或者調用方法的時候,屬於一種參數化類型,可以 作為參數傳遞.
A. 泛型的好處:
1)將運行時期異常提前到了編譯時期
2)優化了設計,解決了×××警告線問題
3)避免了強制類型轉換

泛型的引出可以提供程序的安全性!

B.在早期的時候,使用Object類型代表任意類型,向上轉型沒有問題,
使用向下轉型的時候,可能會出現問題(需要的類型有問題),這個時候就需要引入泛型操作

    看API,接口,類,方法上有<E> ,都是泛型

C把泛型定義在類上,提高程序安全性
//解決了向下類型轉換出現的問題:ClassCastException

public class ObjectTool<T> {

private T obj ;

public T getObj() {
    return obj ;
}

public void setObj(T obj) {
    this.obj = obj ;
}

}

package org.westos_03;

public class ObjectToolDemo {

public static void main(String[] args) {

    //創建ObjectTool對象
    ObjectTool<String> ot = new ObjectTool<String>() ;

    //賦值
    ot.setObj(new String("高圓圓"));
    String s = ot.getObj() ;
    System.out.println("姓名是:"+s);

// ot.setObj(new Integer(27)); 直接隱藏的問題解決了
System.out.println("---------------");

    ObjectTool<Integer> ot2 = new ObjectTool<Integer>() ;
    ot2.setObj(new Integer(27));

// ot2.setObj(new String("高圓圓"));
Integer i = ot2.getObj() ;
System.out.println("年齡是:"+i);

}
}

D把泛型可以定義在方法上
package org.westos_04;

//public class ObjectTool<T> {
//
// //提供一些成員方法
// /public void show(String s) {
// System.out.println(s);
// }
//
// public void show(Integer i) {
// System.out.println(i);
// }
//
// public void show(boolean b) {
// System.out.println(b);
// }
/
//
// public void show(T t) {
// System.out.println(t);
// }
public class ObjectTool{

//泛型是可以在方法上定義的
public <T> void show(T t) {
    System.out.println(t);
}

}

package org.westos_04;

public class ObjectToolDemo {

public static void main(String[] args) {

    //創建ObjectTool類的對象
    /*ObjectTool ot = new ObjectTool() ;
    ot.show("hello");
    ot.show(100);
    ot.show(true);*/

    //在類上定義了泛型,方法的參數T類型去接收

// ObjectTool<String> ot = new ObjectTool<String>() ;
// ot.show("hello");
// ObjectTool<Integer> ot2= new ObjectTool<Integer>() ;
// ot2.show(100);
// System.out.println("---------");

    //可以將泛型定義在類上,可不可以在類上不定義泛型,將泛型應用在方法上?
    //是可以在方法上定義的!
    ObjectTool ot = new ObjectTool() ;
    ot.show("hello");
    ot.show(true);
    ot.show(100);
}

}

E//將泛型定義在接口上
public interface Inter<T> {

//接口中變量是常量: public static final  int num ;

public abstract void show() ; //抽象方法

}

//泛型的應用:在接口中,類中,方法上應用,在集合中應用最多!

//接口中泛型,子實現類的第一種情況,就是已經知道是什麽類型了
//public class InterImpl implements Inter<String> {
//
// @Override
// public void show() {
// System.out.println("hello");
// }
//
//}

//第二種情況,就是不知道具體的類型是什麽
public class InterImpl<T> implements Inter<T>{

@Override
public void show() {
    System.out.println("hello");
}

}

//測試類
public class InterDemo {

public static void main(String[] args) {

    //第一種情況的測試
    //創建接口的子實現類對象
    Inter<String> i = new InterImpl() ;
    i.show();

    System.out.println("---------------------");

    //第二種情況
    Inter<Integer> i2 = new InterImpl<Integer>();
        i2.show() ;

    Inter<String> i3 = new InterImpl<String>() ;
    i3.show();

}

}

F 泛型高級(通配符)
<?> :代表任意類型Object類型,或者任意的Java類 ;
<? extends E>:向下限定,E的子類或者E這個類型;
<? super E>:向上限定,E及其他的父類;

2.ArrayList是List接口中常用的一個子實現類

ArrayList集合存儲自定義對象並遍歷,有幾種方式?
  • Iterator iterator() ;
  • listIterator listiterator();(可以不寫)
  • 普通for循環:size()/get(int index)
  • 增強for循環

    1. Vector集合
      底層是一種可增長對象數組,查詢快,增刪慢
      線程安全,同步,執行效率高

      特有功能:
      public void addElement(Object obj)------->add(Object obj)
      public Enumeration elements():返回此向量的枚舉--->相當於:public Iterator iterator()
      boolean hasMoreElements() --->boolean hasNext() ;
      Object nextElement() --->Object next() ;

    2. LinkedList集合的特點:
      底層是一種鏈表實現,查詢慢,增刪快
      線程不安全的,不同步,執行效率高

    特有功能:
    添加功能
    addFirst(Object e):將指定的元素插入到列表的開頭
    addLast(object e):將指定的元素添加到列表末尾
    獲取功能:
    getFirst():獲取列表第一個元素
    getLast():獲取列表第二個元素

    刪除功能
    public Object removeFirst()移除並返回此列表的第一個元素。
    public Object removeLast()

  1. 可變參數:當一個方法的參數個數不確定的時候,要使用可變參數

    格式:
    修飾符 返回值類型 方法名(數據類型...變量名){...}

    註意:
    1)變量名:看成一個數組
    2)使用的時候數據類型...

    註意:根據具體的需求去完成,一般情況,知道有這個特性就可以了

    1. 針對數組操作的工具類:Arrays,提供了一個方法:
      public static <T> List<T> asList(T... a) :將數組轉換成固定大小的集合;

      註意:如果使用此方法,那麽集合的長度不可變(長度不變的情況下內容可以變;

    7.Jdk5以後的新特性:
    增強for,靜態導入,可變參數,泛型,自動拆裝箱...
    增強for循環的格式
    for(數據大類型 變量名 : 數組或者集合對象名){
    輸出變量即可!
    }

        增強for的出現時替代叠代器的,所以在遍歷集合或者遍歷數組就可以使用增強for去完成
    
        增強for循環的弊端:如果集合的對象是null,如果再次對集合操作,就會出現異常
            對集合進行判斷,非空判斷解決
    1. 靜態導入:Jdk5一個新特性
      特點:
      1)前提是該方法必須是靜態的
      2)導入到的一個方法的級別

      靜態導入的格式:
      import static 包名.類名.方法名;

      import static java.util.ArrayList.add; 方法必須是靜態方法

    2. Map集合 ,鍵值的映射關系的一種集合(接口)
      將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值。
      Map<K,V> ,在Map集合中,只針對鍵有效,跟值無關 Map接口的子實現類:HashMap和TreeMap

    Map接口的功能:
    V put(K key,V value) :添加功能:將指定的值和鍵關聯起來
    如果當前的這個鍵是一次存儲,則返回值null
    如果不是第一次存儲,返回值是第一次對應的值,當前的值就把之前的鍵對應的值替換掉!

    獲取功能
    Set<Map.Entry<K,V>> entrySet()  :和Map集合的遍歷有關系(鍵值對對象)    
    Set<K> keySet():獲取映射關系中所有的鍵的集合
    int size()返回此映射中的鍵-值映射關系數
    刪除功能
    void clear():刪除所有映射關系

    Vremove(Object key)如果存在一個鍵的映射關系,則將其從此映射中移除

    判斷功能:
    boolean containsKey(Object key)如果此映射包含指定鍵的映射關系,則返回 true
    boolean containsValue(Object value):映射關系中是否包含指定的值
    boolean isEmpty():判斷映射關系是否為空

10.發現Set集合存儲元素的時候,可以保證元素的唯一性,原因什麽?

看源碼:

@author Administrator

HashSet集合的add方法底層依賴於雙列集合HashMap,它依賴於兩個方法,HashCode()方法和equals()方法
先比較字符串的HashCode()碼值一樣,再比較equals()方法
如果hasCode碼值一樣,還要比較內容是否相同,由於存儲String,重寫了equals()方法

String本身重寫了equals方法,所以不需要再重寫了!

讓你用Set集合存儲自定義對象遍歷!!!!
set集合存儲自定義對象並遍歷
自定義的類,HashSet集合的add()方法本身依賴於hashCode()和equals()方法
在Student類中並沒重寫這兩個方法,解決,重寫這兩個方法

11.Set集合和List集合的區別?
Set集合:不允許元素重復,唯一的(元素可以為null) ,不能保證叠代的順序恒久不變(底層哈希表和hascode)
無序(存儲和取出不一致)
List:允許元素重復,並且存儲特點:有序性(存儲和取出一致)

12.如果在開發中,元素唯一性,並且還要保證元素有序(存儲和取出一致),使用LinkedHashSet集合

如果開發中要使用集合排序的問題,使用TreeSet集合(紅黑樹結構),下午分解...
自然排序
選擇器排序

LinkedHashSet集合:
底層是一種鏈接列表和哈希表組成
可以保證元素的唯一性,是由哈希表決定的(hashCode()和equals())
可以保證元素的叠代順序一致(有序),存儲和取出一致,是由鏈表決定

13.自然排序和選擇器排序
TreeSet支持兩種排序方式:自然排序和自定義選擇器排序,默認情況下是自然排序。
在JDK中,有一部分類實現了Comparable接口,如Integer,Double和String等,Comparable接口有一個compareTo(Object o)方法,它返回整數類型,對於表達式x.compareTo(y),如果返回值為0,表示x和y相等,如果返回值大於0,表示x大於y,如果小於0,表示x<y,TreeSet調用對象的compareTo()方法比較集合中對象的大小,然後進行升序排序,這種方式稱為自然排序。
當元素自身不具備比較性時,或者具備的比較性不是所需要的,這時就需要讓集合自身具備比較性,即自定義選擇器,並在集合初始化時,就有了比較方式
當兩種排序都存在時,以比較器為主,定義一個類,實現Comparator接口,覆蓋compare方法。

14.面試題:
Map集合和Collection的區別?

    Map集合:是一種鍵和值的映射關系(雙列集合)     當作為:夫妻對
    Collection集合:單列集合,只能存儲一種類型的元素,當作為:光棍
間接關系:HashSet依賴於Map接口的子實現類HashMap的
       TreeSet依賴於Map接口的子實現類TreeMap的

Colliction子集(list ,set, Arraylist, Vector.....)