🗃️ 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
说明要添加的元素大,向后放
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
此处体现了对修改关闭 对扩展开放
与匿名类同时使用#
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
类型的数据,使用对象特有属性时需要强制类型转换(向下转型)
使用泛型之后集合中只能保存单一类型的数据
优点:由于保存数据的类型一致,所以使用的时候不需要向下转型
缺点:只能保存单一数据类型
而且传入的泛型类型只能为引用类型不能写基本类型
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);
}
}