banner
Onei

Onei

github
nintendo switch
discord server
steam
pixiv
bento
follow

集合

🗃️ Collection#

一些方法#

  • add()
  • addAll()
  • remove()
  • removeAll()
  • clear()
  • isEmpty()
  • contains()

contains 和 remove 都会调用 equals 方法

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

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

class-and-interface-hierarchy

🔍 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#

底层为HashMapK部分

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);
	}
}
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。