第七章 集合

集合概述

① 什么是集合,有什么用?
1.集合是一种容器,用来组织和管理数据的。非常重要。
2.Java的集合框架对应的这套类库其实就是对各种数据结构的实现。
3.每一个集合类底层采用的数据结构不同,例如ArrayList集合底层采用了数组,LinkedList集合底层采用了双向链表,HashMap集合底层采用了哈希表,TreeMap集合底层采用了红黑树。
4.我们不用写数据结构的实现了。直接用就行了。但我们需要知道的是在哪种场合下选择哪一个集合效率是最高的。
② 集合中存储的是引用,不是把堆中的对象存储到集合中,是把对象的地址存储到集合中。
③ 默认情况下,如果不使用泛型的话,集合中可以存储任何类型的引用,只要是0bject的子类都可以存储。
Java集合框架相关的类都在 java.util 包下。
Java集合框架分为两部分:
1.Collection结构:元素以单个形式存储。
2.Map结构:元素以键值对的映射关系存储

Collection 继承结构

继承结构图

Collection继承结构
1.SequencedCollection和SequencedSet接口都是Java21新增的接口。
2.结构图中蓝色是实现类,其他都是接口。
3.6个实现类中只有HashSet是无序集合。剩下的都是有序集合,

  • 有序集合:集合中存储的元素有下标或者集合中存储的元素是可排序的。
  • 无序集合:集合中存储的元素没有下标并且集合中存储的元素也没有排序。

4.每个集合实现类对应的数据结构如下:

1.LinkedList:双向链表(不是队列数据结构,但使用它可以模拟队列)
2.ArrayList:数组
3.Vector:数组(线程安全的)
4.HashSet:哈希表
5.LinkedHashSet:双向链表和哈希表结合体
6.TreeSet:红黑树

5.List集合中存储的元素可重复。Set集合中存储的元素不可重复。

测试java.util.Collection接囗中公共的常用的方法:
boolean add(E e); 向集台中添加元系
int size(); 获取集合中元素个数
boolean addAll(Collection c): 将参数集合中所有元素全部加入当前集合
boolean contains(0bject o); 判断集合中是否包含对象o(底层到底包含0还是不包含0,调用equals方法进行比对。)
boolean remove(0bject o)  从集合中删除对象0(底层也会调用equals方法来完成删除。)
void clear(); 清空集合
boolean isEmpty(); 判断集合中元素个数是否为0
0bject[] toArray(); 将集合转换成一维数组

Collection 接口

Collection的遍历(集合的通用遍历方式)

第一步:获取当前集合依赖的迭代器对象
Iterator it= collection.iterator();
第二步:编写循环,循环条件是:当前光标指向的位置是否存在元素
while(it. hasNextO){}
第三步:如果有,将光标指向的当前元素返回,并且将光标向下移动一位
Object obj= it.next();

SequencedCollection 接口

所有的有序集合都实现了Sequencedcollection接口

  • SequencedCollection接囗是Java21版本新增的。
  • SequencedCollection接口中的方法:

void addFirst(0bject o):向头部添加
void addLast(0bject o):向末尾添加
0bject removeFirst):删除头部
0bject removeLast():删除末尾
0bject getFirst():获取头部节点
0bject getLast():获取末尾节点
SequencedCollection reversed():反转集合中的元素

  • ArrayList,LinkedList,Vector,LinkedHashSet,TreeSet都可以调用这个接口中的方法

泛型

  • 泛型是Java5的新特性,属于编译阶段的功能。
  • 泛型可以让开发者在编写代码时指定集合中存储的数据类型
  • 泛型作用:

类型安全:指定了集合中元素的类型之后,编译器会在编译时进行类型检查,如果尝试将错误类型的元素添加到集合中,就会在编译时报错,避免了在运行时出现类型错误的问题。
代码简洁:使用泛型可以简化代码,避免了繁琐的类型转换操作。比如,在没有泛型的时候,需要使用 0bject 类型来保存集合中的元素,并在使用时强制类型转换成实际类型,而有了泛型之后,只需要在定义集合时指定类型即可。

  • 在集合中使用泛型
    Collection<String> strs= new ArrayList<String>():
    这就表示该集合只能存储字符串,存储其它类型时编译器报错。
    并目以上代码使用污型后,避免了繁琐的类型转换,集合中的元素可以直接调用String类特有的方法
  • Java7的新特性:钻石表达式
    Collection<String> strs= new ArrayList<>():

类中泛型定义使用<T>,使用泛型使用T
逻辑表达式中使用泛型使用<T>

// 类定义泛型 只能用在实例方法内,静态方法不能用
class Person<T> {
    // 属性
    public T name;
    // 实例方法使用泛型 无返回类型
    public void say(T t) {}
    // 实例方法使用泛型 有返回类型
    public T eat(T t) {return t;}
}

class Student {
    // 静态方法定义泛型,在返回值前面声明,无需再类上定义
    public static <T> void eat(T t) {}
    public static <T> T eat2(T t) { return t; }
}
  • 泛型通配符
  1. 泛型是在限定数据类型,当在集合或者其他地方使用到泛型后,那么这时一旦明确泛型的数据类型,那么在使用的时候只能给其传递和数据类型匹配的类型,否则就会报错。
  2. 有的情况下,我们在定义方法时,根本无法确定集合中存储元素的类型是什么。为了解决这个“无法确定集合中存储元素类型”问题,那么Java语言就提供了泛型的通配符。
  3. 通配符的几种形式:
    1.无限定通配符,<?>,此处“?”可以为任意引用数据类型。
    2.上限通配符,<?extends Number>,此处“?”必须为Number及其子类
    3.下限通配符,<?super Number>,此处“?”必须为Number及其父类。

迭代时删除元素

删除逻辑
rrayList<String> strings = new ArrayList<String>();
strings.add("Hello");
strings.add("World");
strings.add("Java");
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
    String next = iterator.next();
    if (next.equals("Hello")) {
        // 出现计数异常
        // strings.remove("Hello");
        // 删除元素
        iterator.remove();
    }
}
System.out.println(strings);

List接口



ArrayList

Vector

链表存储结构

LinkedList

栈数据结构

队列数据结构

Map继承结构


Map接口常用方法

HashMap






LinkedHashMap

Hashtable

Properties

二叉树与红黑二叉树




TreeMap

底层使用红黑树实现
有序不可重复
可排序

Set接口

Collections工具类

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 集合集合可以理解为一个自动增加长短的数组 集合常用类图 通过UML通过统一建模语言(将类跟类之间的关系使用图形见的...
    旧城丶恒书阅读 200评论 0 0
  • 第七章 集合运算 表的加减法 通过集合运算,可以得到两张表中记录的集合或者公共记录的集合,又或者其中 某张表中的记...
    大美mixer阅读 455评论 0 1
  • 1.Union集合运算符会出去重复的记录。注意事项: (1)作为运算对象的记录的列数必须相同。 (2)作为运算对象...
    一只胖猪猪阅读 385评论 0 0
  • 一.概述 1. 对象存储 在java最初版本中需要存储多个对象可以使用数组实现,数组的特点是长度一旦初始化之后确定...
    h0ss阅读 177评论 0 1
  • 前序 Kotlin没有自己的集合库,完全依赖Java标准库中的集合类,并通过扩展函数增加特性来增强集合。意味着Ko...
    大棋17阅读 5,366评论 0 10