集合和泛型的详细讲解(一)

简介: 集合和泛型的详细讲解

集合

1)可以动态保存任意多个对象,使用比较方便!

2)提供了一系列方便的操作对象的方法:add、remove、set、get等3)使用集合添加,删除新元素的示意代码-简洁了

集合的框架体系

Collection 接口和常用方法

Collection 接口实现类的特点

1)collection实现子类可以存放多个元素,每个元素可以是Object

2)有些Collection的实现类,可以存放重复的元素,有些不可以

3)有些Collection的实现类,有些是有序的(List),有些不是有序(Set)

4)Collection接口没有直接的实现子类,是通过它的子接口Set和 List来实现的

Collection 接口遍历元素方式 1-使用使用 Iterator(迭代器)

基本介绍

1 )Iterator对象称为迭代器,主要用于遍历 Collection集合中的元素。2)所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器。

3)Iterator的结构.[看一张图]

4)Iterator 仅用于遍历集合,Iterator本身并不存放对象。

提示:在调用iterator.next()方法之前必须要调用iterator.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。

Collection 接口遍历对象方式 2-for

List 接口和常用方法

List 接口基本介绍

List接口是 Collection接口接口

1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复

2)List集合中的每个元素都有其对应的顺序索引,即支持索引。

3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

JDKAPI中List接口的实现类:

List 接口和常用方法

常用的 ArrayList LinkedList和Vector

List 接口的常用方法

  1. boolean addAll(int index, Collection eles):从 index位置开始将 eles 中的所有元素添加
  2. Object get(int index):获取指定 index 位置的元素
  3. int indexOf(Object obj):返回 obj 在集合中首次出现的位置
  4. int lastIndexOf(Object obj):返回 obj 在当前集合中末次出现的位置
  5. Object remove(int index):移除指定 index 位置的元素,并返回此元素
  6. Object set(int index, Object ele):设置指定 index 位置的元素为 ele , 相当于是替换.
  7. List subList(int fromIndex, int toIndex):返回从 fromIndex 到 toIndex 位置的子集合

注意返回的子集合 fromIndex <= subList < toIndex

List 的三种遍历方式 [ArrayList, LinkedList,Vector]

ArrayList 底层结构和源码分析

ArrayList 的注意事

1) permits all elements, including null , ArrayList 可以加入null,并且多个

2) ArrayList是由数组来实现数据存储的

3) ArrayList 基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码 在多线程情况下,不建议使用ArrayList

ArrayList 的底层操作机制源码分析(重点,难点.)

1)ArrayList中维护了一个Object类型的数组elementData. transient Object[] elementData; //transient表示瞬间,短暂的,表示该属性不会被序列号

2)当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。

3)如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

示意图:

Vector 底层结构和源码剖析

Vector 的基本介绍

//如果 需要的数组大小 不够用,就扩容 , 扩容的算法

//newCapacity = oldCapacity + ((capacityIncrement > 0) ?

// capacityIncrement : oldCapacity);

//就是扩容两倍.

Vector 和 ArrayList的比较

LinkedList 底层结构

LinkedList 的全面说

1)LinkedList底层实现了双向链表和双端队列特点

2)可以添加任意元素(元素可以重复),包括null

3)线程不安全,没有实现同步

LinkedList底层操作机制

1)LinkedList底层维护了一个双向链表

2)LinkedList中维护了两个属性first和last分别指向首节点和尾节点

3)每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表.

4)所以LinkedList的元素的添加和删除,不是通过数组完成的,相对来说效率较高。

模拟一个简单的双向链表

LinkedList 的增删改查案例

  1. linkedList.remove(); // 这里默认删除的是第一个结点
  2. linkedList.set(1, 999); //修改某个结点对象
  3. /get(1) 是得到双向链表的第二个对象Object o = linkedList.get(1)
  4. //因为 LinkedList 是 实现了 List 接口, 遍历方式

System.out.println(“=LinkeList 遍历迭代器==”);

Iterator iterator = linkedList.iterator();

while (iterator.hasNext()) {

Object next = iterator.next();

System.out.println(“next=” + next);

}

ArrayList 和 LinkedList 比较

Set 接口和常用方法

Set 接口基本介绍

1)无序(添加和取出的顺序不一致),没有索引

2)不允许重复元素,所以最多包含一个null

3)JDK APl中Set接口的实现类有:

Set 接口的常用方法

和List 接口一样, Set 接口也是 Collection的子接口 因此 常用方法和 Collection 接口一样.

Set 接口的遍历方式

  1. 可以使用迭代器
  2. 增强for
  3. 不能使用索引的方式来获取

Set 接口实现类-HashSet

HashSet 的全面说明

1)HashSet实现了Set接口

2)HashSet实际上是HashMap,

3)可以存放null值,但是只能有一个null

4)HashSet不保证元素是有序的,取决于hash后,再确定索引的结果.(即,不保证存放元素的顺序和取出顺序一致)

5)不能有重复元素/对象.在前面Set接口使用已经讲过

HashSet 底层机制说明

分析HashSet底层是HashMap, HashMap底层是(数组+链表+红黑树)

>分析HashSet的添加元素底层是如何实现(hash()+equals())


目录
相关文章
|
缓存 网络协议 安全
49. 【Android教程】HTTP 使用详解
49. 【Android教程】HTTP 使用详解
415 1
|
人工智能 关系型数据库 分布式数据库
沉浸式学习PostgreSQL|PolarDB 16: 植入通义千问大模型+文本向量化模型, 让数据库具备AI能力
本文将带领大家来体验一下如何将“千问大模型+文本向量化模型”植入到PG|PolarDB中, 让数据库具备AI能力.
26079 21
沉浸式学习PostgreSQL|PolarDB 16: 植入通义千问大模型+文本向量化模型, 让数据库具备AI能力
|
SQL 运维 数据库
12-TDengine数据迁移:导入与导出
12-TDengine数据迁移:导入与导出
3343 0
12-TDengine数据迁移:导入与导出
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
1511 0
|
存储 运维 安全
华为的云计算认证和阿里云的云计算认证有什么区别?
作为一个新兴的行业,云计算在最近几年正逐渐提高自己在人们日常生活中的作用,给人们的生活带来了巨大的便利,而且随着科技地不断发展。
|
8月前
|
自然语言处理 API 数据库
2025年大模型就业:核心技术趋势、技能要求与职业发展全景解析
随着大语言模型(Large Language Models, LLMs)的技术飞速迭代,人工智能领域正经历从通用对话工具向高度智能化、任务导向的智能体(Agent)系统的深刻转型。到2025年4月,企业对掌握LLM相关技术的专业人才需求持续高涨,核心能力聚焦于检索增强生成(RAG)、智能体任务自动化、模型对齐优化以及多模态融合。本文将全面剖析2025年大模型就业市场的技术演进路径、核心技能要求、行业应用场景、推荐实践项目以及职业发展建议,旨在为从业者提供详尽的职业规划指南,帮助其精准把握行业机遇。
1860 6
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
631 5
|
安全 关系型数据库 MySQL
Web安全-条件竞争漏洞
Web安全-条件竞争漏洞
263 0
|
10月前
|
人工智能 物联网 大数据
申报开启|2024年阿里云协同育人第二批项目申报指南
2024年阿里云协同育人第二批项目申报正式开启。为落实国家教育规划,深化产教融合,阿里云设立教学内容和课程体系改革、实践条件和实践基地建设等项目,支持高校创新人才培养。申报截止日期为2024年11月15日,立项公示于11月29日前完成。欢迎各高校积极申报,共育创新人才。
|
缓存 Kubernetes 负载均衡
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
k8s学习--sessionAffinity会话保持(又称会话粘滞)详细解释与应用
1408 0

热门文章

最新文章