日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

collection集合 地址_java.util包下的集合

發布時間:2024/9/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 collection集合 地址_java.util包下的集合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java 集合可分為?Collection 和?Map 兩種體系

1.Collection接口:單列數據,定義了存取一組對象的方法的集合

  • List:元素有序、可重復的集合
  • Set:元素無序、不可重復的集合
(1) List接口的實現類常用的有:ArrayList、LinkedList和Vector① ArrayList
  • ArrayList是對象引用的一個”變長”數組,

  • ArrayList的JDK1.8之前與之后的實現區別?

  • JDK1.7:ArrayList像餓漢式,直接創建一個初始容量為10的數組

  • JDK1.8:ArrayList像懶漢式,一開始創建一個長度為0的數組,當添加第一個元素時再創建一個始容量為10的數組

  • Arrays.asList(…) 方法返回的 List 集合,既不是 ArrayList 實例,也不是 Vector實例。Arrays.asList(…) 返回值是一個固定長度的 List 集合

  • ② LinkedList
  • 雙向鏈表,內部沒有聲明數組,而是定義了Node類型的first和last,用于記錄首末元素。同時,定義內部類Node,作為LinkedList中保存數據的基本結構

  • 對于頻繁的插入或刪除元素的操作,建議使用LinkedList類,效率較高

  • ③ Vector
  • JDK1.0就有了,大多數操作與ArrayList相同,區別之處在于Vector是線程安全的

  • 雖然線程安全,但還是不使用,因為它實在是太慢了,一般是ArrayList,插入和刪除頻繁時,就使用LinkedList


  • 面試題:請問ArrayList/LinkedList/Vector的異同?談談你的理解?ArrayList底層是什么?擴容機制?Vector和ArrayList的最大區別?
    • ArrayList和LinkedList的異同二者都線程不安全,相對線程安全的Vector,執行效率高。此外,ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。對于新增和刪除操作add(特指插入)和remove,LinkedList比較占優勢,因為ArrayList要移動數據。

    • Vector和ArrayList幾乎是完全相同的,唯一的區別在于Vector是同步類(synchronized),屬于強同步類。因此開銷就比ArrayList要大,訪問要慢。正常情況下,大多數的Java程序員使用ArrayList而不是Vector,因為同步完全可以由程序員自己來控制。Vector每次擴容請求其大小的2倍空間,而ArrayList是1.5倍。Vector還有一個子類Stack。




    (2) Set接口的實現類常用的有:HashSet、TreeSet和LinkedHashSet
    • Set接口是Collection的子接口,set接口沒有提供額外的方法;

    • Set 集合不允許包含相同的元素,如果試把兩個相同的元素加入同一個 Set 集合中,則添加操作失敗;

    • Set 判斷兩個對象是否相同不是使用?== 運算符,而是根據?equals() 方法

    ① HashSet
    • HashSet 是?Set 接口的典型實現,大多數時候使用?Set 集合時都使用這個實現類;

    • HashSet 按?Hash 算法來存儲集合中的元素,因此具有很好的存取、查找、刪除性能

    • 無序、線程不安全,元素可以為null

    • HashSet 集合判斷兩個元素相等的標準:兩個對象通過 hashCode()?方法比較相等,并且兩個對象的 equals() 方法返回值也相等

    • 存放在Set容器中的對象,對應的類一定要重寫equals()和hashCode(Object?obj)方法,以實現對象相等規則

    • 底層是數組,16,0.75,擴容為2倍

    • 重寫兩個方法需要保證:相等的對象必須具有相等的散列碼(直接使用系統提供的)

    HashSet存放元素時:鏈表解決沖突 比較hashCode()和equals()??hash值通過算法找到對應的數組存放位置(判斷是否存在沖突) ??1.下標位置沒有其他元素????2.有其他元素??????i.hash值不同則添加成功??????ii.hash值相同則比較equals()????????true說明重復,false可以添加② LinkedHashSet
    • HashSet 的子類

    • LinkedHashSet 根據元素的?hashCode 值來決定元素的存儲位置,但它同時使用雙向鏈表維護元素的次序,這使得元素看起來是以插入順序保存的

    • LinkedHashSet插入性能略低于?HashSet,但在迭代訪問?Set?里的全部元素時有很好的性能

    • 不允許集合元素重復

    ③ TreeSet
    • TreeSet 是?SortedSet 接口的實現類,TreeSet 可以確保集合元素處于排序狀態

    • 底層是紅黑樹

    • 兩種排序方法:自然排序和定制排序。默認情況下,TreeSet 采用自然排序

    • 有序,查詢速度比list快

    關于TreeSet 有兩種排序方法:自然排序: TreeSet會調用集合元素的compareTo(Object obj)方法 來比較元素之間的大小關系, 然后將集合元素按升序(默認情況)排列, 如果試圖把一個對象添加到 TreeSet 時, 則該對象的類必須實現 Comparable接口定制排序: 通過Comparator接口來實現。 需要重寫compare(T o1,T o2)方法 按照其它屬性大小進行排序 將實現Comparator接口的實例作為形參傳遞給TreeSet的構造器 仍然只能向TreeSet中添加類型相同的對象 兩個元素相等是通過返回值是否為 0 判斷

    難題:



    2.Map接口:雙列數據,保存具有映射關系“key-value對”的集合

    • Map 中的?key?用Set來存放,不允許重復,即同一個?Map 對象所對應的類,須重寫hashCode()和equals()方法

    • key 和?value 都可以是任何引用類型的數據

    • key 和?value 之間存在單向一對一關系,即通過指定的?key 總能找到唯一的、確定的?value

    • HashMap是?Map?接口使用頻率最高的實現類

    • Set keySet():返回所有key構成的Set集合

    • Collection values():返回所有value構成的Collection集合

    • Set entrySet():返回所有key-value對構成的Set集合

    (1)HashMap
    • HashMap是 Map 接口使用頻率最高的實現類。
    • 允許使用null鍵和null值,與HashSet一樣,不保證映射的順序。
    • 所有的key構成的集合是Set:無序的、不可重復的。所以,key所在的類要重寫:equals()和hashCode()
    • 所有的value構成的集合是Collection:無序的、可以重復的。所以,value所在類要重寫:equals()
    • 一個key-value構成一個entry
    • 所有的entry構成的集合是Set:無序的、不可重復的
    • HashMap 判斷兩個 key 相等的標準是:兩個 key 通過 equals() 方法來返回true,hashCode 值也相等。
    • HashMap 判斷兩個 value相等的標準是:兩個 value 通過 equals() 方法返回 true。
    JDK 7及以前版本:HashMap是數組+鏈表結構(即為鏈地址法)JDK 8版本發布以后:HashMap是數組+鏈表+紅黑樹實現更多內容可以查看:初識HashMap!!

    面試題:負載因子值的大小,對HashMap有什么影響

    • 負載因子的大小決定了HashMap的數據密度。

    • 負載因子越大密度越大,發生碰撞的幾率越高,數組中的鏈表越容易長,造成查詢或插入時的比較次數增多,性能會下降。

    • 負載因子越小,就越容易觸發擴容,數據密度也越小,意味著發生碰撞的幾率越小,數組中的鏈表也就越短,查詢和插入時比較的次數也越小,性能會更高。但是會浪費一定的內容空間。而且經常擴容也會影響性能,建議初始化預設大一點的空間。

    • 按照其他語言的參考及研究經驗,會考慮將負載因子設置為0.7~0.75,此時平均檢索長度接近于常數。


    (2)LinkedHashMap

    • LinkedHashMap 是?HashMap 的子類

    • 在HashMap存儲結構的基礎上,使用了一對雙向鏈表來記錄添加元素的順序

    • 與LinkedHashSet類似,LinkedHashMap 可以維護?Map 的迭代

    • 迭代順序與?Key-Value 對的插入順序一致

    (3)TreeMap
    • TreeMap存儲 Key-Value 對時,需要根據 key-value 對進行排序。

    • TreeMap 可以保證所有的?Key-Value 對處于有序狀態。

    • TreeSet底層使用紅黑樹結構存儲數據

    • TreeMap 的 Key 的排序:

      - 自然排序:TreeMap 的所有的 Key 必須實現 Comparable 接口,而且所有的 Key 應該是同一個類的對象,否則將會拋出 ClasssCastException

      - 定制排序:創建 TreeMap 時,傳入一個 Comparator 對象,該對象負責對 TreeMap 中的所有 key 進行排序。此時不需要 Map 的 Key 實現 Comparable 接口?

    • TreeMap判斷兩個key相等的標準:兩個key通過compareTo()方法或者compare()方法返回0。

    (4)Hashtable和HashMap有什么區別(5)Properties
    • Properties 類是?Hashtable 的子類,該對象用于處理屬性文件

    • 由于屬性文件里的?key-value 都是字符串類型,所以?Properties?里的?key?和?value 都是字符串類型

    • 存取數據時,建議使用setProperty(String key,String value)方法和?getProperty(String key)方法

    Properties?pros?=?new?Properties();pros.load(new?FileInputStream("jdbc.properties"));String?user?=?pros.getProperty("user");System.out.println(user);


    看到這里,你知道Collections和Collection的區別嗎?
    • Collections 是一個操作?Set、List 和?Map 等集合的工具類

    • Collections 中提供了一系列靜態的方法對集合元素進行排序、查詢和修改等操作,還提供了對集合對象設置不可變、對集合對象實現同步控制等方法

    • 操作數組的工具類:Arrays

    排序操作方法reverse(List) 反轉?List?中元素的順序 shuffle(List) 對?List?集合元素進行隨機排序sort(List) 根據元素的自然順序對指定?List?集合元素按升序排序 sort(List,Comparator) 根據指定的?Comparator?產生的順序對?List?集合元素進行排序 swap(List,int, int) 將指定 list 集合中的 i 處元素和 j 處元素進行交換 查找、替換方法Object max(Collection)Object?max(Collection,Comparator)Object min(Collection)Object min(Collection,Comparator)int?frequency(Collection,Object)void copy(List dest,List src)boolean?replaceAll(List?list,Object?oldVal,Object?newVal)
    • 線程同步問題

    Collections 類中提供了多個?synchronizedXxx()?方法,該方法可使將指定集合包裝成線程同步的集合,從而可以解決多線程并發訪問集合時的線程安全問題

    1、一些知識點

  • 什么是枚舉類?類中的對象的個數是確定的,有限個。
  • 什么是元注解,說明Retention和Target元注解的作用。元注解是對現有注解進行解釋說明的注解;Retention:指明所修飾的注釋的生命周期,source,class,runtimeTarget:用于描述注解的使用范圍
  • 集合框架有哪些接口?Collection和Map
  • throws 和 throw 的異同?
  • throws:用來聲明一個方法可能產生的所有異常不做任何處理而是將異常往上傳誰調用我我就拋給誰。 用在方法聲明后面,跟的是異常類名 可以跟多個異常類名,用逗號隔開 表示拋出異常,由該方法的調用者來處理 throws表示出現異常的一種可能性,并不一定會發生這些異常throw:則是用來拋出一個具體的異常類型。 用在方法體內,跟的是異常對象名 只能拋出一個異常對象名 表示拋出異常,由方法體內的語句處理?????throw則是拋出了異常,執行throw則一定拋出了某種異常???

    v. 同步代碼塊中的同步監視器(鎖)和共享數據的理解。

    ? ?同步監視器:任何一個類的對象都可以是鎖;多個線程共用一把鎖。

    ???共享數據:多個線程共同操作的數據;

    ???需要同步機制將共享數據包起來,這樣線程安全,注意性能。

    2、數組和集合的區別

    • 數組聲明了它容納的元素的類型,而集合不聲明。

    • 數組是靜態的,一個數組實例具有固定的大小,一旦創建了就無法改變容量了。而集合是可以動態擴展容量,可以根據需要動態改變大小,集合提供更多的成員方法,能滿足更多的需求。

    • 數組的存放的類型只能是一種(基本類型/引用類型),集合存放的類型可以不是一種(不加泛型時添加的類型是Object)。

    • 數組是java語言中內置的數據類型,是線性排列的,執行效率或者類型檢查都是最快的。

    總結

    以上是生活随笔為你收集整理的collection集合 地址_java.util包下的集合的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。