2021-05-30 09:53:04 星期日
接口和接口之间是继承,接口和类之间是实现。
List,Set,Map都重写了toStirng()方法,所以打印的是值,而不是地址值。
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遍历