java map初始化

admin 15 0

### Java Map初始化的多种方式

在Java中,Map是一种将键(Key)映射到值(Value)的对象,一个键可以最多映射到最多一个值,Map接口的实现类,如HashMap、TreeMap、LinkedHashMap等,提供了丰富的功能来存储和操作键值对,初始化Map是编程中常见的操作,Java提供了多种方式来初始化Map,包括使用构造器、静态工厂方法、Java 9引入的of和copyOf方法,以及使用Java 8的Stream API等,下面将详细介绍这些方式。

#### 1. 使用构造器初始化

最直接的方式是使用Map实现类的构造器来初始化Map,这种方式适用于在代码中逐步添加键值对的情况。

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 100);
        map.put("Banana", 200);
        map.put("Cherry", 150);

        System.out.println(map);
    }
}

#### 2. 使用静态工厂方法初始化(Java 9之前)

虽然Java标准库没有直接提供静态工厂方法来初始化Map(如`HashMap.of`是在Java 9中引入的),但可以通过Collections工具类中的`unmodifiableMap`等方法来间接实现,尽管这主要用于创建不可修改的Map。

对于简单的初始化,我们仍然倾向于使用构造器方法。

#### 3. 使用Java 9引入的of和copyOf方法

从Java 9开始,`Map`接口引入了`of`和`copyOf`两个静态方法,使得Map的初始化变得更加简洁。

- **of方法**:用于创建包含固定数量键值对的不可变Map,如果尝试修改这样的Map,将会抛出`UnsupportedOperationException`。

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = Map.of("Apple", 100, "Banana", 200, "Cherry", 150);
        System.out.println(map);

        // 注意:Map.of方法不接受null键或值
        // Map<String, Integer> mapWithNull = Map.of("NullKey", null); // 这将抛出NullPointerException
    }
}

- **copyOf方法**:用于创建给定Map的浅拷贝,如果原始Map是可变的,则拷贝也是可变的;如果原始Map是不可变的,则拷贝也是不可变的。

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> originalMap = new HashMap<>();
        originalMap.put("Apple", 100);
        originalMap.put("Banana", 200);

        Map<String, Integer> copiedMap = Map.copyOf(originalMap);
        System.out.println(copiedMap);

        // 修改原始Map不会影响拷贝,但拷贝是可变的
        originalMap.put("Cherry", 150);
        System.out.println("Original: " + originalMap);
        System.out.println("Copied: " + copiedMap);
    }
}

#### 4. 使用Java 8的Stream API初始化

虽然Stream API主要用于处理集合(Collection)的复杂查询/过滤操作,但也可以用来初始化Map,这通常不是最直接或最高效的方法,但在某些情况下(如从其他集合或数据源动态生成Map时)可能很有用。

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = Stream.of(
                new AbstractMap.SimpleEntry<>("Apple", 100),
                new AbstractMap.SimpleEntry<>("Banana", 200),
                new AbstractMap.SimpleEntry<>("Cherry", 150)
        ).collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue
        ));

        System.out.println(map);
    }
}

这里使用了`AbstractMap.SimpleEntry`来创建键值对,并通过Stream的`collect`方法和`Collectors.toMap`收集