JavaSE------集合(容器)

容器
Collection(單值)
    |--Set:無序,不允許重複    子接口-->SortedSet
    |        |--HashSet
    |        |--TreeSet:插入數據時是沒有順序的,輸出之後數據是有順序的,所以TreeSet是可以排序的子類
    |--List:有序,允許重複
        |--ArrayList
        |--LinkedList
        |--Vector
            |--Stack
Map(鍵值對)


    1、ArrayList與Vector的區別
        推出時間    ArrayList新的子類JDK1.2推出;Vector是JDK1.0時推出是舊的子類
        性能        ArrayList採用異步處理方式,性能更高;Vector採用同步處理方式性能較低
        線程安全    ArrayList屬於非線程安全的操作類;Vector屬於線程安全的操作類
        數據增長    需要增長時,ArrayList增長時只增長原數組的一半;Vector增長時成倍增長
    2、ArrayList與LinkedList的區別
        ArrayList、LinkedList都是List接口(列表)的子類,但他們的內部實現不同
        ArrayList採用數組實現List,而LinkedList採用雙向鏈表實現List,因此:
        ArrayList存取速度快,插入刪除慢,LinkedList存取速度慢,插入刪除快。
    3、Collection與Collectons的區別
        Collection是單值集合類(容器)的最大父接口,繼承於它的主要子接口有List、Set
        Collections是針對集合實現類(如ArrayList)的幫助類,他提供一系列靜態方法實現各種集合的查找、排序等操作

    4、運算符“==”與方法“equals()”的區別

         指針:內存地址,用於間接訪問內存單元。

         引用:爲一個變量、函數等對象規定一個別名,該別名稱爲引用。此後,對別名的操作即是對別名所代表的對象的操作。即引用變量創建了變量和對象的別名。
引用雖是一種類型,但不是值,只能用它標識另一個對象。從理論意義上說,引用是一種映射,把一個標識符映射到一個對象。從直觀意義上說,引用是用一個標識符給一個對象起了一個別名,引用標識對象,就是用一個別名標識對象。

        “==”運算符用於比較地址,equals用於比較內容
        Java中內存分4塊:棧、堆、全局數據區、全局代碼區
        值類型是存儲在內存中的堆棧(以後簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。
        ==用於比較引用和比較基本數據類型時具有不同的功能:
        ==操作比較的是兩個基本類型變量的值(內容)是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同(即比較引用指向的對象的地址),即棧中(在棧中存放的位置不同)的內容(即對象的地址)是否相等。(記住:堆中存放的是對象本身)
        equals操作表示的兩個變量是否是對同一個對象(在堆中存放的位置不同)的引用,即堆中的內容是否相同。equals()只能用於對象的比較。
        如:a.equals(b),因爲equals比較的是兩個對象,所以a,b都不能爲基本數據類型,否則會出編譯錯誤。(在jdk1.5以上版本中,b可以爲基本數據類型,a不可以)
        注意:這裏要當心空指向異常
    5、Comparable接口(制定對象比較的標準)
        基本數據類型和String類型數據,它們的比較標準Java語言本身已經提供好了,而用戶自定義類對象間的比較標準Java語言是沒有提供的,所以如果要進行用戶自定義類對象間的比較、排序、查找等操作時,我們就必須制定這些對象之間的比較標準,即實現Comparable接口,覆寫接口中的compareTo()方法或者實現Comparator類並實現compare()方法。
    6、Object類的主要方法:toString()、equals()、hashCode()
        ①Java中有兩類集合(Collection),一類是List,一類是Set,前者是有序的,元素可以重複,後者是無序的,元素不可以重複 那麼在set類型的集合中,如何判斷元素是否重複呢,這就需要使用Object.equals方法,但如果元素很多了,添加一個新元素時,比較的次數 就很多,例如已經有100個元素了,添加第101個元素時,就要和前面的元素比較100次,效率很低。有一種數據結構,可以快速的查找所需要的對象,即將數據依據算法直接指定到一個地址上。這就是散列表(hash table)。在Java中哈希表用以鏈表爲元素的數組即鏈表數組實現。每個鏈表被稱爲桶(bucket)。當存儲一個新元素時,先調用元素的hashcode方法,計算出相應的桶的地址(鏈表的頭結點),如果這個桶中沒有元素,就直接存儲了,如果有元素,會調用equals方法進行比較,如果相等的就不存了,不相等的話就保存到另外一個桶上;如果兩個對象相等,則hascode一定相等,如果hascode相等,並不表示兩個對象相等。
        ②實際上,Object.hashCode()是一個與本地OS相關的方法,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM 編程語言不需要這種實現技巧。)而String、Integer等類已經覆些了Object類的hashCode()方法、equals()方法。自定義的類是Object類的子類,默認繼承了Object.equals()方法,默認是比較地址的 。(可以分別查看Object類、String類、Integer類的toString()、HashCode()、equals()方法進行比較)
        ①、什麼是hashcode
            哈希表爲每個對象計算的一個整數,與對象的屬性和地址都有關。
        ②、hashSet中,爲什麼要重寫equals()、hashCode()方法
            向hashSet中添加元素時,先調用元素的hashcode方法,計算出相應的桶的地址(鏈表的頭結點),如果這個桶中沒有元素,就直接存儲了,如果有元素,會調用equals方法進行比較,如果相等的就不存了,不相等的話就保存到另外一個桶上;如果兩個對象相等,則hascode一定相等,如果hascode相等,並不表示兩個對象相等。
        ③、如何覆些equals()、hashCode()方法
            public boolean equals(Object obj){
                強制轉換成當前類對象(如A a = (A)obj)
                如果this和obj的內容是一模一樣的
                    返回true
                否則
                    返回false
            }
            public int hashCode(){
                return 包裝類或String對象的hashCode()方法(匿名對象.hashCode())
            }
    7、哈希表(數據結構知識)、比較器
        Java中Map接口的實現
        映射、哈希衝突、哈希因子、再散列(rehashed)


發佈了23 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章