Java—可变参数、不可变集合

目录

可变参数

不可变集合


可变参数

Java5 中提供了可变参数,可变参数是一种特殊形参,定义在方法、构造器的形参列表中。

可变参数格式:属性类型...参数名称
可变参数示例:int...args

可变参数传参特点
1. 可以不传参数;
2. 可以传一个或者同时传多个参数;
3. 可以直接传一个数组作为参数

可变参数优点:常常用来灵活的接收数据。

可变参数注意事项
1. 可变参数在方法内部相当于是一个数组;
2. 一个形参列表中的可变参数只能有一个;
3. 如果除可变参数外还需传递其它参数,则可变参数必须放在形参列表的最后面。

代码示例

 
public static void main(String[] args) throws ParseException {
 
    //可变参数
    System.out.println(getSum()); // 0
    System.out.println(getSum(2, 2, 2));// 6
    System.out.println(getSum(new int[]{1, 1, 1}));// 3
    System.out.println(getSum2("总和=", 2, 2, 2));// 总和=6
 
}
 
public static int getSum(int... arr) {
    int sum = 0;
    for (int i = 0; i < arr.length; i++)
        sum += arr[i];
    return sum;
}
 
public static String getSum2(String str, int... arr) {
    int sum = 0;
    for (int i = 0; i < arr.length; i++)
        sum += arr[i];
    return str + sum;
}

不可变集合

JDK9开始,Java提供了不可变集合。

应用场景
1. 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践;
2. 或者当集合对象被不可信的库调用时,不可变形式是安全的;
3. 简单理解:不想让别人修改集合中的内容。

书写格式
在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。

static<E> List<E> of(E...elements)            //创建一个具有指定元素的List集合对象
static<E> Set<E> of(E...elements)             //创建一个具有指定元素的Set集合对象
static <K,V> Map<K,V> of(E...elements)        //创建一个具有指定元素的Map集合对象

注意:创建后的集合不能进行添加,删除和修改操作。 

代码示例如下

 
List<Integer> list1 = List.of(1, 2, 3, 4);
List<Integer> list2 = List.of(new Integer[]{1, 2, 3, 4, 5, 6});
//list1.remove(Integer.valueOf(1));//报错,不可变集合不可被修改
 
Set<Integer> set1 = Set.of(1, 2, 3, 4);
Set<Integer> set2 = Set.of(new Integer[]{1, 2, 3, 4, 5, 6});
//Set<Integer> set3 = Set.of(1, 1, 2, 2, 3, 4);//报错:定义一个不可变的Set集合时,需要保证元素的唯一性
 
Map<String, String> map1 = Map.of("key1", "value1", "key2", "value1", "key3", "value3");//值可以不唯一
//Map<String, String> map2 = Map.of("key1", "value1", "key1", "value2");//报错:定义一个不可变Map集合时,需要保证键的唯一性

注意:Map.of 方法最多支持传递 20 个参数,即最多创建 10 对键值对的不可变集合。如果需要创建包含更多键值对的不可变集合,可以使用 Map.ofEntries 方法,并传入键值对数组。以下是使用 Map.ofEntries 创建不可变集合的示例代码。

HashMap<String, String> hm = new HashMap<>();
hm.put("111", "aaa");
hm.put("222", "bbb");
hm.put("333", "ccc");
hm.put("444", "ddd");
 
//获取到Map的所有键值对对象
Set<Map.Entry<String, String>> entries = hm.entrySet();
/*
 *  创建一个长度为0的键值对数组
 *  Map.Entry[] arr1 = new Map.Entry[0];
 *  将集合转换为数组形式,需要提供想转换的数组类型,因此toArray()传入的参数为上面创建好的键值对数组
 *  Map.Entry[] arr2 = entries.toArray(arr1);
 *  toArray方法在底层会比较集合的长度跟数组的长度
 *  如果集合的长度 > 数组的长度:说明数据在数组中放不下,此时会根据实际数据的个数,重新创建新数组
 *  如果集合的长度 ≤ 数组的长度:说明数据在数组中放的下,此时不会创建新的数组,而是直接用传入的数组存放
 *  以上两行代码可以转化成下面一行
 * */
Map.Entry[] arr = entries.toArray(new Map.Entry[0]);
// 通过ofEntries方法创建不可变集合
Map map = Map.ofEntries(arr);
 
 
//代码简化如下
//Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
JDK10开始,JAVA提供了更便捷的方式,我们可以利用Map.copyOf()方法创建多于10 对键值对的不可变集合Map集合。
HashMap<String, String> hm = new HashMap<>();
hm.put("111", "aaa");
hm.put("222", "bbb");
hm.put("333", "ccc");
hm.put("444", "ddd");
Map<String, String> map = Map.copyOf(hm);

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值