Java之数组转集合&集合转数组[通俗易懂]

Java之数组转集合&集合转数组[通俗易懂]一、数组转换为集合需要注意的是,转换只能转换为List集合。那么为什么不能转换为Set集合呢?原因是:Set不能存放重复元素,所以若转换为Set集合可能出现丢失元素的情况。。。数组转换为集合使用的是数组的工具类Arrays的静态方法asList。查看API文档可知该方法返回由指定数组支持的固定大小的列表。eg:importjava.util.Arrays;importjava.u…

大家好,又见面了,我是你们的朋友全栈君。

一、数组转换为集合

需要注意的是,转换只能转换为List集合。那么为什么不能转换为Set集合呢?

原因是:Set不能存放重复元素,所以若转换为Set集合可能出现丢失元素的情况。。。

数组转换为集合使用的是数组的工具类Arrays的静态方法asList。查看API文档可知该方法返回由指定数组支持的固定大小的列表。
在这里插入图片描述
eg:

import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list);//[刘雯, 胡歌, 杜鹃, 邓伦]
}
}

思考一下:如果我想往这个由数组转换过来的集合里面添加元素,我能不能直接调用add方法呢?先试试
eg:

import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list);
	 list.add(1,"杨紫");
	 System.out.println(list);
	 
}
}

结果运行异常:
在这里插入图片描述
那么为什么会出现这样的结果呢?

原因:这个新集合是由数组转换过来的,那么该集合就表示原来的数组,所以对集合的操作就是对数组的操作。那么添加元素会导致原数组扩容,那么就不能表示原来的数组了。所以不允许向该集合添加新元素了。

下面就来测试一下是否改变集合中的元素,原数组元素也随之改变。

import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};//原数组元素
		List<String> list = Arrays.asList(strArr);
		System.out.println(list); 
		list.set(3, "杨紫");//将集合中下标为3的元素替换为“杨紫”
		System.out.println(list);//修改后的集合打印结果:[刘雯, 胡歌, 杜鹃, 杨紫]
		//下面打印数组中的元素,检测数组元素是否改变
		for (String Arr : strArr) {
			System.out.println(Arr);
			/*
				打印结果:刘雯
                         胡歌
                         杜鹃
                         杨紫
			*/
	//结果说明:对这个由数组转化过来的集合进行操作会导致原数组的改变。	
		}
	}
}

怎么解决想往集合添加元素这个问题呢?

方法一:我们通过实验知道数组转化为List是不能增删数据的,如果需要增删,可以利用空集合调用addAll方法将转化后的集合全部添加新集合就可以进行操作了。

示例代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list); 
	/*list.add(1,"杨紫");这样直接调用add方法会出现运行异常。
	 *可以利用空集合调用addAll方法将转化后的集合全部添加新集合就可以进行操作了。
	 */
	 List<String> newList = new ArrayList<>();
	 /*
	  * tips:为什么右边这个尖括号中不写String呢?
	  * 原因:从JDK1.7开始,右侧的尖括号内部可以不写内容,但是<>还是要写的。
	  */
	 newList.addAll(list);
	 newList.add(1,"杨紫");
	 System.out.println(newList);
}
}



方法二(比较推荐的写法):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
			String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
			List<String> list = Arrays.asList(strArr);
			System.out.println(list); 
//		    List<String> newList = new ArrayList<>();
//			newList.addAll(list);
//		    newList.add(1,"杨紫");
//		    System.out.println(newList);
			 List<String> newList = new ArrayList<>(list);
			 /*
			  *所有的集合都提供了一个带有Collection类型参数的构造方法。
			  *该构造方法称为:复制构造器
			  *作用:在创建当前集合的同时,集合中包含给定集合中的所有元素。
			  */
			 newList.add(1,"杨紫");
			 System.out.println(newList);
		 
		}
	}

二、集合转换为数组

在这里插入图片描述

查看API可知有这两个方法可以帮助我们很容易地将集合转换为数组。其中第二个方法是比较常用的,我们可以传入一个指定类型的数组,该数组元素类型与集合元素类型一致。返回值是转化后的数组,该数组会保留集合中的所有元素。
eg:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class testListToArray {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
    	list.add("刘雯");
    	list.add("杨紫");
    	list.add("胡歌");
    	String [] strArr =  list.toArray( new String[]{});
    	System.out.println(Arrays.toString(strArr));//[刘雯, 杨紫, 胡歌]
    	/*
    	 * 这里解释一下为什么要调用Arrays.toString()方法,因为这个集合转换后的数组类型为
    	 * String,是引用类型的。在这里我们并没有重写toString方法,如果直接打印strArr,
    	 * 你将会看到的是@散列码。所以要想看到数组中的内容有两种解决方案,一是你在代码中重写
    	 * toString方法,二是你直接使用Arrays.toString()方法。
    	 */
	}
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148482.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • form factor_perform和performance的区别和用法

    form factor_perform和performance的区别和用法performSelector:withObject:是在iOS中的一种方法调用方式。他可以向一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以这也是runtime的一种应用方式。performSelector和直接调用方法的区别就在与runtime。直接调用编译是会自动校验。如果方法不存在,那么直接调用在编译时候就能够发现,编译器会直接报错。但是使用performSelec…

    2025年8月2日
    3
  • Android 新特性_Android10使用

    Android 新特性_Android10使用2016年5月19日,谷歌在美国加州的山景城举办了GoogleI/O开发者大会中发布。2016年6月,AndroidN正式命名为“牛轧糖”本届I/O开发者大会上,Google重点介绍了Android系统三个维度:分别是性能、安全和生产力。其中性能主要新增了VulkanAPI与JIT编译器(前者优化图形性能、或者加快软件安装速度);安全性包括新的数据加密方式、恶意网站识别、系统的实时更新;

    2025年9月21日
    5
  • java 开发中 dom4j的简单用法「建议收藏」

    java 开发中 dom4j的简单用法「建议收藏」Java中处理XML的方式有很多种,个人任务dom4j还是比较好用的。下面介绍以下简单的使用方法先把import补充上1.首先我们一般会先根据各种方式得到一个xml格式的字符串或者文件,例如:

    2022年7月4日
    36
  • 处理:/var/redis/run/redis_6379.pid exists, process is already running or crashed「建议收藏」

    处理:/var/redis/run/redis_6379.pid exists, process is already running or crashed「建议收藏」命令;serviceredisstart/var/redis/run/redis_6379.pidexists,processisalreadyrunningorcrashed引起这类问题一般都是强制关掉电源或断电造成的,也是没等linux正常关机科学的处理办法2种1:可用安装文件启动redis-server/etc/re

    2022年6月7日
    35
  • 交换机与poe交换机区别_网络交换机和poe交换机区别

    交换机与poe交换机区别_网络交换机和poe交换机区别POE(PowerOverEthernet)指的是在目前的以太网接口Cat.5走线系统架构未作其他改变的情形下,在为一些由于IP的终端设备(如IP电话机,无线网络连接点AP,网络摄像头等)传送数据数据信号的与此同时,还能为该类机器设备给予直流电源的技术性.便是适用以太网接口供电的交换机。POE交换机和普通交换机有什么区别呢?关键分成五大层面的不一样:1.可靠性不一样;2.传送功能不一样;3.成本费不一样;4.供电方法不一样;5.操纵不一样。1.可靠性不一样;POE交换机便是适用对网络.

    2022年9月28日
    2
  • RHEL7/Centos7 i686/32bit glibc/stdc++ lib

    RHEL7/Centos7 i686/32bit glibc/stdc++ lib[hushui@HikvisionOSyum.repos.d]$sudoyuminstallglibc.i686Loadedplugins:fastestmirrorDeterminingfastestmirrorslocal|3.6kB00:00(1/2):local/group_gz…

    2022年6月5日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号