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();
}
}
网友评论