在平时写代码的时候,我们经常因为业务需要,需要创建一个只有单一元素的集合。只包含一个元素,还需要new,太麻烦了。
不光我们天天写new觉得麻烦,大牛们早就想到了这个问题,它给我们提供了一些工具类,专门应对这样的场景。有了这些工具类,我们不仅可以创建只有一个元素的集合,还可以创建空集合,无需重复发明轮子。
这不是懒,这是为了高效编程。善于使用工具类是高效编程的需要。
Arrays 是 java.util 包中的工具类。
Arrays.asList() 方法接受一个变长参数,返回一个固定大小的List,这个List的大小不能改变。
这种方法通常用于在需要一个固定的List时使用,例如在初始化时用于传递给某个方法或者返回一个常量List。
Collections 是 java.util 包中的工具类。
Collections.singletonList() 方法接受一个对象作为参数,并返回一个只包含该对象的List。
这种方法适用于创建只包含一个元素的List,且这个List不需要经常被修改。
3、常规写法
List<String> list = new ArrayList<>();
list.add("Hello, Spring!");
Collections 是 java.util 包中的工具类。
这种方法适用于创建一个固定的Map,只有一个键值对,不需要被修改。
2、匿名内部类,可修改
// 使用初始化语法添加键值对
Map<String, String> map = new HashMap<String, String>() {{
put("key", "value");
}};
这种方式利用了Java中匿名内部类的特性,通过双括号初始化块(Double Brace Initialization)来创建一个包含初始元素的HashMap。
尽管这种方法看起来更冗长,但可以在创建Map时直接添加多个键值对,并且返回的Map可以根据需要修改。
这种方法还是需要new的。
3、常规写法
Map<String, String> map = new HashMap<String, String>();
map.put("key", "value");
三、创建空集合
1、空的List集合,不可修改
// 返回一个空的List<Integer>集合对象
List<Integer> emptyList = Collections.emptyList();
常规写法:
List<String> emptyList = new ArrayList<>();
这个List集合是空的,尚未添加任何元素。我们可以根据需要添加元素,或者直接将其用作空集合传递给其他方法或类。
但是针对不需要添加元素的集合来说,上一种写法更节能。
2、空的Set集合,不可修改
// 返回一个空的Set<String>集合对象
Set<String> emptySet = Collections.emptySet();
常规写法:
Set<String> emptySet = new HashSet<String>();
这是一个空Set集合,可以往里面添加元素。
但是针对不需要添加元素的集合,上一种写法更节能。
3、空的Map集合,不可修改
// 返回一个空的Map<String, Double>集合对象
Map<String, Double> emptyMap = Collections.emptyMap();
常规写法:
Map<String, String> emptyMap = new HashMap<>();
这是一个键和值都为String类型的空Map集合,但是可以往里面添加键值对。
但是针对不需要添加键值对的集合来说,上一种更节能。
最后总结
在日常编程中,了解如何高效地创建和操作集合是非常重要的。
以上介绍的方法,无论是使用Arrays.asList()、Collections.singletonList()、Collections.singletonMap()还是使用匿名内部类等技术,都为我们在特定场景下快速处理集合提供了便利。
例如,当我们需要传递一个不变的集合给不可控的API时,使用不可变集合可以保证集合内容的安全不被修改,减少程序中的错误。
使用Collections的工具方法创建空的集合对象或单一元素的集合时,不仅可以减少代码量,提高代码可读性,而且由于这些方法返回的都是不可变对象,还有助于提升程序的安全性和效率,尤其在多线程环境下。
此外,使用这些方法还可以减少不必要的内存消耗,因为它们通常返回的是单例对象或者非常轻量级的对象。
在选择创建方法时,应当考虑实际需求——是否需要修改集合、集合的大小是否可能改变、是否需要线程安全等因素。理解和掌握这些集合操作的技巧,能够帮助我们编写出更简洁、高效且健壮的Java代码。
最后,虽然Java提供了多种便捷的方式来处理集合,但每种方式都有其适用场景。作为开发者,我们应该根据实际的应用需求选择最合适的方法,以确保代码的性能和可维护性。