在实际的 Java 开发中,如何选择数据结构是一个非常重要的问题。

衡量标准化(读的效率与改的效率) :

   ① Array: 读快改慢

② Linked :改快读慢

③ Hash:介于两者之间

实现List、Set和数组之间转换的关键点如下:(一定要注意泛型的引用)

  1. List转换成数组可以使用List的toArray方法,返回一个Object数组;

    2. Set转换成数组可以使用Set的toArray方法,返回一个Object数组;

   3. 如果List或Set中元素的类型都为A,那么可以使用带参数的toArray方法,得到类型为A的数组,具体语句是“(A[])set.toArray(new A[0])”;

 4.  数组转换成List可以使用Arrays的asList静态方法,得到一个List;

    5. 数组转化成Set时,需要先将数组转化成List再用List构造Set;

Demo_1:List 转数组

import java.util.*;
public class Test {
public static void print(Double arr[]) {
for (int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
ArrayList<Double> list = new ArrayList<Double>();
// 若不写成泛型(<Double>)的方式,则下面: Double arr3[] = list.toArray(new Double[0]);
// 要改写成:Double arr3[] = (Double[])list.toArray(new Double[0]);
list.add(1.23);
list.add(4.57);
list.add(2.38);
list.add(4.598);
int size = list.size();
System.out.println(size); // 输出:4
// 第一种方法,不推荐
Double arr1[] = new Double[size];
for(int i=0;i<size;i++){
arr1[i]=(double)list.get(i);
}
print(arr1); // 输出:1.23 4.57 2.38 4.598
// 第二种方法,推荐
// 当list中的数据类型都一致时可以将list转化为数组
Object arr2[] = list.toArray();
System.out.println("从list转换成的对象数组长度为:" + arr2.length); // 输出:从list转换成的对象数组长度为:4
// 在转化为其它类型的数组时需要强制类型转换,并且,要使用带参数的toArray方法,参数为对象数组.
// 将list中的内容放入参数数组中,当参数数组的长度小于list的元素个数时,会自动扩充数组的长度以适应list的长度
Double arr3[] = list.toArray(new Double[0]);
System.out.println("从list转换成的字符串数组长度为:" + arr3.length); // 输出:从list转换成的字符串数组长度为:4
print(arr3); // 输出:1.23 4.57 2.38 4.598
// 分配一个长度与list的长度相等的字符串数组
Double[] arr4 = list.toArray(new Double[list.size()]);
System.out.println("从list转换成的字符串数组长度为:" + arr4.length); // 输出:从list转换成的字符串数组长度为:4
print(arr4); // 输出: 1.23 4.57 2.38 4.598
}
}

Demo_2:数组转 List

import java.util.*;
public class Test {
public static void main(String[] args) {
List<Double> list = new ArrayList<Double>();
list.add(1.23);
list.add(4.57);
list.add(2.38);
list.add(4.598);
System.out.println(list); // 输出:[1.23, 4.57, 2.38, 4.598]
list.clear();
System.out.println(list.size()); // 输出:0
// 直接使用Arrays的asList方法
Double arr[] = {1.23,4.57,2.38,4.598};
list = Arrays.asList(arr);
System.out.println("将数组转换成list的元素个数为:" + list.size()); // 输出:将数组转换成list的元素个数为:4
System.out.println(list); // 输出:[1.23, 4.57, 2.38, 4.598]
}
}

Demo_3:set 转数组

import java.util.*;
public class Test {
public static void print(Double arr[]) {
for (int i=0; i<arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
HashSet<Double> set = new HashSet<Double>();
// 若不写成泛型(<Double>)的方式,则下面: Double arr3[] = set.toArray(new Double[0]);
// 要改写成:Double arr3[] = (Double[])set.toArray(new Double[0]);
set.add(1.23);
set.add(4.57);
set.add(2.38);
set.add(4.598);
int size = set.size();
System.out.println(size); // 输出:4
// 第一种方法,不推荐
Double arr[] = new Double[size];
Iterator<Double> i = set.iterator();
// 若写成 Iterator i = set.iterator(),则下面要写成 arr[j] = (Double) i.next();
int j =0;
while(i.hasNext()){
arr[j] = i.next();
j++;
}
print(arr); // 输出:4.598 2.38 1.23 4.57
// 第二种方法,推荐
// 当set中的数据类型都一致时可以将set转化为数组
Object arr1[] = set.toArray();
System.out.println("从set转换成的对象数组长度为:" + arr1.length); // 输出:从set转换成的对象数组长度为:4
// 在转化为其它类型的数组时需要强制类型转换,并且,要使用带参数的toArray方法,参数为对象数组.
// 将set中的内容放入参数数组中,当参数数组的长度小于set的元素个数时,会自动扩充数组的长度以适应list的长度
Double arr2[] = set.toArray(new Double[0]);
System.out.println("从set转换成的Double数组长度为:" + arr2.length); // 输出:从list转换成的字符串数组长度为:4
print(arr2); // 输出:4.598 2.38 1.23 4.57
// 分配一个长度与list的长度相等的字符串数组
Double[] arr3 = set.toArray(new Double[set.size()]);
System.out.println("从set转换成的字符串数组长度为:" + arr3.length); // 输出:从list转换成的字符串数组长度为:4
print(arr3); // 输出: 4.598 2.38 1.23 4.57
}
}

Demo_4:数组转 set

import java.util.*;
public class Test {
public static void main(String[] args) {
HashSet<Double> set = new HashSet<Double>();
set.add(1.23);
set.add(4.57);
set.add(2.38);
set.add(4.598);
System.out.println(set); // 输出:[4.598, 2.38, 1.23, 4.57]
set.clear();
System.out.println(set.size()); // 输出:0
Double arr[] = {1.23,4.57,2.38,4.598};
// 间接使用Arrays的asList方法,将数组转换成List后,再用List构造Set
set = new HashSet<Double>(Arrays.asList(arr));
System.out.println("将数组转换成set的元素个数为:" + set.size()); // 输出:将数组转换成set的元素个数为:4
System.out.println(set); // 输出:[4.598, 2.38, 1.23, 4.57]
}
}

Java中ArrayList与数组间相互转换的更多相关文章

  1. 在Java中怎样把数组转换为ArrayList?

    翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...

  2. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  3. JAVA中ArrayList用法

    JAVA中ArrayList用法 2011-07-20 15:02:03|  分类: 计算机专业 |  标签:java  arraylist用法  |举报|字号 订阅     Java学习过程中做题时 ...

  4. Java中ArrayList与LinkedList的区别

    Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...

  5. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  6. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  7. java中ArrayList 和 LinkedList 有什么区别

    转: java中ArrayList 和 LinkedList 有什么区别 ArrayList和LinkedList都实现了List接口,有以下的不同点:1.ArrayList是基于索引的数据接口,它的 ...

  8. php中 xml json 数组 之间相互转换

    php中 xml json  数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, ' ...

  9. [转]Java中怎样把数组转换为ArrayList

    方法汇总: Element[] array = {new Element(1),new Element(2),new Element(3)}; ArrayList<Element> arr ...

随机推荐

  1. mongodb查看数据库和表的信息

    mongodb查看数据库和表的方法比较简单,在为这里推荐使用stats的方法,直观并且详细. 1.查看数据库 db.stats();1输出: { "db" : "siri ...

  2. Git 原理入门

    Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些基本命令,到底在做什么,你说得 ...

  3. YII2集成GOAOP,实现面向方面编程!

    引言: 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块.于是出现了以系统模块化特性的面向对象程序设计技术.模块化的面向对象编程极度地提高了 ...

  4. TortoiseGit —— 配置密钥

    TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.使用命令ssh-keygen -C "邮箱地址" -t rsa产生的密钥在Tortoi ...

  5. Spark 加载数据库mysql表中数据进行分析

    1.工程maven依赖包 <properties> <spark_version>2.3.1</spark_version> <!-- elasticsear ...

  6. STM32 硬件UART接收超时检测设置

    STM32 硬件UART接收超时检测设置 -----------------本文作者"智御电子",期待与电子爱好者交流学习.---------------- 应用场景 在uart应 ...

  7. 关于verilog中的signed类型

    在数字电路中,出于应用的需要,我们可以使用无符号数,即包括0及整数的集合:也可以使用有符号数,即包括0和正负数的集合.在更加复杂的系统中,也许这两种类型的数,我们都会用到. 有符号数通常以2的补码形式 ...

  8. Python入门 (三)

    迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器 ...

  9. .Net 面试题 汇总(五)

    1.简述javascript中的“=.==.===”的区别? =赋值 ==比较是否一般相等 "3"==3 //会做类型的隐式转换,true ===比较是否严格相等 "3& ...

  10. SpaceVim 语言模块 elixir

    原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属快捷键 交互式编程 运行当前脚本 模块简介 这一模块为 ...