集合(Collections,colletion(list,set),map)的区分

2021-05-30 09:53:04 星期日
接口和接口之间是继承,接口和类之间是实现。
List,Set,Map都重写了toStirng()方法,所以打印的是值,而不是地址值。
集合(Collections,colletion(list,set),map)的区分

Collections

Collections 和Arrays(数组的工具类)一样是集合的工具类,用来对集合进行操作。
正因为是工具类,所以里面的方法是静态的,可以直接类名调用。
shuffle(List<?> list); 只能对list集合进行默认ASCII排序),list里面不能是实体类
sort(List<?> lis, Comparator); 自定义排序 ,list里面可以是实体类
addALL(集合名,元素1…元素2); 往集合最后面加0-N个元素

Comparator 比较器

是一个接口,利用实现类实现,重写int compare(T o1, T o2)方法。
return o1-o2(表示升序)
return o2-o1(表示降序)
例子:

package com.example.demo002.service;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

public class test {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        Collections.addAll(list,new Person("01", 10), new Person("02", 66), new Person("03", 22));
        System.out.println(list);
        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                // 前减后为升序,后减前为降序
                return o1.getAge() - o2.getAge(); // 此时是按照时间升序
            }
        });
        System.out.println(list);
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
    private String name;
    private int age;
}

查看原码我们可以知道Comparator接口被注解了@FunctionalInterface,所以时一个函数式接口,因此上面你都代码可以lombda简化成

// 方式一:
Collections.sort(list, (o1, o2) -> o1.getAge() - o2.getAge());
// 方式二:
Collections.sort(list, Comparator.comparingInt(Person::getAge));

Collection

Collection接口时单列集合的根接口,特点是有序,带索引,可重复。

###List集合
java.utils.List接口是继承了Collection接口;
ArrayList和LinkedList是List的实现类;
是有序,带索引,可重复

ArrayList 和 LinkedList 之间的区别

ArrayList
LinkedList

集合 数据结构 特点 性能 线程安全
ArrayList 数组 查询快,增删慢 效率高 线程不安全
LinkedList 双向链表 查询慢,增删快 效率低 线程安全

注意:
①ArrayList是数组结构,数组是定长的,默认为16长度,然后超过这个长度,就会System.copyof数组复制,从而ArrayList是不定长的。
②LinkedList,由于是双向链表结构所有,提供过了很多 首尾 的操作方法。
③在开发中,LinkedList也可以作为堆栈、队列的结构使用

Set集合

java.utils.Set接口是继承了Collection接口;
特点:无序,无索引,不重复(对于实体类,比较的也是值,值都相等那就是重复的,底层是hashmap,重写了equals和hashcode方法)
实现类有Hashset,LinkedHashSet,TreeSet (java.utils)
注意:
LinkedHashSet有序;

集合 数据结构 特点 性能 线程安全
实现类有Hashset HashMap(数组+链表+红黑树 = 哈希表) 查询增删快 效率高 线程不安全
LinkedHashSet 继承HashSet(哈希表+链表,从而有序了) 查询增删快 效率高 线程不安全
TreeSet 红黑树 可以进行Comparator排序 效率高 线程不安全

这儿涉及了好几种数据结构,打击可以看我这篇文章。

Map

java.utils.map是双列集合的根接口(单双列结合知道是存储的格式,双列是存放映射的K-V格式)
注意键k一定是唯一的,值v可以重复
特点: 键唯一值可重复,无序(LinkedHashMap是有序的),没有索引
实现类有HashMap,LinkedHashMap,TreeMap (java.utils)

集合 数据结构 特点
HashMap 数组(16/8扩容)+链表+红黑树 = 哈希表 无序
LinkedHashMap 是HashMap的子类,哈希表+链表 有序
TreeMap 红黑树 可以进行Comparator排序

注意:
重写 equals() 和 hashCode() ,比较的是里面属性的值,不重写比较的就是对象的地址值。

MAP的遍历

查看这篇[1]map遍历

上一篇:Collections集合工具类


下一篇:【虚拟主播】刚刚,我用三行代码创建了一个虚拟主播