Java中的集合 (简单了解)

这篇博客详细介绍了Java中的集合框架,包括Collection接口、List接口、Set接口的子类如ArrayList、LinkedList、HashSet、TreeSet,以及Iterator迭代器、泛型、数据结构和Map集合的使用。此外,还讨论了泛型的好处、数据结构的重要性以及Map集合的遍历方法。
摘要由CSDN通过智能技术生成

一.Collection集合

  • 概述: 集合其实就是一种容器,可以用来存储多个引用类型的数据

  • 分类: 单列集合,双列集合

    • 单列集合: 以单个单个元素进行存储

    • 双列集合: 以键值对的方式进行存储

  • 集合与数组的区别:

    • 长度:

      • 数组长度是固定的

      • 集合长度是不固定的

    • 存储范围:

      • 数组可以存储基本类型+引用类型 eg; int[],String[]

      • 集合只能存储引用类型,如果要存储基本类型,需要存储基本类型对应的包装类类型 eg; ArrayList<String> ,ArrayList<Integer>

1.2单列集合常用类的继承体系

  • 单列集合: 以单个单个元素进行存储

  • 单列集合继承体系:

    • Collection接口是所有单列集合的根接口,也就意味着所有的单列集合都实现了Collection接口

      • List接口继承Collection接口: List集合元素有索引,元素存取有序,元素可重复

        • ArrayList类: 数组存储结构, 查询快,增删慢

        • LinkedList类: 链表存储结构,查询慢,增删快

        • ......

      • Set接口继承Collection接口: Set集合元素没有索引 , 元素不可重复(唯一)

        • HashSet类: 哈希表结构,由哈希表保证元素唯一,元素存取无序,不可以排序

          • LinkedHashSet类:: 链表+哈希表结构,由哈希表保证元素唯一,由链表保证元素存取有序,不可以排序

        • TreeSet类: 二叉树结构,可以对元素进行排序

        • ......

1.3Collection常用功能

  • Collection是接口,只能通过其子类创建对象

  • Collection是所有单列集合的顶层父接口,所以所有单列集合都拥有Collection中的方法

  • 常用方法:

    • public boolean add(E e): 把给定的对象添加到当前集合中 。

    • public void clear() :清空集合中所有的元素。

    • public boolean remove(E e): 把给定的对象在当前集合中删除。

    • public boolean contains(Object obj): 判断当前集合中是否包含给定的对象。

    • public boolean isEmpty(): 判断当前集合是否为空。

    • public int size(): 返回集合中元素的个数。

    • public Object[] toArray(): 把集合中的元素,存储到数组中

二.Iterator迭代器

2.1 Iterator接口

迭代的概念

  • 概述:迭代即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

  • 迭代的步骤:

    • 获取迭代器对象

    • 使用迭代器对象判断集合中是否有元素可以取出

    • 如果有元素可以取出,就直接取出来该元素,如果没有元素可以取出,就结束迭代

获取迭代器对象

Collection集合提供了一个获取迭代器的方法:

  • public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。

Iterator迭代器对象的常用方法

  • public boolean hasNext():如果仍有元素可以迭代,则返回 true。

  • public E next():返回迭代的下一个元素。

  • void remove()删除当前迭代出来的元素

2.2增强for

  • 概述: 增强for循环(foreach循环),是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和Collection集合

  • 原理: 内部基于Iterator迭代器实现,所以在遍历的过程中,不能对集合中的元素进行增删操作,否则抛出ConcurrentModificationException并发修改异常

三 泛型

3.1 泛型的概述

  • 概述: JDK5之后,新增了泛型(Generic)语法,可以在类、接口或方法中预支地使用未知的类型

  • 简而言之: 泛型其实就是表示一种未知的数据类型,在使用的时候确定其具体的数据类型

  • 表示方式: <泛型变量>

  • 泛型的好处:

    • 将运行时期的ClassCastException,转移到了编译时期变成了编译失败

    • 避免了类型转换的麻烦

  • 案例:

    • 集合不使用泛型

      • 可能会发生类型转换异常

      • 避免类型转换异常,就需要先做类型判断,再转型--->比较麻烦

集合使用泛型

  • 概述:指定泛型的具体数据类型----->(只能是引用数据类型)

3.2 定义和使用含有泛型的类

使用含有泛型的类

  • 创建含有泛型的类的对象的时候,指定泛型的具体数据类型(只能是引用数据类型)

3.3 定义和使用含有泛型的方法

使用含有泛型的方法

  • 调用含有泛型方法的时候,确定泛型的具体数据类型

3.4 定义和使用含有泛型的接口

使用含有泛型的接口

  • 方式一: 实现类实现接口的时候,确定接口泛型的具体数据类型

  • 方式二:实现类实现接口的时候,不确定接口泛型的具体数据类型,而是创建实现类对象的时候确定泛型的具体数据类型

3.5 泛型通配符

  • 概述: 泛型通配符用问号表示(?)

  • 为什么需要泛型通配符:

    • 泛型本身不存在继承关系,不可以给已指定泛型的变量接收有其他泛型类型的对象

      • Collection<Object> list = new ArrayList<String>(); //错误格式,泛型不存在继承关系

    • 如果想要使变量在未来接收有泛型定义的对象,又不确定泛型要定义的类型可以使用泛型通配符

      • Collection<?> list 变量接收

  • 通配符基本使用

    • 格式: 数据类型<?> 变量

    • 注意:

      • 如果使用了泛型通配符,那么该集合变量元素类型默认是Object类型

      • 如果使用了泛型通配符,那么该集合变量只能取元素,无法增删元素

四 数据结构

4.1 数据结构介绍

  • 数据结构 :其实就是存储数据和表示数据的方式

  • 常见的数据结构:栈、队列、数组、链表和红黑树

五 List接口

5.1 List接口介绍

  • List接口的概述

    • java.util.List接口继承自Collection接口,是单列集合的一个重要分支

  • List接口的特点

    • 它是一个元素存取有序的集合

    • 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素

    • 集合中可以有重复的元素

5.2 List接口中常用方法

List接口新增常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:

  • public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。

  • public E get(int index):返回集合中指定位置的元素。

  • public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。

  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

5.3 List的子类

  • ArrayList集合: 底层采用的是数组结构,查询快,增删慢

    • 方法: 来自Collection,List

  • LinkedList集合; 底层采用的是链表结构,查询慢,增删快

    • 方法: 来自Collection,List,LinkedList特有的方法

特有的方法:

public void addFirst(E e):将指定元素插入此列表的开头
public void addLast(E e):将指定元素添加到此列表的结尾
public E getFirst():返回此列表的第一个元素
public E getLast():返回此列表的最后一个元素
public E removeFirst():移除并返回此列表的第一个元素
public E removeLast():移除并返回此列表的最后一个元素
public E pop():从此列表所表示的堆栈处弹出一个元素
public void push(E e):将元素推入此列表所表示的堆栈

六 Collections

1.1 Collections常用功能

  • 概述:java.util.Collections是集合工具类,用来对集合进行操作。

  • 常用方法:

    • public static void shuffle(List<?> list) :打乱集合顺序。

`public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。`

`public <T> void sort(List<T> list,Comparator<? super T> comp):将集合中元素按照指定规则排序`

1.2 可变参数

  • 概述: 在JDK1.5之后,定义了可变参数,用来表示一个方法需要接受的多个同类型参数。

  • 格式:    修饰符 返回值类型 方法名(数据类型... 变量名){
        
    }

注意事项:

  • 可变参数一定是定义在方法的形参位置

  • 一个方法只能有一个可变参数

  • 如果方法中有多个参数,可变参数要放到最后。

  • Collections工具类中的批量添加元素的静态方法:

  • static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。

七 Set接口

7.1 Set接口介绍

  • 概述: java.util.Set接口继承自Collection接口,是单列集合的一个重要分支。

  • 特点: 元素没有索引,元素唯一(不重复)

  • 注意事项:

    • Set集合元素没有索引,只能使用迭代器或者增强for循环进行遍历元素

    • Set集合没有特殊的方法,都是使用Collection的方法

    • Set接口就是Set集合,但凡实现了Set接口的类也叫做Set集合

  • 常用实现类:

    • HashSet类: 元素没有索引,元素唯一,元素存取顺序不一致

      • 存储结构采用的是哈希表结构,由哈希表保证元素唯一

    • LinkedHashSet类:元素没有索引,元素唯一,元素存取顺序一致

      • 存储结构采用的是哈希表+链表结构,由哈希表保证元素唯一,由链表保证元素存取顺序一致

    • TreeSet类: 元素没有索引,元素唯一,可以对元素进行排序

      • 存储结构采用的是红黑树结构,由红黑树保证元素唯一,由比较器来对元素进行排序

7.2 HashSet集合

  • 概述:java.util.HashSet是Set接口的一个实现类, 底层的实现其实是一个java.util.HashMap支持

  • 特点: 元素没有索引,元素唯一,元素存取顺序不一致

HashSet保证元素唯一原理

保证元素唯一的原理: 依靠hashCode和equals方法
1.存储元素的时候,会调用该元素的hashCode方法计算该元素的哈希值
2.判断该哈希值对应的位置上是否有元素
3.如果该哈希值对应的位置上没有元素,就直接存储
4.如果该哈希值对应的位置上有元素,说明产生了哈希冲突
5.产生了哈希冲突就会调用该元素的equals方法与该哈希值对应的位置上的所有元素进行一一比较:
5.1 如果比较完之后,没有一个元素与该元素相等,就直接存储
5.2 如果比较完之后,有任意一个元素与该元素相等,就不存储
    
注意:
1.hashCode和equals方法属于Object类的
2.任意类的对象都拥有hashCode和equals方法
3.Object类中的hashCode方法是主要根据地址值计算哈希值
4.Object类中的equals方法是比较地址值

7.3 HashSet存储自定义类型元素

  • 需求: 使用HashSet集合存储学生对象

  • 结论: HashSet存储自定义类型元素,要求该元素所属的类要重写hashCode和equals方法

7.4 LinkedHashSet

  • 概述: java.util.LinkedHashSet 是HashSet的一个子类,底层采用链表+哈希表

  • 特点:

    • 元素没有索引,元素唯一,元素存取顺序一致

    • 存储结构采用的是哈希表+链表结构,由哈希表保证元素唯一,由链表保证元素存取顺序一致

    • 如果集合中存储的是自定义类型的元素,那么就要求该元素所属的类要重写hashCode和equals方法

7.5 TreeSet集合

  • 概述: TreeSet集合是Set接口的一个实现类,底层依赖于TreeMap,是一种基于红黑树的实现

  • 特点:

    • 元素没有索引,元素唯一,可以对元素进行排序

    • 存储结构采用的是红黑树结构,由红黑树保证元素唯一,由比较器来对元素进行排序

  • 排序:

    • 默认规则排序: public TreeSet(); 创建TreeSet集合对象,该集合对象使用默认规则对元素进行排序

      • 默认规则是在元素所属的类中指定的

      • 要求集合元素所属的类必须实现Comparable接口,重写compareTo方法,在compareTo方法中指定排序规则

指定规则排序: public TreeSet(Comparator<? super E> comparator); 创建TreeSet集合对象,该集合对象使用指定规则对元素进行排序

八 Map集合

8.1 Map概述

概述: java.util.Map双列集合的顶层接口,用来存储具备映射关系对象的集合接口定义

特点:

  • Map<K,V>,K用来限制键的类型,V用来限制值的类型

  • Map集合以键值对的形式来存储数据

  • Map集合的键是唯一的,值可以重复,但键如果重复,值就会覆盖

  • Map集合是根据键来找值

实现类:

实现类都有的特点: 键是唯一的,值可以重复,但键如果重复,值就会覆盖
HashMap: 键值对存取顺序不一致
         底层哈希表结构,由哈希表保证键唯一
LinkedHashMap:键值对存取顺序一致
         底层哈希表+链表结构,由哈希表保证键唯一,由链表保证存取顺序一致
TreeMap: 可以对键进行排序,从而实现键值对排序
         底层红黑树结构,由红黑树保证键唯一,由比较器对象对元素进行排序

8.2 Map的常用方法

  • ublic V put(K key, V value): 把指定的键与指定的值添加到Map集合中。

  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

  • public boolean containsKey(Object key):判断该集合中是否有此键

  • public boolean containsValue(Object value):判断该集合中是否有此值

  • public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的 键值对对象 的集合(Set集合)。

8.3 Map的遍历

方式1:键找值方式

  • 获取Map集合的所有键--->keySet()方法

  • 循环遍历所有的键

  • 根据键找值--->get(K k)方法

方式2:键值对对象方式

  • 获取所有的键值对对象---->entrySet()方法

  • 循环遍历所有的键值对对象

  • 使用键值对对象获取键和值--->使用Entry接口的方法

  • Entry<K,V>接口:

    • Entry接口是Map接口的成员内部接口,使用的方式是Map.Entry<K,V>

    • Entry表示键值对对象,也就是说Entry是用来封装键值对的

    • Entry接口里面的常用方法:

      • K getKey(); 获取键值对对象封装的键

      • V getValue(); 获取键值对对象封装的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总长大人好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值