java初始化list并赋值_Java创建List、Map等集合对象的同时进
⾏赋值操作
问题简介
在Java当中,若希望在创建数组的同时给数组赋值很简单,可以想下⾯这样:
int[] num = {1,2,3};
String strs = {"a", "b", "c"}
但是,如果我们创建List集合,或者Map集合时,也想快速地为它赋初始值,应当如何做呢?
解决⽅式
⽅式1:调⽤函数
请看如下代码:
ArrayList list = new ArrayList<>(Arrays.asList("aa", "bb", "cc"));
Arrays. a) ⽅法的参数是⼀个可变长参数,也就是说他能够传⼊⼀个数组,也能够传⼊多个参数,⽽它的作⽤就是将传⼊的数组或多个数据封装成List集合返回,⽽上⾯的代码就是接收返回的List集合,并将其作为参数传⼊ArrayList的构造⽅法,创建⼀个新的ArrayList对象。
说到这⾥有⼈可能要问了,为什么不能直接将asList⽅法的返回值赋给list参数,⽽要将它传⼊构造器创建新的对象呢?这不是脱裤⼦放屁——多此⼀举吗。当然不是,请看下⾯的代码:
// 代码1
List list1 = Arrays.asList("aa", "bb", "cc");
list1.add("dd"); // UnsupportedOperationException
// 代码2
String[] str = {"a","b","c"};
List list = Arrays.asList(str);
str[0] = "e"; // list中的0号位置也⼀同改变
上⾯有两段代码,看似没有问题,但是运⾏结果却和⼤家想象的有些不同。⾸先代码1,使⽤asList⽅法返回的创建的List对象,不允许进⾏修改操作,否则将会抛出⼀个UnsupportedOperationException;再来看代码2,我们将⼀个数组作为asList的参数,得到⼀个List 对象,但是此时我们改变这个数组中元素的值,list对象的值也会发⽣改变,因为这个List对象底层引⽤的就是这个数组,并且和代码1⼀样,这个list也不能修改。
但是,若我们将返回的List对象作为参数传⼊ArrayList的构造器中,这个问题就不会发⽣,因为ArrayList的构造器将会把传⼊的list中所有的元素复制⼀份,因此不会影响到原数组,且可以随意改变。
⽅式2:匿名内部类
这是⼀个⾮常机智的⽅式,就是看到了下⾯这⾏代码,我才忍不住写了这篇博客:
List list = new ArrayList(){ {add("a"); add("b"); add("c");} };
乍⼀看是不是有点懵逼,我们将这段代码展开来看,就会清晰很多:
List list = new ArrayList() {
{
add("a");
add("b");
java定义一维数组并赋值add("c");
}
};
这下应该⽐之前容易理解了。这段代码就是创建了⼀个匿名内部类对象,且这个类继承⾃ArrayList,在这个匿名内部类中添加了⼀个⾮静态代码块,并在代码块中调⽤了三次add⽅法,为这个List对象赋值。
我们知道,若我们想创建⼀个对象,可以直接new 构造⽅法,但是我们若想写⼀个匿名内部类,这个匿名内部类继承⾃某个类,只需在构造⽅法后⾯加上⼀对⼤括号。同时,⾮静态代码块会在构造⽅法执⾏前被执⾏,所以我们将赋值语句放在了代码块中,于是就有了上⾯这段代码。若还是看不明⽩,没关系,看下⾯这段代码⼗有⼋九就明⽩了,我们将上⾯的代码换另⼀种⽅式写出来:
public class Test {
public static void main(String[] args) {
List list = new MyList();
}
}
// 创建⼀个类继承⾃ArrayList
class MyList extends ArrayList{
// 在类的⾮静态代码块中编写赋值语句
{
add("a");
add("b");
add("c");
}
}
以上代码就是最开始那句代码的完整版,创建⼀个MyList类(名字随意),继承⾃ArrayList,并编写⼀个⾮静态代码块调⽤三次add⽅法,这个代码块将会在构造⽅法执⾏前被执⾏,因此创建⼀个MyList对象后,它肯定已经有三条数据了。若到此时还没有听懂,可能就需要去了解⼀下匿名内部类,以及代码块的执⾏机制了。
这种为集合赋值的好处就是,它可以⽤在任意⼀种集合类型上(Map,),如下代码:
// 使⽤此⽅法为map赋值
HashMap map = new HashMap() {
{
put("a", 1);
put("b", 2);
put("c", 3);
}
};
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论