Java範型和集合

(一)泛型
(1)數組直接定義了存儲的類型,防止出現其他類型的元素,集合能不能也像數組一樣,直接規定我們集合的存儲類型,針對這種情況
一種技術:泛型
<數據類型> --- 引用數據類型

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

泛型的引出可以提供程序的安全性!
(2)將泛型定義在類上
在早期的時候,使用Object類型代表任意類型,向上轉型沒有問題,
使用向下轉型的時候,可能會出現問題(需要的類型有問題),這個時候就需要引入泛型操作

看API,接口,類,方法上有<E> ,都是泛型
把泛型定義在類上,提高程序安全性
解決了向下類型轉換出現的問題:ClassCastException
問題:可以將泛型定義在類上,可不可以在類上不定義泛型,將泛型應用在方法上?
是可以在方法上定義的!
(3)將泛型定義在接口上
型的應用:在接口中,類中,方法上應用,在集合中應用最多!

接口中泛型,子實現類的第一種情況,就是已經知道是什麼類型了
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");
}

}
(4)泛型高級(通配符)
<?> :代表任意類型Object類型,或者任意的Java類
<? extends E>:向下限定,E的子類或者E這個類型
<? super E>:向上限定,E及其他的父類
(二)集合
(1)ArrayList
ArrayList是List接口中常用的一個子實現類

遍歷功能:
    1)一個是Collection的iterator()
    2)size()和get(int index)
    3)普通for循環
  4)增強for循環 
    5)針對數組操作的工具類:Arrays,提供了一個方法:
  • public static <T> List<T> asList(T... a) :將數組轉換成固定大小的集合

    注意:如果使用此方法,那麼集合的長度不可變
    (2)Vector集合
    底層是一種可增長對象數組,查詢快,增刪慢
    線程安全,同步,執行效率高

    特有功能:

  • public void addElement(Object obj)------->add(Object obj)
  • public Enumeration elements():返回此向量的枚舉--->相當於:public Iterator iterator()
  • boolean hasMoreElements() --->boolean hasNext() ;
  • Object nextElement() --->Object next() ;
    (3)LinkedList集合
    LinkedList集合的特點:
    底層是一種鏈表實現,查詢慢,增刪快
    線程不安全的,不同步,執行效率高

    特有功能:
    添加功能

  • addFirst(Object e):將指定的元素插入到列表的開頭
  • addLast(object e):將指定的元素添加到列表末尾
    獲取功能:
  • getFirst():獲取列表第一個元素
  • getLast():獲取列表第二個元素
  • 刪除功能
  • public Object removeFirst()移除並返回此列表的第一個元素。
  • public Object removeLast()
    (4)集合的嵌套遍歷
    //增強for遍歷:大集合
    for(大集裏面的數據類型<小集合數據類型> 變量名: 大集合對象名) {
    for(小集合裏面的數據類型 變量名:小集合對象名) {
    System.out.println(s.getName()+"---"+s.getAge());
    }
    }
    (5)Map集合
    1) 需求:有很多學生,學生有姓名,有學號,根據學生的學號查找學生?
    之前學習的集合,可以將姓名,學號作爲學生類的中兩個成員變量,創建集合的時候存儲這個類型,可以的
  • 關鍵只知道學生學號,通過學號找姓名
    Key Value

    學號1 姓名1
    學號2 姓名2
    學號3 姓名3
    學號1(重複的鍵) 姓名4

    Java針對這種技術----->Map集合 ,鍵值的映射關係的一種集合(接口)
    將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。
    Map<K,V> ,在Map集合中,只針對鍵有效,跟值無關
    2)
    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():判斷映射關係是否爲空
    3)兩種遍歷方法
    1、這種遍歷方式實際開發中經常用的...
    Set<K> keySet():獲取映射關係中所有的鍵的集合

    V get(Object key):通過鍵找值
    轉換法:
    1)將所有的丈夫集中起來
    2)讓丈夫它對應的妻子
    3)將他們遍歷出來
    Map集合的另一種方式的遍歷 Set<Map.Entry<K,V>> entrySet() :和Map集合的遍歷有關係(鍵值對對象)

    轉發法: 1)獲取所有的結婚證 2)通過結婚證分別找對應的丈夫和妻子 3)遍歷輸出

    思路: 1)獲取所有的鍵值對象entrySet()
    2) K getKey() 和 v getValue(),獲取鍵值對對象中的每個鍵和每個值
    3)遍歷

    思路:
    1)獲取所有的鍵的集合
    2)通過鍵找它對應的值
    3)遍歷即可
    (6)Set集合
    1)Set集合和List集合的區別?
    Set集合:不允許元素重複,唯一的(元素可以爲null) ,不能保證迭代的順序恆久不變(底層哈希表和hascode)
    無序(存儲和取出不一致)

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

    String本身重寫了equals方法,所以不需要再重寫了!
    3)自定義的類並沒重寫於hashCode()和equals()方法這兩個方法,解決,重寫這兩個方法

    (三)JDK5以後的新特性
    Jdk5以後的新特性:
    增強for,靜態導入,可變參數,泛型,自動拆裝箱..
    (1)可變參數:當一個方法的參數個數不確定的時候,要使用可變參數
    格式:
    修飾符 返回值類型 方法名(數據類型...變量名){...}
    注意:
    1)變量名:看成一個數組
    2)使用的時候數據類型...

    注意:根據具體的需求去完成,一般情況,知道有這個特性就可以了
    (2)增強for
    增強for循環的格式
    for(數據大類型 變量名 : 數組或者集合對象名){
    輸出變量即可!
    }

    增強for的出現時替代迭代器的,所以在遍歷集合或者遍歷數組就可以使用增強for去完成

    增強for循環的弊端:如果集合的對象是null,如果再次對集合操作,就會出現異常
    對集合進行判斷,非空判斷解決
    (3)靜態導入
    特點:
    1)前提是該方法必須是靜態的
    2)導入到的一個方法的級別

    靜態導入的格式:

  • import static 包名.類名.方法名;

    *import static java.util.ArrayList.add; 方法必須是靜態方法
    常用類中哪個類中靜態方法最多:Math

    之前導包:java.util.Scanner; 導入到類的級別
    靜態導入是導入到方法的級別
    注意:本身當前的某個類中的方法名和需要被靜態導入的方法名一樣,必須加上前綴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章