美文网首页
日拱一卒:Java8 双花括号初始化实例

日拱一卒:Java8 双花括号初始化实例

作者: Tinyspot | 来源:发表于2023-10-08 10:49 被阅读0次

1. 双花括号初始化实例

/**
 * Java8 – 双花括号初始化实例 (匿名类方式)
 *
 * 问题:"{{" 可能会出现内存泄漏
 * 解决方式:需被 static 修饰即可
 * 替代方案:使用 Java8 的 Stream 或 Java9 中的集合工厂of()
 */
public static List<String> list = new ArrayList<String>() {{
    add("Java");
    add("Python");
}};

public static Map<String, String> map  = new HashMap<String, String>(){{
    put("key","value");
    put("key2","value2");
}};
@Test
public void brackets() {
    // 若初始化实例作为非静态变量,可能会有 OOM 风险
    List<String> languages = new ArrayList<String>() {{
        add("Java");
        add("Python");
    }};

    // 替代方案一:Java8 Stream
    List<String> language2 = Stream.of("Java", "Python").collect(Collectors.toList());
    language2.add("Go");
    System.out.println(language2);

    // 替代方案二:Java9 集合工厂
    // Map map = Map.of("key", "Java", "key2", "Redis");
}

2. 其它初始化方式

2.1 Guava - Lists

List<String> languages = Lists.newArrayList("Java", "Python");
languages.add("Go");

Guava 实现逻辑

public final class Lists {
  public static <E extends @Nullable Object> ArrayList<E> newArrayList(E... elements) {
    checkNotNull(elements); // for GWT
    // Avoid integer overflow when a large array is passed in
    int capacity = computeArrayListCapacity(elements.length);
    ArrayList<E> list = new ArrayList<>(capacity);
    Collections.addAll(list, elements);
    return list;
  }
}

2.2 Arrays.asList()

List<String> languages = Arrays.asList("Java", "Python");
// languages.add("Go");

此处add()会抛异常:java.lang.UnsupportedOperationException,原因是 Arrays.asList() 初始化的 List 是不可修改的

java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)

原因如下:

public class Arrays {
    public static <T> List<T> asList(T... a) {
        // 此处 ArrayList 是 Arrays 的内部类
        return new ArrayList<>(a);
    }

    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable {
    }
}

add() 取自父类的 AbstractList

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    public boolean add(E e) {
        add(size(), e);
        return true;
    }
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
}

相关文章

网友评论

      本文标题:日拱一卒:Java8 双花括号初始化实例

      本文链接:https://www.haomeiwen.com/subject/picbbdtx.html