1. 程式人生 > >5.5學習內容總結

5.5學習內容總結

byw999

一:
1.問題:使用ArrayList集合存儲元素遍歷的時候,按照正常的操作出現了問題,
當前ArrayList集合中存儲了兩種類型的元素分別String和Integer類型,在遍歷的時候,使用的是String接收的,對於Integer類型就出現了異常!
回想數組:
String[] str = new String[3] ;
str[0] = "hello" ;
str[1] = "world" ;
str[2] = 100 ; 錯誤的,

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

<數據類型> --- 引用數據類型

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

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

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

    看API,接口,類,方法上有<E> ,都是泛型
    3.泛型高級(通配符)
    <?> :代表任意類型Object類型,或者任意的Java類

    <? extends E>:向下限定,E的子類或者E這個類型
    <? super E>:向上限定,E及其他的父類
    4.ArrayList是List接口中常用的一個子實現類

    遍歷功能:
    1)一個是Collection的iterator()
    2)size()和get(int index)普通for循環
    5.Vector集合
    底層是一種可增長對象數組,查詢快,增刪慢
    線程安全,同步,執行效率高

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

    boolean hasMoreElements() --->boolean hasNext() ;
    Object nextElement() --->Object next() ;
    6.LinkedList集合的特點:
    底層是一種鏈表實現,查詢慢,增刪快
    線程不安全的,不同步,執行效率高

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

    刪除功能
    public Object removeLast()
    7.需求:給集合中添加重復的元素(字符串類型),將重復的元素從集合去除掉!

    思路:
    1)創建一個舊集合,添加重復元素
    2)創建一個新集合
    3)遍歷舊集合中的元素獲取到每一個元素
    在舊集合中判斷新集合中是否包含舊集合中的元素
    包含,不搭理
    不包含,添加到新集合中

    4)遍歷新集合

public class ArrayListTest {

public static void main(String[] args) {

    //創建一個集合
    ArrayList list = new ArrayList() ;

    //添加元素
    list.add("hello") ;
    list.add("world") ;
    list.add("java") ;
    list.add("javaee") ;
    list.add("hello") ;
    list.add("world") ;
    list.add("hello") ;
    list.add("javaee") ;
    list.add("android") ;
    list.add("python") ;
    list.add("php") ;
    list.add("php") ;
        Iterator it2 = newList.iterator() ;
    while(it2.hasNext()) {
        String s = (String) it2.next() ;
        System.out.println(s);
    }
}

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

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

註意:
1)變量名:看成一個數組
2)使用的時候數據類型...
9.ArrayList集合存儲自定義對象並遍歷,有幾種方式?
Iterator iterator() ;
listIterator listiterator();(可以不寫)
普通for循環:size()/get(int index)
增強for循環
10.針對數組操作的工具類:Arrays,提供了一個方法:
public static <T> List<T> asList(T... a) :將數組轉換成固定大小的集合

註意:如果使用此方法,那麽集合的長度不可變

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

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

增強for循環的弊端:如果集合的對象是null,如果再次對集合操作,就會出現異常
對集合進行判斷,非空判斷解決

12.靜態導入:Jdk5一個新特性
特點:
1)前提是該方法必須是靜態的
2)導入到的一個方法的級別

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

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

常用類中哪個類中靜態方法最多:Math

*之前導包:java.util.Scanner; 導入到類的級別


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

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

    Map集合:是一種鍵和值的映射關系(雙列集合)     當作為:夫妻對
    Collection集合:單列集合,只能存儲一種類型的元素,當作為:光棍
間接關系:HashSet依賴於Map接口的子實現類HashMap的
       TreeSet依賴於Map接口的子實現類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():判斷映射關系是否為空
  1. Map集合的另一種方式的遍歷 Set<Map.Entry<K,V>> entrySet() :和Map集合的遍歷有關系(鍵值對對象)

    • 轉發法: 1)獲取所有的結婚證 2)通過結婚證分別找對應的丈夫和妻子 3)遍歷輸出
      3.Set集合和List集合的區別?
      Set集合:不允許元素重復,唯一的(元素可以為null) ,不能保證叠代的順序恒久不變(底層哈希表和hascode)
      無序(存儲和取出不一致)
      List:允許元素重復,並且存儲特點:有序性(存儲和取出一致)
      4.發現Set集合存儲元素的時候,可以保證元素的唯一性,原因什麽?

    看源碼:
    @author Administrator

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

    String本身重寫了equals方法,所以不需要再重寫了!
    5.如果在開發中,元素唯一性,並且還要保證元素有序(存儲和取出一致),使用LinkedHashSet集合

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

LinkedHashSet集合:
底層是一種鏈接列表和哈希表組成
可以保證元素的唯一性,是由哈希表決定的(hashCode()和equals())
可以保證元素的叠代順序一致(有序),存儲和取出一致,是由鏈表決定
6.如果在開發中,元素唯一性,並且還要保證元素有序(存儲和取出一致),使用LinkedHashSet集和
如果開發中要使用集合排序的問題,使用TreeSet集合(紅黑樹結構),下午分解...
自然排序
選擇器排序
LinkedHashSet集合:
底層是一種鏈接列表和哈希表組成
可以保證元素的唯一性,是由哈希表決定的(hashCode()和equals())
可以保證元素的叠代順序一致(有序),存儲和取出一致,是由鏈表決定
7.TreeSet集合模擬情況下是通過自然順序對集合中的元素排序

        TreeSet:
                可以保證元素唯一並且元素排序(Integer類型的元素自然升序)
                自然排序
                比較器排序

8.TreeSet集合的構造方式不同,使用的排序也不同
自然排序:自定義的類實現Compareable接口,然後創建TreeSet對象,通過無參構造形式創建對象
比較器排序 :public TreeSet(Comparator<E> comparator)

        兩種方式:
            1)自定義一個類,該類實現Comparator接口,重寫Comparator接口中的compare()方法
                2)直接使用接口匿名內部類的方式實現

5.5學習內容總結