曾經(jīng)的學(xué)習(xí)課堂筆記課件_第1頁
曾經(jīng)的學(xué)習(xí)課堂筆記課件_第2頁
曾經(jīng)的學(xué)習(xí)課堂筆記課件_第3頁
曾經(jīng)的學(xué)習(xí)課堂筆記課件_第4頁
曾經(jīng)的學(xué)習(xí)課堂筆記課件_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、List 接口ArrayList LinkedListVector : 底層也是數(shù)組,所以增刪效率低,查詢效率高。線程安全(加同步了!)Stack: 繼承自 Vector,是堆棧。 特點是:先進后出,后進先出。Stack 是一個失敗品, 因為它的作者直接讓 Stack 繼承了 Vector是堆棧,只能說它想一個堆棧。下面的才是純正的堆棧。搞得四不像。 不能說它Set 接口 : 整個 Set 分支的特點是無順序,不能重復(fù)。 如下class Stack priva inkedList list = new LinkedList();public void push(Object obj) list

2、.addLast(obj);public Object pop() return list.pollLast();publicsize() return list.size();Set 的 api.增addaddAll刪removeremoveAllclear() 略。改沒有修改的方法。查iterator()獲取迭代器, 其他的查方法略。Set|-HashSet|-TreeSet|-LinkedHashSetHashSet : 特點 增刪效率高, 查詢效率高。 缺點:占用空間大。知道,Set 的特點是 無順序 不能重復(fù)。要保證集合 Set 中的元素不重復(fù),可以這樣做:拿著每次將要新加入 set

3、 集合中的元素,和 set 中已有的每一個元素進行比較,如果發(fā)現(xiàn)有相同的,則不添加,如果和 set 中已有的元素全家比較完畢以后,沒有發(fā)現(xiàn)相同的元素,則新元素就加入 set 集合中。 這樣雖然能保證元素不重復(fù),但是效率太低,試想,如果集合中此時已經(jīng)有 1000 個元素了,那么新元素的情況要比較 1000 次。所以上面提到比較方法不可取!Java 中,使用 HashSet 來解決這個問題,HashSet 使用“哈?!八惴?,使用”哈?!彼惴?,無論集合中有多少個元素,都只需要比較幾次,就知道新元素是否與舊元素重復(fù)。理解“哈?!八惴?、 java 中的每一個對象,都有一個”哈希碼” , 哈希碼,其實就

4、是一個整數(shù)。2. HashSet,在添加一個對象到集合中時,是拿著對象的“哈希碼“進行分配,也就是說,”哈希碼“相同的對象,被分配到同一片區(qū)域,新對象只和同一片區(qū)域中的元素比較!3.兩個對象的內(nèi)容相同,則,哈希碼相同兩個對象的哈希碼相同,則內(nèi)容不一樣相同。兩個對象哈希碼不同,則兩個對象的內(nèi)容肯定不相同。(聯(lián)想宿舍)注意,系統(tǒng)內(nèi)置的類沒有問題,但是自己定義的類,在調(diào)用 hashCode 得到對象的哈希碼時,因為自定義的類沒有重寫 Object 的 hashCode 方法,所以直接調(diào)用的是 Object 的 hashCode 方法。而 Object 的 hashCode 方法是直接返回對象在內(nèi)存中

5、的地址的!也就是說, Object 的 hashCode 返回的內(nèi)容與對象的內(nèi)容無關(guān)!此時,如果把 p 和 p2 添加到 HashSet 中,因為 p 和 p2 的哈希碼不同,所以進入了不同區(qū)域。所以沒有引起比較,如下:為了解決這個問題首先要在類中重寫 Object 的 hashCode 方法,保證 hashCode不再返回地址,而是根據(jù)對象的內(nèi)容生成! 也就是保證內(nèi)容相同的的哈希碼!如下:對象,返回相同package com.xaeduask.test;import java.util.HashSet;import java.util.Set;classprivate String name

6、;privateage;public(String name,age) = name;this.age =age;public String toString() return name= + name + , age= + age + ;publichashCode() return name.hashCode() + age;public class Demo3 public sic void main(String args) Set set = new HashSet();結(jié)果發(fā)現(xiàn),集合中仍然是 2 個元素.為什么呢?此時僅僅保證了內(nèi)容相同的元素進入同一片區(qū)域,進而引起比較。 而關(guān)鍵就

7、在于比較!引起比較時,就是調(diào)用 equals 方法! 而此時又沒有重寫equals,所以調(diào)用的是 Object中的 equals 方法,所以就算此時引起比較了, 但是也比較的是地址呀!所以還要重寫equals 方法! 保證 equals 不是比較地址,而是比較內(nèi)容,如下:package com.xaeduask.test;import java.util.HashSet;import java.util.Set;classprivate String name;privateage;public(String name,age) = name;this.age =age;public Stri

8、ng toString() return name= + name + , age= + age + ;publichashCode() return name.hashCode() + age;publicequals(Object obj) System.out.prln(this + vs + obj); if(obj instanceof) p = ()obj;return name.equals() & age = p.age;return false;public class Demo3 p = new(a, 1);p2 = new(a, 1); System.out.prln(p

9、.hashCode(); System.out.prln(p2.hashCode(); set.add(p);set.add(p2);System.out.prln(set.size();什么時候需要重寫 hashCode 和equals 方法? 當(dāng)自己定義的類的對象,要加入 HashSet 集合中的時候,才去重寫這兩個方法。TreeSet: 特點, 能夠?qū)现械脑剡M行自然排序。如下,可以對數(shù)字排序如下,可以對字符串排序public sic void main(String args) Set set = new HashSet();p = new(a, 1);p2 = new(b, 2)

10、;p3 = new(c, 3); System.out.prln(p.hashCode(); System.out.prln(p2.hashCode(); System.out.prln(p3.hashCode(); set.add(p);set.add(p2);set.add(p3);System.out.prln(set.size();注意,TreeSet 中只能添加相同類型的數(shù)據(jù)。試試自定義的類的對象加入 TreeSet 中是否會排序? 不會,而且報錯了!因為 TreeSet 根本不知道如何比較兩個人!這樣解決以上問題: 如果一個類的對象要加入 TreeSet 中,則該類就要實現(xiàn)一個接口

11、:parablepackage com.xaeduask.test;import java.util.Set;import java.util.TreeSet;classimplements Comparable private String name;privateage;public(String name,age) = name;this.age =age;public String toString() return name= + name + , age= + age + ;/ 返回 小于0 表示 當(dāng)前對象小于參數(shù)/ 返回 等于0 表示 當(dāng)前對象等于參數(shù)/ 返回 大于0 表示 當(dāng)前

12、對象大于參數(shù)publiccompareTo(Object obj) System.out.prln(this + vs + obj); if(!(obj instanceof) throw new RuntimeException(這不是人!);p = ()obj;LinkedHashSet:和 HashSet 一樣,只不過了順序而已。Map 接口:如下:Map 分支的特點是,以鍵值對存放元素,其中鍵值不能重復(fù),值能重復(fù)。Map 的 api.增put(Object key, Object value);r = neweger(age).compareTo(p.age);if(r = 0) re

13、turnpareTo();return r;public class Demo3 public sic void main(String args) p = new(a, 30);p2 = new(b, 20);p3 = new(c, 20); Set set = new TreeSet(); set.add(p);set.add(p2);set.add(p3); System.out.prln(set);putAll(Map )刪remove(Object key)clear();改put,put 時,鍵值和已有鍵值重復(fù),即是覆蓋查containsKeyconstainsValueget(O

14、bject key) 根據(jù)鍵值獲取值。如果鍵值不存在,則返回 nullisEmpty();size()獲取 map 中鍵值對的對數(shù)values() 獲取由 map 中所有值組成的集合,返回 Collectionkeyset ,獲取由 map 中所有鍵組成的集合,返回 SetentrySet ,獲取由map 中鍵值對,組成的集合。HashMap, 不用講了, 其實是 HashSet 的底層實現(xiàn)。TreeMap,不同講了,其實是 TreeSet 的底層實現(xiàn)。工具類CollectionsSort 專門對List 排序Reverse, 翻轉(zhuǎn)集合中的元素 、shuffle 隨機打亂元素順序swap()

15、交換兩個元素的位置Arrays 專門操作數(shù)組sort 排序asList, 生成一個只讀List,并且初始化。泛型的使用泛型能把運行期的錯誤,轉(zhuǎn)移到編譯期,能讓程序員快速改錯。強制某個集合中的元素的類型!自定義泛型類。(挖坑)經(jīng)典面試題.ArrayList 和 Vector 的區(qū)別當(dāng)集合中的 元素放滿時,ArrayList 每次增長為原來的一半,Vector 每次增長為原來的一倍。ArrayList 是線程不安全的,Vector 是線程安全的class Foo private T; private S second;public T get() return;public void set(T)

16、 this.=;public S getSecond() return second;public void setSecond(S second) this.second = second;ArrayList 和 LinkedList 的區(qū)別因為 ArrayList 底層是數(shù)組實現(xiàn)的,元素都是連續(xù)存放的,所以查詢效率高,增刪效率低。因為 LinkedList 底層是鏈表實現(xiàn)的,元素都是不連續(xù)存放的,所以查詢效率低,增刪效率高。Collection 和Collections 的區(qū)別Collection 是集合框架中的一個父接口,它有兩個子接口,分別是List 和 Set Collections 是集合框架中的一個工具類,其中的方法都是靜態(tài)方法。HashMap 和 Hashtable 的區(qū)別HashMap 可以用 null 作為鍵值或值,Hashtable 不能!

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論