集合的进阶

本文详细介绍了Java集合框架,包括集合的存储类型、结构和常见数据结构如ArrayList、HashSet和TreeMap。讲解了List、Set、Map接口及其实现类的特性,如ArrayList和LinkedList的查询、增删性能差异,以及TreeSet的排序规则。还涉及到泛型的使用,包括泛型类、泛型方法和泛型接口,以及类型通配符的概念。
摘要由CSDN通过智能技术生成

集合存储的类型:

集合可以存储引用数据类型,不可以存储基本数据类型。若要存储基本数据类型,实际是存储基本数据类型的包装类;

结构:

集合类体系结构

  1. 单列 collection(接口):

    1. 可重复 List(接口):

      1. ArrayList(实现类)

      2. LinkdeList(实现类)

    2. 不可重复 Set(接口):

      1. HashSet(实现类)

      2. TreeSet(实现类)

  2. 双列 Map(接口):

    1. HashMap(实现类)

    2. TreeMap(实现类)

collection(接口)中的方法

——>创建对象:接口对象指向实现类的实例

成员方法:

  1. boolean add(E e) 添加元素

  2. boolean remove(object o) 从集合中移除指定的元素

  3. boolean removeif(object o) 根据条件进行删除

  4. void clear() 清空集合

  5. boolean contains(object o) 判断集合中是否存在指定的元素

  6. boolean isEmpty() 判断集合是否为空

  7. int size() 集合的长度,也就是集合中元素的个数

迭代器:i terator(集合的专用遍历方式)

  1. 获取迭代器对象:

    iterator<E> iterator():放回集合中的迭代器对象,该迭代器默认指向当前集合的0索引;

  2. 方法:

    1. Boolean hasNext(): 判断当前位置是否有元素可以被取出

    2. E next():取出 当前位置的元素,将迭代器对象向下一个索引位置;

    3. default void remove():从底层集合中删除此迭代器返回的最后一个元素;

增强for循环:

增强for:简化数组和collection集合的遍历:

  • 原理是一个Iterator迭代器

  • 只有实现iterable接口的类才可以使用迭代器和增强for(所有的单列集合都可以使用增强for)

增强for的格式

  • 格式:

    for(元素数据类型 变量名:数组或者Collection集合){

    //在此处使用变量即可,该变量就是元素

    }

注意:增强for的使用原理是Iterator;所以在for循环中修改变量的值不会影响到数组或集合,只会影响到第三方变量(iterator中获取到的数据);

  • 数据类型一定是集合或者数组中元素的 类型

List集合:

List集合概述:

  • 有序集合,这里的有序是指存储顺序

  • 用户可以精确控制序列中的没个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素

  • 与set集合不同,列表通常允许重复元素

List集合特点

  • 有序:存储和取出的元素顺序一致

  • 有索引:可以通过索引操作元素

  • 可重复:储存的元素可以重复;

List集合中的方法:

  • void add(int index,E element) 在此集合中的指定位置插入指定的元素

  • E remove(int index) 删除指定索引处的元素,返回被删除的元素

  • E set(int index, E element) 修改指定索引处的元素,返回被修改的元素

  • E get(int index) 返回指定索引处的元素

ArrayList集合

ArrayList:底层数据结构是数组,查询块,增删慢;

LinkedList集合

底层数据结构是双向链表链表,增删块,查询慢;

LinkedList集合的特有功能:

方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到该列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

1.Set集合的概述和特点:

Set集合的特点:

  • 可以去除重复

  • 存取顺序不一致

  • 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里的元素

TreeSet集合概述和特点

  • 不包含重复元素的集合

  • 没有带索引的方法

  • 可以将元素按照规则进行排序

注意:想要使用TreeSet,需要制定排序规则

comparable<T> :参数类型:可以将此对象与之进行比较的对象的类型

方法:public int compareTo(T o):将此对象与指定的对象进行比较以进行排序

原理

  • 如果返回值为负数,表示当前存入的元素是比较小值,存左边

  • 如果返回值为0,表示当前存入的元素跟集合中的元素重复了,不存

  • 如果返回值为正数,表示当前存入的元素是比较大值,存右边;

字符串中的比较:

public int compareTo(String anotherString) 按照字典比较两个字符串

//首先比较第一个字母,如果第一个字母是一样的,那么继续比较后面的字母

//当不一样的时候,就拿着对应的码表值进行比较;

比较器排序Compatator的使用

  • TreeSet的带参构造方法使用的是比较器排序对元素进行排序

  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1.T o2方法{o1: 现在要存入的那个元素;o2: 现在已经存入集合中那个}

  • 重写方法时,一定要注意排序规则必须按照要要求的主要条件和次要条件来写

两种比较方式小结:

  • 自然排序:自定义类是实现Comparable接口,重写compareTo方法,根据放回值进行排序

  • 比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compara方法,根据放回值进行排序

TreeSet的原理:红黑树

  • 二叉树

  • 二叉查找树(二叉排序树或二叉搜索树):

    • 每个节点上最多有两个子节点

    • 每个节点的左节点都时小于自己的

    • 每个节点的右节点都是大于自己的

  • 平衡二叉树:左右子节点树高之差不会超过1{通过左旋或右旋保证平衡}

    • 左旋:

    • 右旋:

  • 红黑树:平衡二叉b树:通过红黑规则平衡:

HashSet集合特点:

  • 底层数据结构时哈希表

  • 存取顺序不完全一致

  • 没有带索引的方法

  • 由于是Set集合,所以元素唯一

在object类中可以获取对象的哈希值

  • public int hashCode() : 根据对象的地址值计算出来的哈希值

对象的哈希值特点

  • 如果没有重写hashCode方法,那么是根据对象的地址值计算出哈希值

  • 如果重写了hashCode方法,一般都是通过对象的属性值计算出哈希值

注意:如果hashSet要存储自定义对象,必须要重写hashCode()方法和equeals()方法

2.Map集合概述

  • Interface Map<K,V> k:键的数据类型;V:值的数据类型

  • 键不能重复,值可以重复

  • 键和值是一一对应的,每一个键只能找到自己对应的值

  • (键+值)这个整体 我们称之为"键值对"或者"键值对对象",在java 中叫做”entry对象“

创建Map集合的对象

  • 多态的方法

  • 具体的实现类HashMap

Map集合常用的方法:

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长队,也就是集合中键值对的个数

注意点:

  • put方法:如果要添加的键不存在,那么会把键值对都会添加到集合中

  • 如果要添加的键是存在的,那么会覆盖原先的值,把原先的值当做返回值进行返回;

Map集合的获取功能一

方法名说明
Set <k> Keyset()获取所有键的集合
V get(Object key)根据键获取值

Map集合的获取功能二

方法名说明
Set<Map.Entry<K,V>>entrySet()获取所有键值对对象的集合
K getKey()获取键
V getValue()获取值

Map集合的获取功能二:

foreach(lamda排序)

HashMap小结

  • HashMap底层是哈希表结构的

  • 依赖hashCode方法和equals方法保证键的唯一

  • 如果键要储存的是自定义对象,需要重写hashCode和equals方法

TreeMap小结:

  • TreeMap底层是红黑树结构

  • 依赖自然排序或者比较器排序,对键进行排序

  • 如果键存储的是自定义对象,需要实现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集合对象
  • 在List、Set、Map接口中,都存在of方法,可以创建一个不可变的集合

  • 这个集合不

  • 但是可以结合集合的带参构造,实现集合的批量 添加

常见的数据结构

  • 栈:先进后出

  • 队列:先进先出

  • 数组:添加块,增删慢的模型

  • 链表:增删快,查询慢{}

栈:

泛型:

好处:

  • 把运行时期的问题提前到了编译期间

  • 避免了强制类型转换

泛型可以使用的地方:

  • 类后面——>泛型类

  • 方法声明上——>泛型方法

  • 接口后面——>泛型接口

泛型的定义格式:

  • <泛型>:指定一种类型的格式。

  • <类型1,类型2……>:定义多种类型的格式,多种类型之间用逗号隔开。

java中的泛型类:

定义:public class Person<T>{};

泛型的本质就是将现在代码中所有的特定类型转换成类型占位符;

Java中的泛型方法:

toArray(T[] a):以正确的顺序返回一个包含此列表中所有元素的数组;

自定义方法:

定义格式:

格式:修饰符<类型>返回值类型方法名(类型 变量名){}

范例:public <T> void show(T t){}

注意:与泛型类不同,泛型类是在创建对象的时候有具体的类型的,而泛型方法是在调用的时候才有具体的类型的;

泛型接口:

泛型接口的使用方式:

  • 实现类也不给泛型(也定义为接口)

  • 实现类确定具体的数据类型

类型通配符

  • 类型通配符:<?>

  • ArrayList<?>:表示元素的类型未知的ArraylList,它的元素可以匹配任何的类型

  • 但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型

  • 类型通配符上限:<?extends类型>

  • 比如:ArrayList<?extends Number>:它表示的类型是Number或其子类型

  • 类型同配符下限:<?super 类型》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值