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

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

(0)

相关推荐

  • Java和scala实现 Spark RDD转换成DataFrame的两种方法小结

    一:准备数据源 在项目下新建一个student.txt文件,里面的内容为: 1,zhangsan,20 2,lisi,21 3,wanger,19 4,fangliu,18 二:实现 Java版: 1.首先新建一个student的Bean对象,实现序列化和toString()方法,具体代码如下: package com.cxd.sql; import java.io.Serializable; @SuppressWarnings("serial") public class Stude

  • Java中数组与集合的相互转换实现解析

    这篇文章主要介绍了Java中数组与集合的相互转换实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 List转数组:采用集合的toArray()方法 数组转List:采用Arrays的asList()方法 数组转换为集合 注意:在数组转集合的过程中,要注意是否使用了视图的方式直接返回数组中的数据.以Arrays.asList()为例,它把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出 Unsu

  • java实现列表、集合与数组之间转化的方法

    本文实例讲述了java实现列表.集合与数组之间转化的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package test;  import java.util.ArrayList;  import java.util.Arrays;  import java.util.HashSet;  import java.util.List;  import java.util.Set;  public class Test2 {      public static void

  • java中List、Array、Map、Set等集合相互转换

    java中List.Array.Map.Set等集合相互转换 在java中,我们经常需要对List.Array等做一些转换操作,当然转换方法有很多种,但哪种方法既方便又高效呢?在这里向大家介绍一下集合间的最佳转换方法. 1.List转换为Array List<String> list = new ArrayList<String>(); list.add("China"); list.add("Switzerland"); list.add(

  • 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 Ite

  • java与scala数组及集合的基本操作对比

    目录 java与scala数组及集合的操作 scala数组基本操作 对应java代码 scala可变数组ArrayBuffer java 相应 ArrayList操作 scala 的数组遍历 java数组的遍历 scala数组与java数组对比 源码上 java与scala数组及集合的操作 这篇博客介绍了scala的数组 + 可变数组的基本使用,及其与java数组的区别 scala数组基本操作 def main(args: Array[String]): Unit = { //new一个大小不变

  • Java与Scala创建List与Map的实现方式

    目录 Java与Scala创建List与Map Java自定义map与scala map对比 1. 背景 2. java代码 Java与Scala创建List与Map //Java List<String> languages = new ArrayList<>(); Map<String, Class> mapFields = new HashMap(); //Scala val languages = new util.ArrayList[String] val m

  • java list,set,map,数组间的相互转换详解

    java list,set,map,数组间的相互转换详解 1.list转set Set set = new HashSet( new ArrayList()); 2.set转list List list = new ArrayList( new HashSet());  3.数组转为list List stooges = Arrays.asList( "Larry" , "Moe" , "Curly" ); 此时stooges中有有三个元素.注意

  • Java实现Map集合遍历的四种常见方式与用法分析

    本文实例讲述了Java实现Map集合遍历的四种常见方式与用法.分享给大家供大家参考,具体如下: ~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1. 无非就是通过map.keySet()获取到值,然后根据键获取到值 for(String s:map.keySet()){ System.out.println("key : "+s+" value : "+map.get(s)); } 2. 通过Map.Entry(

  • 一分钟了解Java中List集合与set集合的多种遍历方式

    List集合与set集合的多种遍历方式 方法有: 1. for循环遍历 2. foreach增强循环遍历 3. 迭代器遍历 4. lambda表达式遍历 一.List集合的遍历 1.创建一个集合,添加一些元素放在集合当中 public static void main(String[] args) { //int[] ins = new int[8];//int List<String> list = new ArrayList<String>();//List,ArrayList

  • Java 切割字符串的几种方式集合

    目录 Java 切割字符串的几种方式 1.StringTokenizer切割 2...split("*")分割 3.调用String自己的api subString() java优雅的切割字符串 切割字符串 使用方法 Java 切割字符串的几种方式 //以data 为案例参数. String data = "2019-01-08 21:55 136 \n2019-01-08 22:00 86 \n2019-01-08 22:04 136 \n2019-01-08 22:09

  • Java多线程中线程间的通信实例详解

    Java多线程中线程间的通信 一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } publ

  • Java中动态规则的实现方式示例详解

    背景 业务系统在应用过程中,有时候要处理"经常变化"的部分,这部分需求可能是"业务规则",也可能是"不同的数据处理逻辑",这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求. Java不是解决动态层问题的理想语言,在实践中发现主要有以下几种方式可以实现: 表达式语言(expression language) 动态语言(dynamic/script language language),如Groovy 规则引擎(rule engine

  • Java 和 Scala 如何调用变参

    Java 和 Scala 都支持变参方法, 写在最后的位置上,最基本的调用方式也都是一样的,一个个罗列过去.也可以传入数组参数,因为变参本质上就是一个数组,就是把 ... 开始位置到最后一个参数都收纳到数组中去,所以变参之所以要放在最后的位置上,且一个方法中最多只能有一个变参类型. 这里主要是对比 Scala 对变参方法的调用,基本调用法当然是没问题的,但是在传入数组作为变参的参数列表与 Java 相对时就稍有变化了. 另外提一下,如果想传入 List 作为变参列表,而不是整体作为变参的第一个元

随机推荐