ArrayList

使用List时,最好初始化容量。

ArrayList的默认容量为10,每次扩容增0.5倍,假如要放置100个元素,需要多次扩容。

   List<String> list=new ArrayList<>(100);

String数组转List,使用Arrays.asList。

  String[] stryArray=new String[]{"str1","str2","str3"};  
  List<String> list=Arrays.asList(strArray);

String(以逗号隔开)转List

public static List<String> stringToList(String strs){
    if (strs==null) {
        return null;
    }
    String[] str = strs.split(",");
    return Arrays.asList(str);
}

String(以逗号隔开)转List,更简单的做法是使用Stream流:

  List<String> idList = Arrays.stream(ids.split(",")).map(String::trim).collect(Collectors.toList());

注意,通过Arrays.asList转换的List,不可以使用add()方法。如果使用的话,会报错:java.lang.UnsupportedOperationException
可以使用以下方式在新的List中添加数据:

    String[] stryArray=new String[]{"str1","str2","str3"};  
    List<String> list=Arrays.asList(strArray);
    
    List<String> strList=new ArrayList<>(list);
    strList.add("test");

list分页 subList()

使用 subList()分页时,要注意返回的集合是没有实现 Serializable 接口的, 不可以进行序列化。
正确的做法是:

new ArrayList<>( list.subList());

如下:

List<String> list = new ArrayList<>();
list.add("5");
list.add("4");
List<String> resultList = new ArrayList<>( list.subList(0, 1));

List转成String数组

使用toArray()方法。

    List<String> list = new ArrayList<String>(2);
	list.add("test1");
	list.add("test2");
	String[] array = new String[list.size()];
	array = list.toArray(array);

List转String

用逗号隔开的,可以使用String.join(",",list)。也可以使用其他的分隔符。
如下:

    List<String> list=new ArrayList<>();
    list.add("shen");
    list.add("zhen");
    list.add("shi");
    String words= String.join(",",list);
    System.out.println(words);

List转int[]数组

使用java8的stream()。

        int[] arr = list.stream().mapToInt(Integer::valueOf).toArray();

int[]数组转List

int[] arr = {4, 5, 3, 6, 2, 5, 1};
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());

list判断集合个数是否为空。

    if (list!=null && list.size==0 ){
        //...
    }

更推荐的做法是:
使用apache的工具类CollectionUtils.isEmpty()。

    if (CollectionUtils.isNotEmpty(list)) {

    }

删除list中的元素:

想要遍历集合,删除元素,最好使用Iterator()。如果使用foreach(),可能会报错"ConcurrentModificationException"。

public void removeElement() {
	//如果采用Arrays.asList(),是不能对集合进行增删操作的。
	List<String> list = new ArrayList<>();
	list.add("1");
	list.add("2");
	Iterator<String> iterator = list.iterator();
	while (iterator.hasNext()) {
		String item = iterator.next();
		if (item==null) {
			iterator.remove();
		}
	}
}

更方便的写法,如下:

public void removeElement() {
	List<String> list = new ArrayList<>();
	list.add("1");
	list.add("2");
	//removeIf(),内部使用的就是Iterator()。
	list.removeIf(Objects::isNull);
}

交换集合中元素的位置

可以使用Collections.swap()方法实例:

Collections.swap(List<?>, int, int) 方法被用于交换在指定列表中的指定位置的元素。

List转Map:

比如User对象有两个属性name和age, 以下的User::getName表示 getName()方法,User::getAge表示getAge()方法。
User对象的List,转化成 key为属性name,value为属性age的 Map。

    Map<String, Integer> map = new HashMap<>();
    if (CollectionUtils.isNotEmpty( list)) {
        map = list.stream().collect(Collectors.toMap(User::getName, User::getAge, (key1, key2) -> key2));
    }

其中的User::getName表示User对象的getName()方法得到的值。
.toMap(User::getName, User::getAge, (key1, key2) -> key2)表示这个 map的key为 user.getName(),而value为 user.getAge() .

LinkedList

  • 在增删比较多的场景下,使用LinkedList。

返回空的List,不要返回null。

返回null,容易导致空指针异常。
可以使用Collections.emptyList(),表示的是空集合。
示例如下:

	public List<BillFiles> queryBillFiles(BillFiles billFiles) {
                //以下是一个简单的数据库查询
		List<BillFiles> billFilesList=billFilesMapper.queryBillFiles(billFiles);
		if(billFilesList==null) {
			billFilesList= Collections.emptyList();
		}
		return billFilesList;
	}

二、Set

HashSet

集合去重:可以使用Set不重复的特性进行去重。

将集合作为HashSet()构造方法的参数。

HashSet(Collection<? extends E> c)

Set的size和原来集合的size相同,说明没有重复数据。也可以用contains()判断。
示例如下:

        List<String> list=new ArrayList<>();
        list.add("123");
        list.add("456");
        Set<String> set = new HashSet<>(list);
        for (String s : set) {
            System.out.println(s);
        }

也可以放入map的values集合:

Map<Integer, Integer> map = new HashMap<>();
Set<Integer> set = new HashSet<>(map.values());

if( map.size() == set.size()){

}
//if(set.contains()){}

三、Map

HashMap

遍历HashMap

如下:

        Map<Integer,String> map=new HashMap<Integer,String>();
        map.put(1,"banana");
        map.put(2,"apple");
        //遍历entrySet()返回的Set,其中每一个元素都是Map.Entry类型的,再通过getKey()、getValue()获取键值对
        //以下的Map为接口名,map为Map接口声明的变量。
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            System.out.println("键:"+entry.getKey() + ",值: " + entry.getValue());
        }

map.keySet():获取所有的key

map.values() :获取所有的value

map.getOrDefault:如果map的key不存在,返回默认值。

使用map.getOrDefault(Object key, V defaultValue)。
比如,用key存储字符串,用value统计次数。如下:

Map<String, Integer> map = new HashMap<>();
String word="s";
int count=map.getOrDefault(word, 0);
map.put(word,  count+ 1);

使用compute(),对map中的k和v进行计算。

compute(K key,
            BiFunction<? super K, ? super V, ? extends V> remappingFunction)

第一个参数是key,第二个参数是匿名函数式,(k,v)-> 后面就是对key和value的具体处理逻辑。
示例如下:

Map<String, Integer> map = new HashMap<>();
String word="s";
Integer count=map.compute(word,(k,v)->{
	if (v==null){
		return 0;
	}
	return v+1;
});

相关文章: