java map初始化并赋值,Java中,常用的List的五种声明并赋值操作
java map初始化并赋值_hashmap初始化并赋值-CSDN博客
第一种方式:static 块
-
public class MapTest {
-
private static final Map<String, String> myMap = new HashMap<String, String>();
-
static {
-
myMap.put("张三", "北京");
-
myMap.put("李四", "上海");
-
}
-
}
最常规的初始化方式。
第二种方式:双括号初始化 (匿名内部类)
-
public class MapTest {
-
HashMap<String, String> myMap = new HashMap<String, String>() {{
-
put("张三", "北京");
-
put("李四", "上海");
-
}};
-
}
java8新特性,双括号初始化。
相比于第一种方式,减少了一些代码,看着舒服了不少。
第一层括弧实际是定义了一个匿名内部类 ,第二层括弧实际上是一个实例初始化块,这个块在内部匿名类构造时被执行。
因为这种方式是匿名内部类的声明方式,所以引用中持有着外部类的引用。所以当串行化这个集合时,外部类也会被不知不觉的串行化,而当外部类没有实现Serialize接口时,就会报错。其二,在上面的例子中,其实是声明了一个继承自HashMap的子类,然而有些串行化方法,例如要通过Gson串行化为json,或者要串行化为xml时,类库中提供的方式,是无法串行化Hashset或者HashMap的子类的,也就导致了串行化失败。解决办法是重新初始化为一个HashMap对象【new HashMap(map);】,这样就可以正常进行初始化了。
另外要注意的是,这种使用双括号进行初始化的语法在执行效率上要比普通的初始化写法要稍低。
第三种方式:guava
-
public class MapTest {
-
Map<String, String> myMapA = ImmutableMap.of("张三", "北京", "李四", "上海");
-
// 或者
-
Map<String, String> myMapB = ImmutableMap.<String, String>builder()
-
.put("张三", "北京")
-
.put("李四", "上海")
-
.build();
-
}
使用Guava需要引入guava依赖:
-
<dependency>
-
<groupId>com.google.guava</groupId>
-
<artifactId>guava</artifactId>
-
<version>28.1-jre</version>
-
</dependency>
需要注意的是,ImmutableMap是不可变Map,也就是说初始化之后,不能再往里面put元素了,不然会报异常java.lang.UnsupportedOperationException。
查看ImmutableMap源码也可以发现,调用put方法时,直接抛异常:
-
-
-
public final V put(K k, V v) {
-
throw new UnsupportedOperationException();
-
}
不过,实际开发中,我们用到ImmutableMap的场景都是定义系统所需的一些常量,因此,ImmutableMap很有用。
第四种方式:对于Java 9或更高版本
-
// 最多存储10个元素
-
Map<String, String> test1 = Map.of(
-
"a", "b",
-
"c", "d"
-
);
-
-
// 没有限制
-
Map<String, String> test2 = Map.ofEntries(
-
entry("a", "b"),
-
entry("c", "d")
-
);
Java中,常用的List的五种声明并赋值操作_java创建一个list并赋值-CSDN博客
方式1、新手方式
该方式声明的List:元素支持:添加、修改、删除
该方式虽然简单、直观,但并不优雅。
-
List<String> list = new ArrayList<>();
-
-
list.add("张三");
-
-
list.add("李四");
-
-
list.add("王五");
-
-
list.add("赵六");
使用方式:
语法最基本的声明,add() 方法添加。
方式2、使用Stream流方式
该方式声明的List:元素支持:添加、修改、删除
-
List<User> userList = Stream.of(user1, user2, user3).collect(Collectors.toList());
-
-
userList.forEach(System.out::println);//输出
使用方式:
Stream.of 数组转换为流的常用方式之一
(user1, user2, user3) 可变参数、数组,可以是:对象、字符串等
.collect(Collectors.toList()); 流的收集操作
1、将可变参数(或数组)转换为流,
2、使用流的规约操作(终端操作):收集.collect(),
3、收集方式:Collectors.toList(),收集为List(看懂这句,需了解Stream流的实现过程)
解析:
Stream.of()是创建 流 的一种方式,他可以传入多个参数创建一个Stream<T>的对象,没有中间操作,终端操作:收集,收集器转换为List集合
方式3、使用工具类为创建的List对象赋值,
该方式声明的List:元素支持:添加、修改、删除
-
List<String> list = new ArrayList<>();//List规定为String类型,所以可变参数也要是String哦
-
-
Collections.addAll(list,"张三丰","张无忌","周芷若","赵敏","张强");、
-
-
list.forEach(System.out::println);
使用方式:
指定需要添加的集合,然后通过在addAll()中传入一个 “可变参数” ,可变参数也就是类型一样,但个数不限的参数,可变参数有数组的性质,故传入一个 数组 对象也可以(多个数组对象就不满足可变参数的定义了哦~)。
方式4、创建静态集合
(该集合疑似和数组绑定),由于数组长度固定,该集合不可添加和删除元素,添加、删除就会报错,但支持修改。
-
-
public void test() throws Exception{
-
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
-
// int[] arr = new int[]{1,2,3};
-
// IntStream.of(arr).forEach(System.out::print);
-
// System.out.println();
-
// Integer[] arr1 = new Integer[]{1,2,3};
-
// Stream.of(arr1).forEach(System.out::println);
-
// Stream.of(arr).forEach(System.out::println);
-
-
// numbers.add(10);//运行报错java.lang.UnsupportedOperationException
-
// numbers.remove(0);//运行报错java.lang.UnsupportedOperationException
-
numbers.set(0,5);//可以修改
-
numbers.stream().forEach(System.out::println);
-
// numbers.stream().sorted().forEach(System.out::println);
-
// numbers.parallelStream().forEach(System.out::println);
-
}
解析:本质是将一个数组转成List,数组的大小是固定的,所以此List不能 添加 和 删除 元素,但支持 修改 元素。
如果调用add()方法 添加 新的元素,会报异常:java.lang.UnsupportedOperationException
删除 同理。
支持 修改 。虽然不能 添加 或者 删除 但支持 修改 其中的元素。
方式5、创建不可变集合 (要求JDK1.9 --- Java9版本及以上)
该方式声明的List:元素不可以 添加、修改、删除
-
//只支持java9及以上版本
-
-
List list = List.of(1,2,3,4,5);
-
-
-
//支持Set和Map
-
Set set = Set.of(1,2,3,4,5);
-
-
Map map = Map.of(k,v,k,v,k,v,k,v,);

浙公网安备 33010602011771号