集合框架:★★★★★,用于存儲數據的容器。 特點: 1:對象封裝數據,對象多了也需要存儲。集合用于存儲對象。 2:對象的個數確定可以使用數組,但是不確定怎么辦?可以用集合。因為集合是可 變長度的。
集合和數組的區別: 1:數組是固定長度的;集合可變長度的。 2:數組可以存儲基本數據類型,也可以存儲引用數據類型;集合只能存儲引用數據 類型。 3:數組存儲的元素必須是同一個數據類型;集合存儲的對象可以是不同數據類型。 數據結構:就是容器中存儲數據的方式。 對于集合容器,有很多種。因為每一個容器的自身特點不同,其實原理在于每個容器的 內部數據結構不同。 集合容器在不斷向上抽取過程中。出現了集合體系。 在使用一個體系時,原則:參閱頂層內容。建立底層對象。 Collection : 單列集合的根接口,Collection 表示一組對象,這些對象也稱為 collection 的元素。 List: 實現List接口的類會實現List中的所有方法。 特點: 有序的,元素可以重復。 ArrayList: 原理: 內部維護了一個Object類型的數組,默認數組大小為10. 特點: 查找比較快,增加和刪除比較慢。
LinkedList:原理:采用鏈接列表的形式來存儲數據的。 特點:查找比較慢,增加元素比較快 。
Set:: 實現Set接口的類會實現Set中所有方法。 特點: 無序的,元素是不可重復的。
LinkedList的特有方法: 1.常用的方法: addFirst(E e) addLast(E e)
descendingIterator() element() // 獲取第一個元素但是不刪除 E getFirst() //獲取第一個元素 getLast() // 獲取最后一個元素 removeFirst() 移除并返回此列表的第一個元素。boolean removeFirstOccurrence(Object o) 從此列表中移除第一次出現的指定元素(從頭部到尾部遍歷列表時)。 E removeLast() 移除并返回此列表的最后一個元素。 boolean removeLastOccurrence(Object o)
2.數據結構的方法: 1.棧數據結構 先進后出 push(E e) : 可以用來描述棧結構數據的存儲方式。 pop() 2.隊列的數據結構 先進先出 boolean offer(E e) : 可以用來描述隊列結構數據的存儲方式 poll()迭代器: descendingIterator() : 逆序打印集合中的元素 1.創建迭代器: Iterator i = linkedList.descendingIterator(); while(i.hasNext()){ System.out.PRintln(i.next()); } Vector : 線程安全的ArrayList 共同點: 原理和ArrayList是一樣的。 不同點: ArrayList是線程不安全的,效率高 // jdk1.2的時候才有。 Vector 線程安全的, 效率比較低。 —>一般不會在使用了。 jdk1.0就出現了
Set: 實現接口的類會實現Set中的所有方法。 特點: 無序的,元素不可重復。 HashSet: 通過哈希值來存取數據,存取過程比較快,底層是以哈希表來存值的。 線程是不安全的。
Set集合的特有方法: 方法和Collection中一樣的。
HashSet存值的原理: 會通過存放的對象調用hashCode方法,獲取到一個值,通過移位運算獲取到對應的地址值,存放到哈希表中。
情況1: 如果存放的位置不存在其他對象,直接將對象存放到該位置。 情況2: 如果存放的位置有了其他的對象,他會再次調用這個對象的equals方法做比較,如果返回的值是false,將這個對象直接存放到該位置,如果是true就不再存放。無序: 指添加元素的順序和元素在集合中存放的順序不一定相等。
TreeSet:也是實現Set接口。 實現原理: 采用紅黑樹(二叉樹)結構來存儲數據。 特點: 如果存入的對象有自然排序的特點,那么集合中的元素會根據自然排序的規律來對象集合中的元素進行排序。
TreeSet是通過 Comparator 來做比較的 調用對象的Comparator來比較的。
Comparator接口可以比較的對象類型。 ①、Comparator位于包java.util下,而Comparable位于包java.lang下。 ②、Comparable接口將比較代碼嵌入需要進行比較的類的自身代碼中,而Comparator接口在一個獨立的類中實現比較。 ③、如果前期類的設計沒有考慮到類的Compare問題而沒有實現Comparable接口,后期可以通過Comparator接口來實現比較算法進行排序,并且為了使用不同的排序標準做準備,比如:升序、降序。 ④、Comparable接口強制進行自然排序,而Comparator接口不強制進行自然排序,可以指定排序順序。
TreeSet是可以對字符串進行排序 的, 因為字符串已經實現了Comparable接口。
字符串的比較規則: 情況一: 對應位置有不同的字符出現, 就比較的就是對應位置不同的字符。 情況 二:對應位置上 的字符都一樣,比較的就是字符串的長度。TreeSet集合的使用注意點: 1.如果存入的對象有自然排序的特點,那么集合中的元素會根據自然排序的規律來對象集合中的元素進行排序。 2.如果沒有自然排序的特點就直接報錯。 3.如果元素沒有自然排序特點,需要讓元素所屬的類來實現Comparable 接口 ,實現compareTo的方法,然后通過這個方法來做比較。 4.如果元素沒有自然排序特點,也沒有實現Comparable接口,需要在創建集合的時候給他指定一個比較器,集合就會根據指定比較器進行排序。 java.util 接口 Comparator 類型參數: T - 此 Comparator 可以比較的對象類型 public interface Comparator 強行對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 或 Arrays.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如有序 set或有序映射)的順序,或者為那些沒有自然順序的對象 collection 提供排序。 public interface Comparable 此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。 int compareTo(T o) 比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數。 參數: o - 要比較的對象。 返回: 負整數、零或正整數,根據此對象是小于、等于還是大于指定對象。
定義一個比較器的方式:就是定義一個類實現Comparator接口 提供一個compare(Object o1, Object o2)方法作比較 equals boolean equals(Object obj) 指示某個其他對象是否“等于”此 Comparator。此方法必須遵守 Object.equals(Object) 的常規協定。此外,僅當 指定的對象也是一個 Comparator,并且強行實施與此 Comparator 相同的排序時,此方法才返回 true。因此,comp1.equals(comp2) 意味著對于每個對象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。 注意,不 重寫 Object.equals(Object) 方法總是 安全的。然而,在某些情況下,重寫此方法可以允許程序確定兩個不同的 Comparator 是否強行實施了相同的排序,從而提高性能。 覆蓋: 類 Object 中的 equals 參數: obj - 要進行比較的引用對象。 返回: 僅當指定的對象也是一個 Comparator,并且強行實施與此 Comparator 相同的排序時才返回 true。 Override 表示一個方法聲明打算重寫超類中的另一個方法聲明。
toString public String toString() 返回該對象的字符串表示。通常,toString 方法會返回一個“以文本方式表示”此對象的字符串。結果應是一個簡明但易于讀懂的信息表達式。建議所有子類都重寫此方法。 Object 類的 toString 方法返回一個字符串,該字符串由類名(對象是該類的一個實例)、at 標記符“@”和此對象哈希碼的無符號十六進制表示組成。換句話說,該方法返回一個字符串,它的值等于: getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
返回: 該對象的字符串表示形式。 java.lang 提供利用 Java 編程語言進行程序設計的基礎類。 java.text 提供以與自然語言無關的方式來處理文本、日期、數字和消息的類和接口。 java.util 包含 collection 框架、遺留的 collection 類、事件模型、日期和時間設施、國際化和各種實用工具類(字符串標記生成器、隨機數生成器和位數組)。 java.util.concurrent 在并發編程中很常用的實用工具類。
泛型:泛型是jdk1.5出現的新特性。泛型的定義:是和方法或者類和接口一起使用的,沒辦法直接定義一個泛型 。定義的泛型是寫在類上的 : 泛型是在創建對象的時候被確定。 格式: <泛型的名稱> 泛型的好處: 1. 將運行時出現 的問題提前至了編譯時。 2. 避免了無謂強制類型轉換。泛型在集合中的好處: 獲取返回的對象不需要強轉。
類上定義泛型: 特點: 如果類中的方法使用的都是類上定義的泛型,那么一旦創建對象的時候指定了數據類型,方法中的泛型就都是該類型了。
注意點: 1.如果一個類上自定義了泛型,類中的方法是可以重新定義泛型 2.類上定義的泛型只能作用于非靜態方法。什么時候使用在類上定義泛型: 如果一個類中有多個方法需要使用到泛型,那么這個時候就可以考慮在類上定義泛型。 泛型的使用注意事項: 1.如果一個對象在創建時指定了泛型的類型,那么這個對象中只能存放該類型的值。 2.泛型指定的類型只能是引用數據類型 。 如果是基本數據類型,這個泛型中應該指定他的包裝類型。int –> Integer 3. 左右兩邊的數據類型不允許不一致。 4.如果沒有指定類型默認是Object類型
自定義泛型: 自定義泛型就是一個數據類型的占位符或者理解為一個數據類型的變量。
泛型方法: 修飾符 <聲明自定義的泛型>返回值類型 函數名(自定義的泛型 變量名..)泛型方法一個基本的原則是:無論何時,只要你能做到,你就應該盡量使用泛型方法。也就是說,如果使用泛型方法可以取代將整個類泛化,那么應該有限采用泛型方法。下面來看一個簡單的泛型方法的定義: public class Main {
public static <T> void out(T t) { System.out.println(t);}public static void main(String[] args) { out("findingsea"); out(123); out(11.11); out(true);}} 可以看到方法的參數徹底泛化了,這個過程涉及到編譯器的類型推導和自動打包,也就說原來需要我們自己對類型進行的判斷和處理,現在編譯器幫我們做了。這樣在定義方法的時候不必考慮以后到底需要處理哪些類型的參數,大大增加了編程的靈活性。 再看一個泛型方法和可變參數的例子: public class Main {
public static <T> void out(T... args) { for (T t : args) { System.out.println(t); }}public static void main(String[] args) { out("findingsea", 123, 11.11, true);}} 輸出和前一段代碼相同,可以看到泛型可以和可變參數非常完美的結合。
泛型方法要注意的事項:1. 泛型方法中 的自定義泛型的具體數據類型是在調用該函數的時候傳入實參時確定的。
自定義泛型所用 的標識符只要符合標識符 的命名規則即可。但是我們一般都習慣使用一個大寫字母表示。
泛型類: 泛型類的定義格式 class 類名<聲明自定義的泛型>{ }
泛型類要注意的事項: 1. 泛型類上的自定義泛型是在使用該類創建對象的時候指定具體的數據類型的。
如果一個類已經自定義了泛型,使用該類創建對象的時候如果沒有指定泛型的具體數據類型,那么默認為Object類型。靜態的函數不能使用類上自定義的泛型,如果靜態函數需要使用,必須要在函數上自定義泛型。
泛型接口: 泛型接口的定義格式: interface 接口名<聲明自定義的泛型>{ } public interface Generator { public T next(); } 然后定義一個生成器類來實現這個接口: public class FruitGenerator implements Generator {
private String[] fruits = new String[]{“Apple”, “Banana”, “Pear”};
@Override public String next() { Random rand = new Random(); return fruits[rand.nextInt(3)]; } } 調用: public class Main {
public static void main(String[] args) { FruitGenerator generator = new FruitGenerator(); System.out.println(generator.next()); System.out.println(generator.next()); System.out.println(generator.next()); System.out.println(generator.next()); } }
泛型接口要注意事項:
泛型接口上的自定義泛型是在實現該接口的時候指定具體數據類型的。 缺點: 類型就固定了如果實現接口的時候沒有指定接口上 的自定義泛型的具體數據類型,那么默認為Object數據類型。 3. 如果需要在創建接口實現類對象的時候才指定接口上自定義泛型,那么需要以下格式: class 類名 implements 接口
泛型上下限:泛型的范圍,只要應用于方法中。
泛型的下限 ? super Integer 允許是Integer數據類型或者是Integer父類類型
?表示泛型中的通配符 泛型的上限。? extedns Number 允許是Number數據類型或者是Number子類的數據類型
Map: 雙列集合的根接口 —————-| HashMap —————-| TreeMap —————-| Hashtable
雙列集合:-------------| Map 如果是實現了Map接口的集合類,具備的特點: 存儲的數據都是以鍵值對的形式存在的,鍵不可重復,值可以重復。----------------| HashMap 底層也是基于哈希表實現的。HashMap的存儲原理: 往HashMap添加元素的時候,首先會調用鍵的hashCode方法得到元素的哈希碼值,然后經過運算就可以算出該元素在哈希表中的存儲位置。
情況1: 如果算出的位置目前沒有任何元素存儲,那么該元素可以直接添加到哈希表中。
情況2:如果算出 的位置目前已經存在其他的元素,那么還會調用該元素的equals方法與這個位置上的元素進行比較, 如果equals方法返回 的是false,那么該元素允許被存儲,如果equals方法返回的是true,那么該元素被視為重復元素,不允存儲。
—————-| TreeMap TreeMap也是基于紅黑樹(二叉樹)數據結構實現的, 特點:會對元素的鍵進行排序存儲。
TreeMap 要注意的事項:1. 往TreeMap添加元素的時候,如果元素的鍵具備自然順序,那么就會按照鍵的自然順序特性進行排序存儲。 2. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性, 那么鍵所屬的類必須要實現Comparable接口,把鍵的比較規則定義在CompareTo方法上。 3. 往TreeMap添加元素的時候,如果元素的鍵不具備自然順序特性,而且鍵所屬的類也沒有實現Comparable接口,那么就必須在創建TreeMap對象的時候傳入比較器。 在現實生活中有些數據是以映射關系存在的,也就是成對存在的,比如:
民政局 : 鍵 值 老公 老婆 身份證 人 一把要鎖 鎖 Map接口的方法: 添加:put(K key, V value) 給指定的鍵添加值 : 若果沒有指定的鍵,就會創建一個鍵對應指定的值,如果鍵存在就是修改鍵所對應的值。 putAll(Map
新聞熱點
疑難解答