Java笔记(十三)

集合

01集合概述

集合概述

什么是集合,有什么用?

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

02Collection继承结构

Collection继承结构 SequencedCollection和SequencedSet接口都是Java21新增的接口。 右图中蓝色的是实现类。其它的都是接口。 6个实现类中只有HashSet是无序集合。剩下的都是有序集合。 有序集合:集合中存储的元素有下标或者集合中存储的元素是可排序的。 无序集合:集合中存储的元素没有下标并且集合中存储的元素也没有排序。 每个集合实现类对应的数据结构如下: LinkedList:双向链表(不是队列数据结构,但使用它可以模拟队列) ArrayList:数组 Vector:数组(线程安全的) HashSet:哈希表 LinkedHashSet:双向链表和哈希表结合体 TreeSet:红黑树 List集合中存储的元素可重复。Set集合中存储的元素不可重复。

03Collection接口

Collection接口的通用方法 boolean add(E e);          

 向集合中添加元素 int size();                    

获取集合中元素个数 boolean addAll(Collection c);    

将参数集合中所有元素全部加入当前集合 boolean contains(Object o);  

 判断集合中是否包含对象o boolean remove(Object o);      

 从集合中删除对象o void clear();                

清空集合 boolean isEmpty();          

 判断集合中元素个数是否为0 Object[] toArray();      

将集合转换成一维数组

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

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

04SequencedCollection接口

所有的有序集合都实现了SequencedCollection接口 SequencedCollection接口是Java21版本新增的。 SequencedCollection接口中的方法: void addFirst(Object o):向头部添加 void addLast(Object o):向末尾添加 Object removeFirst():删除头部 Object removeLast():删除末尾 Object getFirst():获取头部节点 Object getLast():获取末尾节点 SequencedCollection reversed(); 反转集合中的元素 ArrayList,LinkedList,Vector,LinkedHashSet,TreeSet,Stack 都可以调用这个接口中的方法。

05泛型

泛型是Java5的新特性,属于编译阶段的功能。 泛型可以让开发者在编写代码时指定集合中存储的数据类型 泛型作用: 类型安全:指定了集合中元素的类型之后,编译器会在编译时进行类型检查,如果尝试将错误类型的元素添加到集合中,就会在编译时报错,避免了在运行时出现类型错误的问题。 代码简洁:使用泛型可以简化代码,避免了繁琐的类型转换操作。比如,在没有泛型的时候,需要使用 Object 类型来保存集合中的元素,并在使用时强制类型转换成实际类型,而有了泛型之后,只需要在定义集合时指定类型即可。 在集合中使用泛型 Collection<String> strs = new ArrayList<String>(); 这就表示该集合只能存储字符串,存储其它类型时编译器报错。 并且以上代码使用泛型后,避免了繁琐的类型转换,集合中的元素可以直接调用String类特有的方法。 Java7的新特性:钻石表达式 Collection<String> strs = new ArrayList<>();

泛型的使用:在静态方法上定义泛型

在类上定义的泛型,在静态方法中无法使用。如果在静态方法中使用泛型,则需要再方法返回值类型前面进行泛型的声明。 语法格式:<泛型1, 泛型2, 泛型3, ...> 返回值类型 方法名(形参列表) {}

泛型的使用:在接口上定义泛型

语法格式:interface 接口名<泛型1,泛型2,...> {} 例如:public interface Flayable<T>{} 实现接口时,如果知道具体的类型,则:public class MyClass implements Flyable<Bird>{} 实现接口时,如果不知道具体的类型,则:public class MyClass<T> implements Flyable<T>{}

泛型通配符

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

06迭代时删除元素


 

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值