tag数组-刷题预备知识-1. 集合和数组之间的转换(重要) 2.8
我们在手撕力扣的时候, 经常能遇到这样类型的题目: 要求你返回值是一个数组, 但是存储的是一个长度未知的一组数或是需要暂时存储一个长度不定的数, 这个时候, 可能大多数想到的就是前期先把需要的数组或者字符串放到集合中, 根据题目需要选择是ArrayList(可重复, 不排序但根据索引查找, 方便), HashSet(不可重复, 用来去重), TreeSet(重写比较器方法进行排序), 或是k-v对的HashMap, 然后在返回的时候, 把集合转换为数组返回即可
那么, 在遇到上述这种问题时, 我们就不可避免的要用到数组<---->集合之间的相互转换
.
零. WARNING: List<Integer> 转换为 int[] 的方法
//jdk8 以上才可支持
int[] arr = list.stream().mapToInt(Integer::valueOf).toArray();
补充文章: 转换
栗子: 剑指Offer.29-顺时针打印矩阵
一, 集合转为数组 (list.toArray() / list.toArray( T[] a))
常用方法:
list.toArray(new Object(size))
, new Object意思是把集合list转换为Obecj类型, 长度为size, 当然了Object可以是常用的Integer[], String等等.注意:
集合.toArray(new Object(size))
这种方法,万万不能用于 List<Integer> 和 int[] 的转换, 即 list.toArray(new int[list.size()]) 是不对的!!!!!!!!
看几个常用的集合类,如上图继承关系图,可以看到他们都集成了一个抽象类AbstractCollection,这个类中就实现了Collection接口的两个方法:
- toArray ( )
- toArray ( T[ ] a )
前者的返回值是一个Object的数组,Object[],这个数组是不可以进行强制数据类型转换的,如下:
list. toArray ( T[ ] a )
适用于返回一个给定类型的数组, 比如返回字符数组: list.toArray(new Character[ list.size() ]), 注意这意味着集合中的数据类型也为 Character类型,
二, 数组转为集合( List<泛型> list = Arrays.asList(数组) / Collections.addAll(目标集合, 待转数组))
数组转换为集合, 使用
Arrays.asList(待转数组)
或者是Collections中.addAll(目标集合, 待转数组)
方法.
三, 集合之间的转换( 目标集合.addAll(待转集合), 返回值是布尔类型)
集合之间互转, 比如把一个treeSet集合转为list集合,
list.addAdd(treeset)
四, 集合与数组, 集合与集合转换栗子大杂烩
1. package cn.itcast.collectionChange;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 public class CollectionChange2 {
12 public static void main(String[] args) {
13 //一.List-->数组 用到了list对象的toArray()方法(返回Object数组 ).
14 List<String> list = new ArrayList<String>();
15 list.add("tom");
16 list.add("Jerval");
17 list.add("WeiSi");
18
19 //①对应的Object数组.
20 Object[] objects = list.toArray();//返回Object数组
21 //打印数组中的元素.
22 System.out.println("objects:"+Arrays.toString(objects));
23
24 //②变成相应的String数组.(方式一)list对象的toArray()方法.
25 String[] strings1 = new String[list.size()];
26 list.toArray(strings1);//将转化后的数组放入已经创建好的对象中
27 System.out.println("strings1:"+Arrays.toString(strings1));
28
29 //③变成相应的String数组.(方式二)list对象的toArray(T[])方法.
30 //下面的toArray(new String[0])中仅仅是参数要传递一个数组类型.数组要初始化,中括号重要有一个数组.
31 //注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。
32 String[] strings2 = list.toArray(new String[0]);//将转化后的数组赋给新对象
33 System.out.println("strings2:"+Arrays.toString(strings2));
34
35
36 //二.数组-->List 数组工具类Arrays中的asList()方法.
37 String[] ss = {"JJ","KK"};
38 List<String> list1 = Arrays.asList(ss);
39 List<String> list2 = Arrays.asList("AAA","BBB");
40 System.out.println(list1);
41 System.out.println(list2);
42
43
44 //三.Set-->List 直接用List中的构造方法就可以了.
45 //ArrayList(Collection<? extends E> c)
46 //构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
47 Set<String> set = new HashSet<String>();
48 set.add("11");
49 set.add("11");
50 set.add("33");
51 List<String> list3 = new ArrayList<String>(new HashSet<String>());
52 List<String> list4 = new ArrayList<String>(set);
53
54 //四.List-->Set
55 //用Set集合中的构造方法
56 Set<String> setx = new HashSet<String>(new ArrayList<String>());
57
58 //五.数组-->Set 先把数组用Arrays中的asList变成一个list,然后再转换成Set.
59 String[] strs = {"AA","BB"};
60 Set<String> set2 = new HashSet<String>(Arrays.asList(strs));
61 System.out.println(set2);
62
63 //六.Set-->数组 用Set对象中的toArray()方法.
64 Set<String> set3 = new HashSet<String>(Arrays.asList("PP","OO"));
65
66 String[] strSet = new String[set3.size()];
67 set3.toArray(strSet);
68 System.out.println(Arrays.toString(strSet));
69
70 //七.Map操作
71 Map<String, String> map = new HashMap<String, String>();
72 map.put("YYY", "UUU");
73 map.put("RRR", "TTT");
74 // 将键转化为Set 用keySet()方法.
75 Set<String> mapKeySet = map.keySet();
76
77 // 将值转化为Set
78 Set<String> mapValuesSet = new HashSet<String>(map.values());
79
80 // 将值转化为List
81 List<String> mapValuesList = new ArrayList<String>(map.values());
82 }
83 }
参考文章:
https://www.runoob.com/java/java-arraylist-addall.html
http://c.biancheng.net/view/4727.html
https://www.cnblogs.com/qiuyu-blog/p/4554658.html
https://blog.csdn.net/weixin_33748818/article/details/85700215
https://www.cnblogs.com/deng-cc/p/8072930.html
https://www.cnblogs.com/ClearX/p/5479125.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)