目录
【集合体系】
注意:单列集合一次只能存一个数据,双链集合一次可以存两个数据
【Collection集合】
【概述】
- 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
- JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
【Collection集合构造方法】
- 多态的方式
- 具体的实现类ArrayList、LinkedList、HashSet、TreeSet
例:Collection<E> list=new ArrayList();
【成员方法】
boolean add(E e):添加元素
boolean remove(Object o):从集合中移除指定的元素
boolean removeif(Object o):根据条件进行删除
void clear():清空集合
boolean contains(Object o):判断集合中是否存在指定的元素
boolean isEmpty():判断集合是否为空
int size():集合的长度,也就是集合中元素的个数
reverse():方法用于反转给定list(l)元素的顺序(静态方法)
【Iterator】迭代器,集合的专用遍历方式
【构造方法】:Iterator<E> iterator():返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引
例:Iterator<E> it = list.iterator();
【成员方法】
boolean hasNext():判断当前位置是否有元素可以被取出
E next():获取当前位置的元素并将迭代器对象移向下一个索引位置
【增强for循环】:简化数组和Collection集合的遍历
【使用场景】:实现Iterable接口的类才能使用
【格式】:
for(元素数据类型 变量名 : 数组或者Collection集合) {
//在此处使用变量即可,该变量就是元素
}
例:
ArrayList<String> list = new ArrayList<>();
//添加一些元素
for(String s : list) {
System.out.println(s);
}
【注意】:三种循环的使用场景
- 如果需要操作索引,使用普通for循环
- 如果在遍历的过程中需要删除元素,请使用迭代器
- 如果仅仅想遍历,那么使用增强for
【List集合】
【概述】:
- 有序集合,这里的有序指的是存取顺序
- 用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常允许重复的元素
【List集合构造方法】
- 多态的方式
- 具体的实现类ArrayList、LinkedList
例:List<E> list=new ArrayList();
【特点】:
- 有序:存储和取出的元素顺序一致
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
【特有成员方法】:
void add(int index,E element):在此集合中的指定位置插入指定的元素
E remove(int index):删除指定索引处的元素,返回被删除的元素
E set(int index,E element):修改指定索引处的元素,返回被修改的元素
E get(int index):返回指定索引处的元素
【ArrayList集合】
【LinkList集合】
【构造方法】:(空参构造)
LinkedList():创建一个空的集合对象
例:LinkedList<E> list =new LinkedList();
【成员方法】:
public void addFirst(E e):在该列表开头插入指定的元素
public void addLast(E e):将指定的元素追加到此列表的末尾
public E getFirst():返回此列表中的第一个元素
public E getLast():返回此列表中的最后一个元素
public E removeFirst():从此列表中删除并返回第一个元素
public E removeLast():从此列表删除并返回最后一个元素
【Set集合】
【Set集合构造方法】:
- 多态的方式
- 具体的实现类HashSet、TreeSet
例:Set<E> set=new TreeSet();
【特点】:
- 可以去除重复
- 存取顺序不一致
- 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素
【TreeSet集合】
【构造方法】:(空参构造)
TreeSet():创建一个空的集合对象
例:TreeSet<E> ts=new TreeSet();
【特点】:
- 不包含重复元素的集合
- 没有带索引的方法
- 可以将元素按照规则进行排序
排序规则的方法
【Comparable】:自然排序
- 使用空参构造创建TreeSet集合
- 自定义的Student类实现Comparable接口
- 重写里面的compareTo方法
【comparator】:比较器排序
- TreeSet的带参构造方法使用的是比较器排序对元素进行排序的
- 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
- 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
两种方式对于返回值的规则:
- 如果返回值为负数,表示当前存入的元素是较小值,存左边
- 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
- 如果返回值为正数,表示当前存入的元素是较大值,存右边
注意:在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序
【TreeSet模型—红黑树】:平衡二叉B树,是一种特殊的二叉查找树
【添加规则】:红黑规则
- 每一个节点或是红色的,或者是黑色的。
- 根节点必须是黑色
- 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的;
- 不能出现两个红色节点相连的情况
- 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;
【添加节点步骤】:
【HashSet集合】
【构造方法】:(空参构造)
HashSet():创建一个空的集合对象
例:HashSet<E> hs=new HashSet();
【特点】:
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以元素唯一
【哈希值】:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
【成员方法】:Object类中有一个方法可以获取对象的哈希值
public int hashCode():返回对象的哈希码值
【特点】:
- 如果没有重写hashCode方法,那么是根据对象的地址值计算出哈希值。同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 如果重写了hashCode方法,一般都是通过对象的属性值计算出哈希值。如果不同的对象属性值是一样的,那么计算出来的哈希值也是一样的
【Map集合】
【概述】:
- Interface Map<K,V> K:键的数据类型;V:值的数据类型
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键只能找到自己对应的值
- (键 + 值)这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”。
【Map集合构造方法】
- 多态的方式
- 具体的实现类HashMap、TreeMap
例:Map<E> map=new HashMap();
【成员方法】:
V put(K key,V value):添加元素(注意:如果添加的键是存在的,那么会覆盖原先的值,把原先的值当作返回值进行返回)
V remove(Object key):根据键删除键值对元素
void clear():移除所有的键值对元素
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
int size():集合的长度,也就是集合中键值对的个数
集合获取:
方法一:
V get(Object key):根据键获取值
Set<K> keySet():获取所有键的集合
方法二:
Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
K getKey():获得键
V getValue():获得值
【HashMap集合】
【构造方法】:(空参构造)
HashMap():创建一个空的集合对象
例:HashMap<E> hm=new HashMap();
【特点】:
- HashMap底层是哈希表结构的
- 没有带索引的方法,所以不能使用普通for循环遍历
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键要存储的是自定义对象,需要重写hashCode和equals方法
【TreeMap集合】
【构造方法】:(空参构造)
TreeMap():创建一个空的集合对象
例:TreeMap<E> tm=new TreeMap();
【特点】:
- TreeMap底层是红黑树结构的
- 没有带索引的方法,所以不能使用普通for循环遍历
- 依赖自然排序或者比较器排序,对键进行排序
- 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则
【不可变的集合】
【可变参数】
【概述】:就是形参的个数是可以变化的
【格式】:修饰符 返回值类型 方法名(数据类型… 变量名) { }
例:public static int sum(int… a) { }
注意:
- 这里的变量其实是一个数组
- 如果一个方法有多个参数,包含可变参数,可变参数要放在最后
【创建不可变集合】
【构造方法】:
static <E> List<E> of(E…elements):创建一个具有指定元素的List集合对象
static <E> Set<E> of(E…elements):创建一个具有指定元素的Set集合对象(注:元素不能有重复)
static <K , V> Map<K,V> of(E…elements):创建一个具有指定元素的Map集合对象
static <K , V> Map<K,V> ofEntries(entry(E…elements)):创建一个利用entry方法将键值对封装成Entry对象再将其添加至Map集合的Map集合对象
例:List<String> list = List.of("a", "b", "c", "d");
Set<String> set = Set.of("a","b","c");
Map<String, String> map = Map.of("zhangsan", "江苏", "lisi", "北京", “wangwu”, "天津");
【特点】:
- 这个集合不能添加,不能删除,不能修改。
- 但是可以结合集合的带参构造,实现集合的批量添加。