亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java和Scala集合間是如何進行相互轉換的

發布時間:2021-10-11 13:41:37 來源:億速云 閱讀:163 作者:iii 欄目:開發技術

本篇內容主要講解“Java和Scala集合間是如何進行相互轉換的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java和Scala集合間是如何進行相互轉換的”吧!

目錄
  • Java和Scala集合間的相互轉換

    • scala與java互轉

  • Java與Scala的集合對比

    • 一、Java集合

      • 1、Collection=>Set接口

      • 2、Collection=>List接口

      • 3、Map接口

    • 二、Scala集合

      • 1、Seq

      • 2、Set

      • 3、Map

Java和Scala集合間的相互轉換

在scala中,調用一個java的方法,通常需要傳遞相應的參數。下面是scala與java互轉換對應表

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互轉

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

注:在Scala內部,這些轉換是通過一系列“包裝”對象完成的,這些對象會將相應的方法調用轉發至底層的容器對象。所以容器不會在Java和Scala之間拷貝來拷貝去。

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

有一些Scala容器類型可以轉換成對應的Java類型,但是并沒有將相應的Java類型轉換成Scala類型的能力

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

因為Java并未區分可變容器不可變容器類型,所以,雖然能將scala.immutable.List轉換成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集合

面向對象語言對事物的體現是以對象的形式,為了對多個對象進行存儲。單單靠數組不足以解決問題,同時對對象的操作極為的不方便。數組不可以存儲不同的多個對象。

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

Collection集合:不按照添加的順序存放對象的集合,集合內元素的內容是可以重復的。

保存一個一個的對象

1、Collection=>Set接口

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

>HashSet

使用哈希算法實現的Set集合

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

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

>LinkedSet

>TreeSet

添加的順序是無序的,且不可重復

注意添加元素的時候不能添加不同的類型,因為會進行比較,不同類型的元素無法進行比較

1、自定義類要實現Comparable接口,實現并重寫方法。

去重規則:compareTo返回0

2、寫一個具體類,讓這個類實現Comparator接口,重寫compare方法,讓比較器關聯到TreeSet中

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

2、Collection=>List接口

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

>ArrayList

使用數組實現的List集合

>LinkedList

使用鏈表實現的List集合

>Vector

  • Vector:是線程安全的動態數組,底層是數組結構,初始化為長度為10的數組,如果容量滿了,按照2.0倍擴容。除了支持foreach和Iterator遍歷,還支持Enumeration迭代。

ArrayList和LinkedList

1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。

2.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。

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

Arraylist,LinkedList,Vector的區別

  • ArrayList:是線程不安全的動態數組,底層是數組結構,JDK1.7后初始化為空數組,在添加第一個元素時初始化為長度為10的數組,如果容量滿了,按照1.5倍擴容。支持foreach和Iterator遍歷。

  • Vector:是線程安全的動態數組,底層是數組結構,初始化為長度為10的數組,如果容量滿了,按照2.0倍擴容。除了支持foreach和Iterator遍歷,還支持Enumeration迭代。

  • LinkedList:是雙向鏈表,底層是鏈表結構。當頻繁在集合中插入、刪除元素時,效率較高,但是查找遍歷的效率較低。

3、Map接口

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

具有映射關系“Key-Value”形式的集合

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

2、Map中的key是用set來進行存放的,不允許重復,也就是說同一個Map對象所對應的類,需要重寫hashCode和equals方法

3、Map中的key和value存在單向一一對應關系,通過指定的key,可以唯一確定value的值

Map是如何維護k-v的呢?

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

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

>HashMap

HashMap是線程不安全的哈希表,底層結構是JDK1.7時數組+鏈表,JDK1.8時數組+鏈表/紅黑樹。

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

>TreeMap

> Hashtable

Hashtable是線程安全的哈希表,底層結構是數組+鏈表。

二、Scala集合

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

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

不可變集合:scala.collection.immutable

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

可變集合:scala.collection.immutable

可變集合指的是,可以對原對象修改,并且不會產生新的對象。

常用 ==>

1、Seq

不可變:~

–>IndexedSeq

Array,String ->底層隱式轉化

–>LinearSeq

List,Queue,Stack

可變:~

  • ArrayBuffer

  • StringBuffer

2、Set

默認情況下,Set使用的是不可變集合,如果想要使用可變的集合,需要導包–scala.collection.mutable.Set

無序,且數據不可重復

3、Map

創建Map,默認是不可改變的。

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

值得注意的是:

根據key,獲取value值有兩種情況~

1.獲取到value

2.沒有獲取到,返回空

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

Option下有兩個子類 None | Some – None相當于沒獲取到值,Some會對獲取到的value進行包裝處理

如果返回None,可以進行二次處理,給一個默認值

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

到此,相信大家對“Java和Scala集合間是如何進行相互轉換的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

左权县| 江孜县| 金坛市| 秭归县| 太谷县| 磐安县| 成武县| 通榆县| 浦北县| 闵行区| 湛江市| 丰宁| 澎湖县| 上高县| 彰武县| 理塘县| 晋州市| 彩票| 安义县| 临邑县| 东平县| 莱西市| 汶上县| 宁国市| 宝应县| 玉龙| 北流市| 霍邱县| 大化| 会东县| 峡江县| 梅河口市| 怀柔区| 香格里拉县| 绍兴县| 探索| 内乡县| 北川| 邢台市| 北流市| 永靖县|