数组和集合之间关系

本文介绍Java中Set、List和数组之间的转换方法,包括List、Set转换为数组及数组转换为List、Set的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组和List、Set都可以存放多个元素,数组的特点是长度固定,访问速度非常快,元素类型单一;List的特点是长度可以动态增加,能够维护元素的次序,存入的所有元素都当做Object,允许元素重复;Set的特点是长度可以动态增加,能够保证元素不重复,存入的所有元素都当做Object。本节实例介绍Set、List和数组之间如何转换,将Set、List对象中的元素转换为数组,将数组转换为Set、List对象,转换过程中元素保持不变。

关键技术剖析:

实现List、Set和数组之间转换的关键技术点如下:
List转换成数组可以使用List的toArray方法,返回一个Object数组。
Set转换成数组可以使用Set的toArray方法,返回一个Object数组。

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

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

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

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

public class TestCollectionToArray {

   public static void main(String[] args) {
      List list = new ArrayList();
      list.add("a");
      list.add("b");
      list.add("c");
      list.add("d");
      // list.add(1);//会产生java.lang.ArrayStoreException异常
      // 当list中的数据类型都一致时可以将list转化为数组
      Object[] array = list.toArray();
      System.out.println("从list转换成的对象数组长度为:" + array.length);
      // 在转化为其它类型的数组时需要强制类型转换,并且,要使用带参数的toArray方法,参数为对象数组,
      // 将list中的内容放入参数数组中,当参数数组的长度小于list的元素个数时,会自动扩充数组的长度以适应list的长度
      String[] array1 = (String[]) list.toArray(new String[0]);
      System.out.println("从list转换成的字符串数组长度为:" + array1.length);
      // 分配一个长度与list的长度相等的字符串数组
      String[] array2 = (String[]) list.toArray(new String[list.size()]);
      System.out.println("从list转换成的字符串数组长度为:" + array2.length);
      list.clear();

      // 将数组转换成list
      for (int i = 0; i < array.length; i++) {
         list.add(array[i]);
      }
      System.out.println("将数组转换成list的元素个数为:" + list.size());
      list.clear();
      // 直接使用Arrays的asList方法
      list = Arrays.asList(array);
      System.out.println("将数组转换成list的元素个数为:" + list.size());

      Set set = new HashSet();
      set.add("a");
      set.add("b");
      // 将set转换为数组
      array = set.toArray();
      array1 = (String[]) set.toArray(new String[0]);
      array2 = (String[]) set.toArray(new String[set.size()]);
      System.out.println("从Set转换成的对象数组长度为:" + array.length);
      System.out.println("从Set转换成的字符串数组长度为:" + array2.length);
      // 数组转换成Set
      // 将数组转换成List后,再用List构造Set
      set = new HashSet(Arrays.asList(array));
      System.out.println("将数组转换成Set的元素个数为:" + list.size());
      // 将Set清空,然后把数组转换成的list全部add
      set.clear();
      set.addAll(Arrays.asList(array1));
      System.out.println("将数组转换成Set的元素个数为:" + list.size());
   }
}
### Python 数组集合的比较 #### 定义与基本概念 Python 中的数组集合都是用于存储多个项的数据结构,但是两者有着显著的不同之处。数组是一种有序的数据容器,允许重复元素的存在,并且可以通过索引访问各个位置上的元素[^1]。 而集合则是一个无序不重复元素集,在数学意义上更接近于传统意义上的集合定义。这意味着一旦某个值被加入到一个集合里之后就不会再有相同的副本存在;另外由于其内部实现机制的原因(通常是哈希表),查找操作通常非常快速[^2]。 #### 数据类型支持 对于 Python 的内置 `array` 类型来说,虽然名字叫作“数组”,但实际上它更像是 C 或 Java 里的原生类型数组——即只能够容纳固定大小同一种简单数值类型的序列(比如整数、浮点数)。如果要创建一个多态性的可变长度列表,则应该考虑使用 Python 自带的 list 列表而不是 array 模块下的对象[^4]。 相比之下,set 集合并没有这样的限制,它可以包含任何不可变的对象作为成员,包括但不限于字符串、元组甚至是其他自定义类实例等复杂数据形式。 #### 基本操作对比 当涉及到具体的操作时: - **添加元素** 对于数组而言,追加新项目意味着增加整个序列最后面的一个或几个连续的位置,并填入指定的内容。这可以通过 append() 函数完成。 ```python arr = [1, 2, 3] arr.append(4) # 结果变为 [1, 2, 3, 4] ``` 而对于 set 来说,add() 方法用来向其中引入新的唯一成员。如果有重复尝试插入已存在的键,则不会有任何效果也不会抛出异常。 ```python s = {1, 2} s.add(3) # s 变成 {1, 2, 3} s.add(2) # 不会发生变化,因为 2 已经存在于集合中 ``` - **删除元素** 从数组中移除特定下标的条目可以利用 del 关键字或者 pop() 方法来达成目的; ```python del arr[0] # 删除第一个元素后的结果为 [2, 3, 4] item = arr.pop(-1) # 移走最后一个元素并返回它的值 (这里 item=4),剩余部分变成 [2, 3] ``` 而在 sets 上执行 remove(x)/discard(x), 如果 x 存在于当前集合内就会将其剔除出去; 若不存在的话 discard() 将什么也不做但 remove() 会引发 KeyError 错误提示找不到该元素。 ```python s.remove(3) # 成功后 s={1, 2} try: s.remove(999) # 此处将会触发错误 except KeyError as e: print(e) s.discard(999) # 这句代码没有任何影响 ``` - **遍历方式** 两种结构都提供了迭代器协议的支持,因此可以直接放入 for 循环体当中逐一遍历每一个组件: ```python for element in my_array_or_set: process(element) ``` 不过值得注意的是,由于 sets 是无序排列的所以每次循环得到的结果顺序可能会有所差异. #### 性能考量 在性能方面,sets 在测试成员资格以及寻找交集/差集等方面往往表现出色得多,这是因为底层采用了高效的散列算法来进行管理检索工作。然而如果是按照一定次序读取全部记录或是频繁地修改相邻几项之间的相对关系时,lists arrays 显然更加适合一些[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值