亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java和Scala集合間的相互轉(zhuǎn)換方式

 更新時間:2021年10月11日 11:49:29   作者:COLLECTIONS  
這篇文章主要介紹了Java和Scala集合間的相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java和Scala集合間的相互轉(zhuǎn)換

在scala中,調(diào)用一個java的方法,通常需要傳遞相應(yīng)的參數(shù)。下面是scala與java互轉(zhuǎn)換對應(yīng)表

Iterator <=> java.util.Iterator
Iterator <=> java.util.Enumeration
Iterable <=> java.lang.Iterable
Iterable <=> java.util.Collection
mutable.Buffer <=> java.util.List
mutable.Set <=> java.util.Set
mutable.Map <=> java.util.Map
mutable.ConcurrentMap <=> java.util.concurrent.ConcurrentMap

scala與java互轉(zhuǎn)

    import collection.JavaConverters._
    import collection.mutable._
    val map = Map("k" -> "v")
    //轉(zhuǎn)換成java
    val javaMap = map.asJava
    //轉(zhuǎn)換成 scala
    javaMap.asScala

注:在Scala內(nèi)部,這些轉(zhuǎn)換是通過一系列“包裝”對象完成的,這些對象會將相應(yīng)的方法調(diào)用轉(zhuǎn)發(fā)至底層的容器對象。所以容器不會在Java和Scala之間拷貝來拷貝去。

一個值得注意的特性是,如果你將一個Java容器轉(zhuǎn)換成其對應(yīng)的Scala容器,然后再將其轉(zhuǎn)換回同樣的Java容器,最終得到的是一個和一開始完全相同的容器對象(譯注:這里的相同意味著這兩個對象實際上是指向同一片內(nèi)存區(qū)域的引用,容器轉(zhuǎn)換過程中沒有任何的拷貝發(fā)生)

有一些Scala容器類型可以轉(zhuǎn)換成對應(yīng)的Java類型,但是并沒有將相應(yīng)的Java類型轉(zhuǎn)換成Scala類型的能力

Seq => java.util.List
mutable.Seq => java.util.List
Set => java.util.Set
Map => java.util.Map

因為Java并未區(qū)分可變?nèi)萜鞑豢勺內(nèi)萜黝愋?,所以,雖然能將scala.immutable.List轉(zhuǎn)換成java.util.List,但所有的修改操作都會拋出“UnsupportedOperationException”

scala> jul = List(1, 2, 3).asJava
jul: java.util.List[Int] = [1, 2, 3]
scala> jul.add(7)
java.lang.UnsupportedOperationException
        at java.util.AbstractList.add(AbstractList.java:131)

Java與Scala的集合對比

一、Java集合

面向?qū)ο笳Z言對事物的體現(xiàn)是以對象的形式,為了對多個對象進(jìn)行存儲。單單靠數(shù)組不足以解決問題,同時對對象的操作極為的不方便。數(shù)組不可以存儲不同的多個對象。

集合就像是一個容器,可以動態(tài)的把多個對象的引用放入到容器中。

Collection集合:不按照添加的順序存放對象的集合,集合內(nèi)元素的內(nèi)容是可以重復(fù)的。

保存一個一個的對象

1、Collection=>Set接口

元素不按照添加的順序(無序)、不可重復(fù)添加相同元素(內(nèi)容而不是地址)的集合

>HashSet

使用哈希算法實現(xiàn)的Set集合

去重規(guī)則:兩個對象的equals為true,并且兩個對象的哈希碼相等

如果想讓自定義對象重復(fù),需要重寫equals和hashCode

>LinkedSet

>TreeSet

​添加的順序是無序的,且不可重復(fù)

​注意添加元素的時候不能添加不同的類型,因為會進(jìn)行比較,不同類型的元素?zé)o法進(jìn)行比較

​1、自定義類要實現(xiàn)Comparable接口,實現(xiàn)并重寫方法。

​去重規(guī)則:compareTo返回0

​2、寫一個具體類,讓這個類實現(xiàn)Comparator接口,重寫compare方法,讓比較器關(guān)聯(lián)到TreeSet中

​使用樹實現(xiàn)的Set集合,底層是通過二叉樹實現(xiàn)的(=> 所以添加的數(shù)據(jù),遍歷出來后是看起來有順序的)

2、Collection=>List接口

元素按照添加的順序(有序)、可重復(fù)添加相同元素的集合

>ArrayList

​使用數(shù)組實現(xiàn)的List集合

>LinkedList ​

使用鏈表實現(xiàn)的List集合

>Vector ​

  • Vector:是線程安全的動態(tài)數(shù)組,底層是數(shù)組結(jié)構(gòu),初始化為長度為10的數(shù)組,如果容量滿了,按照2.0倍擴(kuò)容。除了支持foreach和Iterator遍歷,還支持Enumeration迭代。

ArrayList和LinkedList

1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。

2.對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。

3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。 這一點要看實際情況的。若只對單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于LinkedList。但若是批量隨機(jī)的插入刪除數(shù)據(jù),LinkedList的速度大大優(yōu)于ArrayList. 因為ArrayList每插入一條數(shù)據(jù),要移動插入點及之后的所有數(shù)據(jù)。

Arraylist,LinkedList,Vector的區(qū)別

  • ArrayList:是線程不安全的動態(tài)數(shù)組,底層是數(shù)組結(jié)構(gòu),JDK1.7后初始化為空數(shù)組,在添加第一個元素時初始化為長度為10的數(shù)組,如果容量滿了,按照1.5倍擴(kuò)容。支持foreach和Iterator遍歷。
  • Vector:是線程安全的動態(tài)數(shù)組,底層是數(shù)組結(jié)構(gòu),初始化為長度為10的數(shù)組,如果容量滿了,按照2.0倍擴(kuò)容。除了支持foreach和Iterator遍歷,還支持Enumeration迭代。
  • LinkedList:是雙向鏈表,底層是鏈表結(jié)構(gòu)。當(dāng)頻繁在集合中插入、刪除元素時,效率較高,但是查找遍歷的效率較低。

3、Map接口

Map集合:保存一對一對的對象

具有映射關(guān)系“Key-Value”形式的集合

1、Map中的key和value都可以是任何引用類型的數(shù)據(jù)

2、Map中的key是用set來進(jìn)行存放的,不允許重復(fù),也就是說同一個Map對象所對應(yīng)的類,需要重寫hashCode和equals方法

3、Map中的key和value存在單向一一對應(yīng)關(guān)系,通過指定的key,可以唯一確定value的值

Map是如何維護(hù)k-v的呢?

  • Entry:橫向來看,條目對象里面是一個一個的鍵值對,若干個Entry構(gòu)成一個Map(無序不可重復(fù))EntrySet

縱向來看KeySet專門放鍵,Collection放值

>HashMap ​

HashMap是線程不安全的哈希表,底層結(jié)構(gòu)是JDK1.7時數(shù)組+鏈表,JDK1.8時數(shù)組+鏈表/紅黑樹。

HashMap的線程安全問題可以使用Collections的synchronizedMap(Map<K,V> m) 方法解決。

>TreeMap

> Hashtable

Hashtable是線程安全的哈希表,底層結(jié)構(gòu)是數(shù)組+鏈表。

二、Scala集合

>1、Scala集合有三個大類:序列Seq、集Set、映射Map。并且所有的集合都有自己擴(kuò)展的特質(zhì)

>2、對于幾乎所有的集合類,Scala都同時提供了可變與不可變兩個版本,位于兩個包下

​ 不可變集合:scala.collection.immutable

​ 不可變集合指的是,該集合的對象不能修改,每次修改過后,就會產(chǎn)生新的對象。這里修改指的是長度的改變,增加或減少。當(dāng)只是修改對象里面的屬性時,是可以的。

​ 可變集合:scala.collection.immutable

​ 可變集合指的是,可以對原對象修改,并且不會產(chǎn)生新的對象。

常用 ==>

1、Seq

不可變:~

–>IndexedSeq

Array,String ->底層隱式轉(zhuǎn)化

–>LinearSeq

List,Queue,Stack

可變:~

  • ArrayBuffer
  • StringBuffer

2、Set

默認(rèn)情況下,Set使用的是不可變集合,如果想要使用可變的集合,需要導(dǎo)包–scala.collection.mutable.Set

無序,且數(shù)據(jù)不可重復(fù)

3、Map

創(chuàng)建Map,默認(rèn)是不可改變的。

使用可變的時候,和Java的一樣。

值得注意的是:

根據(jù)key,獲取value值有兩種情況~

1.獲取到value

2.沒有獲取到,返回空

與java不同的是,Scala沒有類似于Java直接獲?。╣et())方法,Scala為了避免取到null值,添加了新的類型Option

Option下有兩個子類 None | Some – None相當(dāng)于沒獲取到值,Some會對獲取到的value進(jìn)行包裝處理

如果返回None,可以進(jìn)行二次處理,給一個默認(rèn)值

如果真的想通過key來獲取Value可以使用getOrElse(elem,default) 函數(shù)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Cloud 服務(wù)網(wǎng)關(guān)Zuul的實現(xiàn)

    Spring Cloud 服務(wù)網(wǎng)關(guān)Zuul的實現(xiàn)

    這篇文章主要介紹了Spring Cloud 服務(wù)網(wǎng)關(guān)Zuul的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Spring實戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例

    Spring實戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之Bean定義中的SpEL表達(dá)式語言支持操作,結(jié)合實例形式分析了Bean定義中的SpEL表達(dá)式語言操作步驟與實現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • Java線程的生命周期命名與獲取代碼實現(xiàn)

    Java線程的生命周期命名與獲取代碼實現(xiàn)

    這篇文章主要介紹了Java線程的生命周期命名與獲取代碼實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java日常練習(xí)題,每天進(jìn)步一點點(51)

    Java日常練習(xí)題,每天進(jìn)步一點點(51)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • Java實現(xiàn)圖章或簽名插在pdf的固定位置

    Java實現(xiàn)圖章或簽名插在pdf的固定位置

    使用Java技術(shù)在word轉(zhuǎn)換成pdf過程中實現(xiàn)將圖章或者簽名插入在pdf中,并生成帶圖章或者簽名的pdf,來完成某些特定場景的需求,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • Springboot為什么加載不上application.yml的配置文件

    Springboot為什么加載不上application.yml的配置文件

    這篇文章主要介紹了Springboot為什么加載不上application.yml的配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java實現(xiàn)身份證號碼驗證的示例代碼

    java實現(xiàn)身份證號碼驗證的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用java語言實現(xiàn)身份證號碼驗證的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • 淺談Java方法的重載

    淺談Java方法的重載

    方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數(shù)的類型或參數(shù)的個數(shù)。調(diào)用重載方法時,Java編譯器能通過檢查調(diào)用的方法的參數(shù)類型和個數(shù)選擇一個恰當(dāng)?shù)姆椒ā7椒ㄖ剌d通常用于創(chuàng)建完成一組任務(wù)相似但參數(shù)的類型或參數(shù)的個數(shù)不同的方法。
    2016-04-04
  • Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    Java的線程阻塞、中斷及優(yōu)雅退出方法詳解

    這篇文章主要介紹了Java的線程阻塞、中斷及優(yōu)雅退出方法詳解,Java中的線程阻塞是指當(dāng)一個線程無法繼續(xù)執(zhí)行時,它會進(jìn)入阻塞狀態(tài),直到某個條件滿足后才能繼續(xù)執(zhí)行,線程阻塞可以通過多種方式實現(xiàn),需要的朋友可以參考下
    2023-10-10
  • Java?CopyOnWriteArrayList源碼超詳細(xì)分析

    Java?CopyOnWriteArrayList源碼超詳細(xì)分析

    為了將讀取的性能發(fā)揮到極致,jdk中提供了CopyOnWriteArrayList類,下面這篇文章主要給大家介紹了關(guān)于java中CopyOnWriteArrayList源碼解析的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評論