我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java和Scala集合间的相互转换方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java和Scala集合间的相互转换方式

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) 函数

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java和Scala集合间的相互转换方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue时间戳和时间的相互转换方式

Vue.js时间戳和时间的相互转换Vue.js提供了多种方法,用于在时间戳和时间之间进行转换,包括使用构造函数、过滤器、库和自定义格式化。可轻松格式化时间、显示相对时间,并处理不同时间格式。
vue时间戳和时间的相互转换方式
2024-04-25

C++string和wstring相互转换方式

这篇文章主要介绍了C++string和wstring相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-28

java项目中如何实现集合的相互转换

这篇文章给大家介绍java项目中如何实现集合的相互转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.List转换为ArrayList list = new ArrayList();
2023-05-31

基于String和List<String>间的相互转换方式

这篇文章主要介绍了基于String和List间的相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-20

python label与one-hot之间的互相转换方式

这篇文章主要介绍了python label与one-hot之间的互相转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-01

Python中基本类型的连接组合和互相转换的方式

本篇内容介绍了“Python中基本类型的连接组合和互相转换的方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!update方法非常的常用。1
2023-06-16

Tensor和NumPy相互转换的方法

本文主要介绍了Tensor和NumPy相互转换的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-19

json对象和formData相互转换的方式详解

我们有两种常见的传参方式:JSON对象格式和formData格式,但是一些场景是需要我们对这两种数据格式进行转换的,这篇文章主要介绍了json对象和formData相互转换的方式详解,需要的朋友可以参考下
2023-02-14

js实现base64、url和blob之间相互转换的三种方式

Blob对象表示一个不可变、原始数据的类文件对象,Blob表示的不一定是JavaScript原生格式的数据,下面这篇文章主要给大家介绍了关于js实现base64、url和blob之间相互转换的三种方式,需要的朋友可以参考下
2023-05-15

String和List<String>间的相互转换

本篇文章和大家了解一下String和List间的相互转换。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录String和List间相互转换List转String的简单方法String[]和
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录