Java--集合系列

Java–集合系列

集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生变化。

下面是我绘制的集合的图:

在这里插入图片描述

Collection

概述:

  • Collection是单例集合的顶层接口,他表示一组对象,这些对象也称为Collection的元素
  • JDK不提供此接口的任何直接实现,他提供更具体的子接口(Set和List)实现

创建Collection集合的对象:

  • 多态的方法
  • 具体的实现类ArrayList

下面是具体实现:

 Collection<String> c = new ArrayList<String>();//利用多态的方式

        c.add("hello");
        c.add("world");
        c.add("java");

        System.out.println(c);//最后的输出是一个集合,因为ArrayList有ToString方法

Collection中常用的方法:

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,元素个数

Collection集合遍历

Iterator(是个接口):迭代器,集合专用的遍历方式

  • Iterator iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
  • 迭代器是通过集合的iterator()方法得到的,所以我们说它是依赖集合而存在的

Iterator中常用方法

  • E next():返回迭代中的下一个元素
  • boolean hasNext():如果迭代具有更多元素,则返回true

代码展示:

public class CollectionDemo03 {
    public static void main(String[] args) {
        Collection <String> c = new ArrayList<>();

        c.add("hello");
        c.add("world");
        c.add("java");
        Iterator<String> it = c.iterator();

        while(it.hasNext()){
            String s = it.next();

            System.out.println(s);
        }

    }
}

下面写一个案例,利用Collection集合存储对象并遍历

public class CollectionDemo04 {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setAge(21);
        s1.setName("张三");

        Student s2 = new Student();
        s2.setAge(22);
        s2.setName("李四");
        Student s3 = new Student();
        s3.setAge(23);
        s3.setName("王五");

        Collection<Student> c  = new ArrayList<>();
        c.add(s1);
        c.add(s2);
        c.add(s3);

        Iterator<Student> it = c.iterator();

        while (it.hasNext()){
            Student m = it.next();
            System.out.println(m.getName()+","+m.getAge());// 这个地方不要直接输出m,因为m是引用类型,直接输出会得到地址值
        }

List

list集合概述和特点

list集合概述:

  • 有序集合(也称为序列),用户可以精确控制列表中每个元素插入的位置。用户可以通过整数索引访问元素,并搜集列表中的元素
  • 与Set集合不同,列表通常允许重复的元素

list集合特点:

  • 有序:存储的顺序和取出的元素顺序一致
  • 可重复:存储的元素可以重复
list集合的特有方法

因为list接口是继承于Collection接口,所以list可以利用iterator迭代器遍历,不过list特有的方法,list子类可以用,但是父类不可以用了 ,总结如下:

方法名说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被删除的元素
E get(int index)返回指定索引处的元素

注意:list集合有两种遍历方式,一种是迭代器(继承自Collection接口)。一种是通过for循环(用上特有方法get,和size即可)

ListIterator

ListIterator:列表迭代器

  • 通过list集合的listIterator()方法得到,所以说他是List集合特有的迭代器(继承自Iterator,有几个特有的方法)
  • 用于允许程序员沿任意方向遍历列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置

ListIterator中常用方法:

  • E next():返回迭代器中的下一个元素
  • boolean hasNext():如果迭代具有更多元素,则返回true
  • E previous():返回列表的上一个元素
  • boolean hasPrevious():如果此列表迭代器在反方向遍历具有更多元素,则返回true
  • void add(E e):将指定的元素插入列表,这个方法很重要,是列表迭代器特有的,在使用该方法进行添加时,不会产生并发修改异常
增强for循环

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

  • 实现Iterator接口的允许其对象成为增强型for语句的目标
  • 它是JDK5之后出现的其内部原理是一个Iterator迭代器

增强for的格式

  • 格式:

    for(元素数据类型 变量名:数组或者Collection集合){
    // 在此处使用变量即可,该变量就是元素
    }
    

下面是简单实现:

在这里插入图片描述

List集合子类特点
  • ArrayList:底层结构是数组,查询快,增删慢
  • LinkedList:地层结构是链表,查询慢,增删快
ListedList集合的特有功能
方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

Set集合

Set集合特点

  • 不包含重复的元素的集合

  • 没有带索引的方法,所以不能使用普通的for循环遍历

  • 实现类有HashSet,对元素顺序不做保证

哈希值

概念:是JDK根据对象地址或者字符串或者数字算出来的int类型的数值

Object类中有一个方法可以获取对象的哈希值

  • public int hashCode():返回对象的哈希码值

对象的哈希值特点:

  • 同一对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的,而重写了hashCode()方法,可以实现让不同对象的哈希值相同
HashSet集合

特点:

  • 底层数据结构是哈希表
  • 对集合的迭代顺序不做任何保证。也就是说不保证存储和取出的元素顺序一致
  • 没有带索引的方法,所以不能使用普通的for循环遍历
  • 由于是Set集合,所以是不包含重复元素的集合
LinkedHashSet

特点:

  • 哈希表和链表实现set接口,具有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素存储和取出的顺序是一致的
  • 由哈希表保证元素唯一,也就是说没有重复的元素
TreeSet集合(间接实现Set接口)

特点:

  • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体的排序方式取决于构造方法

    • TreeSet():无参构造,根据其元素的自然排序进行排序(你输入的数不是递增,它会变成递增)
    • TreeSet(Comparator comparator):有参构造,根据指定的比较器进行比较
  • 没有带索引的方法,所以不能使用普通的for循环遍历

  • 由于是Set集合,所以不包含重复的元素集合

自然排序Comparable的使用

需求:

存储学生对象并遍历,创建TreeSet集合使用无参构造方法

要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:上面的写法有个缺陷,当对象的名字不同时,但是他们的年龄相同时,也会添加失败,这个时候就应该还需要比较一下名字是否相同:

在这里插入图片描述

Map集合

Map是接口:

  • interface Map<K,V> K:键的类型; V:值的类型
  • 将键映射到值的对象;不能包含重复的键;每个键可以映射到最多一个值

创建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()集合的长度,也就是集合中键值对的个数

下面是简单实现:

在这里插入图片描述

可以根据我上面的结合进行操作。

Map集合的获取功能:

方法名说明
V get(Object key)根据键获取值
Set keySet()获取所有键的集合
Collection values()获取所有值的集合
Set<Map.Entry<K,V>entrySet()获取所有键值对对象的集合
Map集合的遍历:

思路一:

  • 获取所有键的集合。用keySet()方法实现;
  • 遍历键的集合,获取到每一个键。用增强for实现
  • 根据键去找值。用get(Object key)方法实现

在这里插入图片描述

思路二:

  • 获取所有的键值对对象的集合

    ​ Set<Map.entry<K,V>>entrySet():获取所有键值对对象的集合

  • 遍历键值对对象的集合,得到每一个键值对对象

    ​ 用增强for实现,得到每一个Map.Entry

  • 根据键值对对象获取键和值

​ 用getKey()得到键

​ 用getValue()得到值

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值