`
sjsky
  • 浏览: 917741 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Array和Collection相互转换以及copy深度的小测

    博客分类:
  • Java
阅读更多
    blog迁移至:http://www.micmiu.com

    周末闲来无事,把java中Array和Collection之间相互转换小结了下,顺便对转换过程中涉及到的javabena的copy深度进行了简单的测试,详细内容将按照如下分类分别介绍:
  • List <-> Array
  • Set <-> Array
  • List <-> Set
  • List <-> Collection
  • Array Copy
  • List Copy
完整的代码:CollectionConvertTest.zip
测试过程中用到的javabean:TestVo的代码就不贴了,就一个简单的String属性name.

【一】、 List <-> Array
 System.out.println("==============================");

        // List -> Array
        System.out.println("List -> Array ");
        List<String> srclist = new ArrayList<String>();
        srclist.add("src_list_a");
        srclist.add("src_list_b");

        String[] destArr = srclist.toArray(new String[srclist.size()]);
        System.out.println("List -> Array 集合中元素的顺序不变");
        srclist.clear();
        System.out.println("srclist clear()");
        System.out.println("destArr length=" + destArr.length);
        if (destArr.length == 2) {
            System.out.println("List -> Array for String : 深度copy");
        } else {
            System.out.println("List -> Array for String : 浅度copy");
        }

        List<TestVo> srcVolist = new ArrayList<TestVo>();
        TestVo vo1 = new TestVo("michael");
        srcVolist.add(vo1);
        srcVolist.add(new TestVo("xiaoxiao"));
        srcVolist.add(new TestVo("vo_3"));

        TestVo[] destVoArr = srcVolist.toArray(new TestVo[srcVolist.size()]);
        System.out.println("List -> Array 集合中元素的顺序不变");
        vo1.setName("xiaoxiao_new");
        System.out.println("srcVolist[0]的属性Name修改为:xiaoxiao_new");
        System.out.println("destVoArr[0]的属性Name当前值:" + destVoArr[0].getName());
        if ("xiaoxiao_new".equals(destVoArr[0].getName())) {
            System.out.println("List -> Array for Bean : 浅度copy");
        } else {
            System.out.println("List -> Array for Bean : 深度copy");
        }

        // Array -> List
        System.out.println("Array -> List");
        String[] srcArr = new String[] { "src_arr_1", "src_arr_2" };
        List<String> destList = Arrays.asList(srcArr);
        srcArr[0] = "src_arr_1_new";
        if ("src_arr_1_new".equals(destList.get(0))) {
            System.out.println("Array -> List for String : 深度copy");
        } else {
            System.out.println("Array -> List for String : 浅度copy");
        }

        TestVo vo3 = new TestVo("vo_3");
        TestVo[] srcObjArr = new TestVo[] { vo3, new TestVo("vo_4") };

        List<TestVo> destObjList = Arrays.asList(srcObjArr);
        vo3.setName("vo_3_new");
        System.out.println(" srcObjArr[0]的属性Name修改为:vo_3_new");
        System.out.println("destObjList[0]的属性Name当前值:"
                + destObjList.get(0).getName());
        if ("vo_3_new".equals(destObjList.get(0).getName())) {
            System.out.println("Array -> List for Bean : 浅度copy");
        } else {
            System.out.println("Array -> List for Bean : 深度copy");
        }
        System.out.println("==============================");

运行结果:
引用

==============================
List -> Array
List -> Array 集合中元素的顺序不变
srclist clear()
destArr length=2
List -> Array for String : 深度copy
List -> Array 集合中元素的顺序不变
srcVolist[0]的属性Name修改为:xiaoxiao_new
destVoArr[0]的属性Name当前值:xiaoxiao_new
List -> Array for Bean : 浅度copy
Array -> List
Array -> List for String : 深度copy
srcObjArr[0]的属性Name修改为:vo_3_new
destObjList[0]的属性Name当前值:vo_3_new
Array -> List for Bean : 浅度copy
==============================

【二】、 Set <-> Array
 System.out.println("==============================");
        // Set -> Array
        System.out.println("Set -> Array");
        System.out.println("Set -> Array 集合中元素的顺序会变");
        Set<String> srcSet = new HashSet<String>();
        srcSet.add("michael");
        srcSet.add("xiaoxiao");
        String[] destArr = srcSet.toArray(new String[srcSet.size()]);
        System.out.println(" String destArr size: " + destArr.length);

        Set<TestVo> srcObjSet = new HashSet<TestVo>();
        TestVo vo1 = new TestVo("michael");
        srcObjSet.add(vo1);
        srcObjSet.add(new TestVo("xiaoxiao"));

        TestVo[] destObjArr = srcObjSet.toArray(new TestVo[srcObjSet.size()]);
        vo1.setName("michael_new");
        System.out.println(" Bean destArr size: " + destArr.length);
        boolean deepFlag = true;
        for (TestVo vo : destObjArr) {
            if ("michael_new".equals(vo.getName())) {
                deepFlag = false;
                break;
            }
        }
        if (deepFlag) {
            System.out.println("Set -> Array for Bean : 深度copy");
        } else {
            System.out.println("Set -> Array for Bean : 浅度copy");
        }

        // Array -> Set
        System.out.println("Array -> Set");
        System.out.println("Array -> Set 集合中元素的顺序会变");
        String[] srcArr = new String[] { "michael", "xiaoxiao" };
        Set<String> destSet = new HashSet<String>(Arrays.asList(srcArr));

        System.out.println(" String destSet size: " + destSet.size());

        TestVo vo3 = new TestVo("michael");
        TestVo[] srcObjArr = new TestVo[] { vo1, new TestVo("xiaoxiao") };

        Set<TestVo> destObjSet = new HashSet<TestVo>(Arrays.asList(srcObjArr));
        vo3.setName("michael_new");
        System.out.println(" Bean dest Set size: " + destObjSet.size());
        deepFlag = true;
        for (TestVo vo : destObjSet) {
            if ("michael_new".equals(vo.getName())) {
                deepFlag = false;
                break;
            }
        }
        if (deepFlag) {
            System.out.println("Array -> Set for Bean : 深度copy");
        } else {
            System.out.println("Array -> Set for Bean : 浅度copy");
        }

        System.out.println("==============================");

执行结果:
引用
==============================
Set -> Array
Set -> Array 集合中元素的顺序会变
String destArr size: 2
Bean destArr size: 2
Set -> Array for Bean : 浅度copy
Array -> Set
Array -> Set 集合中元素的顺序会变
String destSet size: 2
Bean dest Set size: 2
Array -> Set for Bean : 浅度copy
==============================

【三】、 List <-> Set
System.out.println("==============================");
        // List -> Set
        System.out.println("List -> Set");
        System.out.println("List -> Set 集合中元素的顺序不变");
        List<String> srclist = new ArrayList<String>();
        srclist.add("src_list_a");
        srclist.add("src_list_b");

        Set<String> destSet = new HashSet<String>(srclist);
        srclist.clear();
        if (destSet.size() == 2) {
            System.out.println("List -> Set for String : 深度copy");
        } else {
            System.out.println("List -> Set for String : 浅度copy");
        }

        List<TestVo> srcObjList = new ArrayList<TestVo>();
        TestVo vo1 = new TestVo("michael");
        srcObjList.add(vo1);
        srcObjList.add(new TestVo("xiaoxiao"));

        Set<TestVo> destObjectSet = new HashSet<TestVo>(srcObjList);
        vo1.setName("michael_new");

        if ("michael_new".equals(destObjectSet.iterator().next().getName())) {
            System.out.println("List -> Set for Bean : 浅度copy");
        } else {
            System.out.println("List -> Set for Bean : 深度copy");
        }

        // Set -> List
        System.out.println("Set -> List");
        System.out.println("List -> Set 集合中元素的顺序会变");
        Set<String> srcSet = new HashSet<String>();
        srcSet.add("src_set_a");
        srcSet.add("src_set_b");
        List<String> destList = new ArrayList<String>(srcSet);
        srcSet.clear();
        if (destList.size() == 2) {
            System.out.println("Set -> List for String : 深度copy");
        } else {
            System.out.println("Set -> List for String : 浅度copy");
        }

        Set<TestVo> srcObjSet = new HashSet<TestVo>();
        TestVo vo3 = new TestVo("vo_3");
        srcObjSet.add(vo3);
        srcObjSet.add(new TestVo("vo_4"));

        List<TestVo> destObjList = new ArrayList<TestVo>(srcObjSet);
        vo3.setName("vo_3_new");
        if ("vo_3_new".equals(destObjList.get(0).getName())
                || "vo_3_new".equals(destObjList.get(1).getName())) {
            System.out.println("Set -> List for Bean : 浅度copy");
        } else {
            System.out.println("Set -> List for Bean : 深度copy");
        }
        System.out.println("==============================");

执行结果:
引用
==============================
List -> Set
List -> Set 集合中元素的顺序不变
List -> Set for String : 深度copy
List -> Set for Bean : 浅度copy
Set -> List
List -> Set 集合中元素的顺序会变
Set -> List for String : 深度copy
Set -> List for Bean : 浅度copy
==============================

【四】、 List <-> Collection
  System.out.println("==============================");
        System.out.println("List -> Collection");
        List<String> list = new ArrayList<String>();
        list.add("michael");
        list.add("xiaoxiao");
        Collection<String> destCol = list;
        System.out.println("destCol size:" + destCol.size());
        System.out.println("List继承于Collection,可以直接赋值");

        System.out.println("Collection -> List");
        Collection<String> col = new ArrayList<String>();
        col.add("michael");
        col.add("xiaoxiao");
        List<String> destList = new ArrayList<String>(col);
        System.out.println("destList size:" + destList.size());

        System.out.println("==============================");

执行结果:
引用
==============================
List -> Collection
destCol size:2
List继承于Collection,可以直接赋值
Collection -> List
destList size:2
==============================

【五】、 Array Copy
System.out.println("==============================");
        System.out.println("Array Copy :String");
        String[] srcArr = new String[] { "michael", "xiaoxiao" };
        String[] destArr = new String[srcArr.length];

        System.arraycopy(srcArr, 0, destArr, 0, srcArr.length);

        System.out.println("Array Copy : Bean");

        TestVo vo1 = new TestVo("michael");
        TestVo[] srcObjArr = new TestVo[] { vo1, new TestVo("xiaoxiao") };
        TestVo[] destObjArr = new TestVo[srcArr.length];

        System.arraycopy(srcObjArr, 0, destObjArr, 0, srcObjArr.length);
        vo1.setName("michael_new");
        System.out.println("srcObjArr[0]的属性name修改为:michael_new");
        System.out
                .println("destObjArr[0]的属性name当前值:" + destObjArr[0].getName());
        if (srcObjArr[0] == destObjArr[0]) {
            System.out.println("Array Copy for Bean : 浅度copy");
        } else {
            System.out.println("Array Copy for Bean : 深度copy");
        }
        System.out.println("==============================");

执行结果:
引用
==============================
Array Copy :String
Array Copy : Bean
srcObjArr[0]的属性name修改为:michael_new
destObjArr[0]的属性name当前值:michael_new
Array Copy for Bean : 浅度copy
==============================

【六】、 List Copy
System.out.println("==============================");
        System.out.println("List Copy :String");

        List<String> srcList = new ArrayList<String>();
        srcList.add("michael");
        srcList.add("xiaoxiao");

        List<String> descList = srcList;

        List<String> descList2 = new ArrayList<String>(srcList);

        List<String> descList3 = new ArrayList<String>(Arrays
                .asList(new String[srcList.size()]));
        Collections.copy(descList3, srcList);

        srcList.clear();
        System.out.println("源List清空");
        System.out.println("直接赋值descList = srcList 的方法copy后的List     size: "
                + descList.size());
        System.out.println("new ArrayList<String>(srcList)的方法copy后的List size: "
                + descList2.size());
        System.out.println("Collections.copy(dest,src)的方法copy后的List     size: "
                + descList3.size());

        System.out.println("==============================");

执行结果:
引用
==============================
List Copy :String
源List清空
直接赋值descList = srcList 的方法copy后的List     size: 0
new ArrayList<String>(srcList)的方法copy后的List size: 2
Collections.copy(dest,src)的方法copy后的List     size: 2
==============================


转载请注明来自:Michael's blog @http://sjsky.iteye.com/

-----------------------------------分 ------------------------------------隔 ------------------------------------线 --------------------------------------


5
0
分享到:
评论

相关推荐

    delphi中String,PChar,PByte,Array of Char,Array of Byte 互相转换

    ### Delphi中String,PChar,PByte,Array of Char,Array of Byte 互相转换 在Delphi编程语言中,字符串和其他与字符相关的数据类型之间的转换是常见的需求。本篇文章将详细介绍如何在这些数据类型之间进行转换,...

    Array.Copy 方法

    在复制过程中,如果源数组和目标数组包含的是不同类型的元素,`Array.Copy`会自动进行类型转换或装箱操作,只要这种转换是合法的。请注意,这种方法不支持跨类型的复制,比如从`int[]`复制到`string[]`。 **1. Copy...

    java List、Set与Array之间的相互转换

    理解它们之间的相互转换能够帮助我们更好地管理和操作数据。以下将详细介绍Java中List、Set与Array之间的转换方法。 1. **List与Array的转换** - **Array转List**: 如果你有一个数组,可以使用`Arrays.asList()`...

    Pandas实现dataframe和np.array的相互转换

    Pandas是一个强大的Python数据分析和处理库,广泛应用于数据挖掘和数据分析领域。...通过上述方法,可以有效地在Pandas的DataFrame和NumPy的Array之间进行快速转换,充分利用两者各自的优势,提高工作效率。

    Javascript实现Array和String互转换的方法

    在JavaScript中,Array(数组)和String(字符串)的互转换是经常需要掌握的基础知识点,尤其在处理数据时非常实用。本文将详细介绍如何使用JavaScript内置方法来实现数组与字符串之间的转换,其中涉及到了两个重要...

    Numpy数组array和矩阵matrix转换方法

    总结来说,Numpy中的数组和矩阵转换方法非常简单直接,可以通过np.mat函数和np.array函数来实现互相转换。在实际应用中,我们应根据具体需要选择合适的数据结构。在Numpy新版本中,建议更多地使用ndarray对象来进行...

    Collection与Collections,Array与Arrays的区别

    Collection与Collections,Array与Arrays的...Collection和Array是Java中两个基本的数据结构,而Collections和Arrays是两个静态类,提供了对集合和数组的各种操作。了解他们之间的区别对于Java开发人员来说非常重要。

    Python中列表list以及list与数组array的相互转换实现方法

    本文主要介绍了Python中列表(`list`)以及列表与数组(`array`)之间的相互转换方法。列表是Python中最基础的数据结构之一,支持灵活地添加和删除元素。数组则更适合于数值计算,提供更高效的内存管理和运算性能。通过...

    Array & Json相互转换js

    本篇将详细探讨如何在JS中实现Array与JSON之间的相互转换。 首先,我们需要理解两者的概念。数组是JavaScript中的内置对象,它是一个有序的数据集合,可以通过索引来访问其元素。而JSON是一种轻量级的数据交换格式...

    数组和list相互转换

    在编程领域,数组(Array)和列表(List)是两种常用的数据结构,它们各自具有不同的特点和适用场景。数组是一种固定长度的数据结构,适合存储已知大小的数据集合;而列表则是一种可变长度的数据结构,适合存储未知...

    详解Java如何在Array和List之间进行转换.rar

    总结,Java中Array和List之间的转换主要依赖于Arrays类的asList()方法、ArrayList的toArray()方法以及Java 8引入的Stream API。理解这些转换方式及其适用场景,能够帮助我们在编程中更灵活地处理数据结构,提高代码...

    Java 在 Array 和 Set 之间进行转换的示例.rar

    在Java编程语言中,Array和Set是两种不同的数据结构,它们各自有其特性和用途。Array是一种固定大小的序列,可以存储基本类型或对象,并且元素可以通过索引访问。而Set是一个不允许有重复元素的集合,它维护了元素的...

    IMAGE_TO_ARRAY:Python脚本将图像转换为颜色深度= 4且位深度= 2的字节数组

    上面的命令将名为checkboxfalse_icon.svg的图像转换为位深度为2的c标头,尺寸为34x34(iw和ih的默认值为24,并且不是必需的) 输出头文件 #define CHECKBOXFALSE_ICON_H #include "../../UI/Widgets/Icon2bit.h" ...

    cad扩展程序,扩展了copy,array等命令的功能

    cad程序:有三个命令,1.xcp在拷贝时自动增加拷贝内容的数字串。 2,xarr array的扩展,同1 3. xchg 可以修改相同的字符串,使其中的数字增加

    C# Array和ArrayList,List区别

    ### C# 中 Array、ArrayList 和 List 的区别 在C#编程语言中,处理集合数据时,程序员经常需要根据实际需求选择合适的集合类型。本文将详细解释C#中Array、ArrayList和List之间的区别,并通过示例代码帮助理解这些...

    python实现矩阵和array数组之间的转换

    本文将详细介绍如何在Python中实现矩阵和array数组之间的转换。 首先,让我们了解array和matrix的基本概念: 1. **NumPy Array**: NumPy的array是多维数组,它支持各种数学操作,如加法、减法、乘法等。Array是...

    C_Array Array数组

    Array类是.NET框架提供的一种特殊类型,它提供了对所有数组的通用操作,包括排序、查找和转换。Array类的方法如`Copy`用于复制数组的部分或全部,`Sort`用于对数组元素进行排序。 ArrayList是.NET Framework早期...

    PV_Array.zip_PV array模块_pv array 仿真_pv arraymatlab_光伏特性_光伏电池

    标题中的“PV_Array.zip”是一个压缩包文件,包含与光伏(Photovoltaic,简称PV)系统相关的材料,特别是关于“PV array”的建模和仿真。"PV array"指的是由多个光伏电池串联或并联组成的光伏阵列,是太阳能发电系统...

    整形数组与字符数组相互转换

    本示例涉及的是整形数组(int array)与字符数组(uchar array)之间的转换,这对于数据存储和传输具有重要意义。在Qt或VC++环境中,这种转换对于数据库交互,特别是当数据库要求特定数据格式时,尤为关键。 首先,...

Global site tag (gtag.js) - Google Analytics