集合

🗃️ Collection

一些方法

add()

addAll()

remove()

removeAll()

clear()

isEmpty()

contains()

contains 和 remove 都会调用 equals 方法

如果集合中存放基本数据类型 一定要将其装箱为基本类型包装类

没有提供修改和查询的方法

🔍 iterator

迭代器

主要做遍历操作 使用迭代器可以屏蔽数据结构之间的差异性异性

hasNext()

next()

remove()

迭代器一旦生成 集合将不能被修改 否则需要重新生成迭代器

增强 for 循环

迭代器的简写方式 同样不能删除

🐾 List

有序 可重复

ArrayList

底层为 Object 数组 查询修改效率高

add(index,items)

set(index,items)

size()

LinkedList

底层为双向链表 随机添加和删除效率高

add(index,items)

set(index,items)

size()

🍊 Set

无序（不保证数据的添加和取出顺序一致）
不可重复（重复后不会再添加）

TreeSet

底层为TreeMap

TreeMap底层为红黑树 添加的元素会按照一定格式自动排序

向TreeMap中添加的数据都有比较器

因此我们如果要添加没有比较器的对象或者自定义的对象时会出错。另外因为排序需要比较，所以只能添加同类型数据

数字 大小升序

字符串 每一位 ASCII 码

Date 自然日期

HashSet

底层为HashMap的K部分

HashMap底层为散列表

🤼‍♀️ Comparable

比较器 被添加的TreeSet元素需要实现 Comparable 接口并重写接口中的compareTo()方法
compareTo()方法返回值代表排序规则
添加元素时会调用元素对象的compareTo()方法把集合中的元素传入进行比较
如果==0 说明重复，不添加
如果<0 说明要添加的元素小，向前放
如果>0 说明要添加的元素大，向后放

Copy
import java.util.TreeSet;

public class Tree {
public static void main(String[] args) {
TreeSet<Object> tree = new TreeSet<>();
tree.add(new User("张三",18));
tree.add(new User("李四",13));
tree.add(new User("王五",32));
tree.add(new User("赵六",11));
System.out.println(tree);
}
}

class User implements Comparable {
private String name;
private int age;

public User() {
}

public User(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}

@Override
public int compareTo(Object o) {
if (o instanceof User) {
User u = (User) o;
// this.getAge() - u.getAge() 大于 1 升序排序
return this.getAge() - u.getAge();
}
return 0;
}
}

🍭 Comparator

比较器类 要添加的元素不需要实现这个接口

Integer 类中有默认升序的比较方法，假如想要降序的时候可以通过实现Comparator接口来重新定义排序规则；或者把不能排序的Object对象 （没有实现Comparable接口） 保存在TreeSet中时，还是需要 Comparator 来进行比较
当保存的元素不能排序（没有实现Comparable接口）或者排序规则不符合我们的需求时均可实现Comparator接口并重写compare()方法进行排序

当 Comparator 比较器和 Comparable 比较器同时存在时，Comparator优先级高于Comparable

此处体现了对修改关闭 对扩展开放

与匿名类同时使用

Copy
import java.util.Comparator;
import java.util.TreeSet;

@SuppressWarnings("all")
public class UnNamed {
public static void main(String[] args) {
// TreeSet<Object> tree = new TreeSet<>(new MyComparator());
// 匿名类 常用在比较器中
TreeSet<Object> tree = new TreeSet<>(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer && o2 instanceof Integer) {
// o1 是要添加的元素
// System.out.println(o1);
// o2 是集合中的元素
// System.out.println(o2);

Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
// 10-9 降序排列
return i2 - i1;
}
return 0;
}
});
tree.add(11);
tree.add(7611);
tree.add(1);
tree.add(100);
tree.add(660);
tree.add(98);
System.out.println(tree);
}
}

class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer && o2 instanceof Integer) {
// o1 是要添加的元素
// System.out.println(o1);
// o2 是集合中的元素
// System.out.println(o2);

Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
// 10-9 降序排列
return i2 - i1;
}
return 0;
}
}

〽️ List 排序

Collections.sort(list) 排序方法
void sort(Comparator<? super E> c)也可传入Comparator对象使用List的排序方法

🔗 散列表 / 哈希表

用于存储键值对映射关系 存储方式为数组中保存链表 用于解决哈希冲突问题
链表节点中保存四个属性：

hash 值

key

value

next 指针

✔️ 泛型

类型检查

不使用泛型时集合中可以存储任意类型的数据，且数据均会转型为 Object 类型
缺点：获取时会得到为 Object 类型的数据，使用对象特有属性时需要强制类型转换（向下转型）

使用泛型之后集合中只能保存单一类型的数据
优点：由于保存数据的类型一致，所以使用的时候不需要向下转型
缺点：只能保存单一数据类型
而且传入的泛型类型只能为引用类型不能写基本类型

Copy
public class Generic {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.method(1);
myClass.method("xx");
MyClass<String> mm = new MyClass<String>();
mm.m1("xxx");
// mm.m1(123);
}
}

// 如果设置泛型后不传入数据类型默认为 Object 类型
class MyClass<T> {
public void method(T obj) {
System.out.println(obj);
}
}