java数据结构(1):集合框架,时间,空间复杂度,初识泛型

目录

一 java数据结构的集合框架

1.什么是数据结构

2.集合框架

2.1什么是集合框架:

1. 接口 (Interfaces)

2. 实现类 (Implementations)

3. 算法 (Algorithms)

4. 并发集合 (Concurrent Collections)

2.2集合框架的优点:

二 时间和空间复杂度 

1.算法效率

2.常用集合类的时间复杂度和空间复杂度:

1. List

ArrayList

LinkedList

2. Set

HashSet

LinkedHashSet

TreeSet

3. Map

HashMap

LinkedHashMap

TreeMap

4. Queue

PriorityQueue

LinkedList(作为Queue使用)

5. 并发集合(Concurrent Collections)

ConcurrentHashMap

CopyOnWriteArrayList

3.时间复杂度

3.1大O的渐进表示法

3.2 推导大O阶方法

3.3最好、平均和最坏情况

4.时间复杂度的例题分析

4.1 例一

4.2.例二

4.3例三

4.4例四

4.5例五

5 空间复杂度 

三 初识泛型


 

一 java数据结构的集合框架

1.什么是数据结构

数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。

2.集合框架

2.1什么是集合框架:

Java 集合框架(Java Collections Framework,JCF)是 Java 标准库中用于处理集合(如列表、集合和映射)的架构。集合框架提供了多种数据结构和算法的实现,使得开发人员能够方便地操作数据集合。以下是 Java 集合框架的一些关键组件:

1. 接口 (Interfaces)

Java 集合框架定义了一组标准接口,以支持不同类型的集合。主要接口包括:

  • Collection:是最基本的集合接口,所有集合类都实现这个接口。
  • List:有序集合,允许重复元素。主要实现类有 ArrayListLinkedList
  • Set:不允许重复元素的集合。主要实现类有 HashSetLinkedHashSetTreeSet
  • Queue:用于表示先进先出(FIFO)队列。主要实现类有 LinkedListPriorityQueue
  • Deque:双端队列,允许在两端进行插入和删除操作。主要实现类有 ArrayDequeLinkedList
  • Map:键值对映射,键不允许重复。主要实现类有 HashMapLinkedHashMapTreeMap

2. 实现类 (Implementations)

Java 集合框架提供了各种集合接口的实现类:

  • ArrayList:基于数组的列表,实现了 List 接口,支持快速随机访问。
  • LinkedList:基于链表的列表,实现了 ListDeque 接口,适合频繁插入和删除操作。
  • HashSet:基于哈希表的集合,实现了 Set 接口,不保证顺序。
  • LinkedHashSet:基于哈希表和链表的集合,实现了 Set 接口,维护插入顺序。
  • TreeSet:基于红黑树的集合,实现了 NavigableSet 接口,按自然顺序或提供的比较器排序。
  • HashMap:基于哈希表的映射,实现了 Map 接口,键值对无序。
  • LinkedHashMap:基于哈希表和链表的映射,实现了 Map 接口,维护插入顺序或访问顺序。
  • TreeMap:基于红黑树的映射,实现了 NavigableMap 接口,按自然顺序或提供的比较器排序。
  • PriorityQueue:基于优先级堆的队列,实现了 Queue 接口,元素按自然顺序或提供的比较器排序。

3. 算法 (Algorithms)

集合框架还提供了一组算法(静态方法),主要位于 Collections 类中,如排序、搜索和修改集合的方法:

  • 排序Collections.sort(list) 用于对列表进行自然排序。
  • 二分查找Collections.binarySearch(list, key) 用于在排序列表中执行二分查找。
  • 打乱Collections.shuffle(list) 用于随机打乱列表中的元素。
  • 反转Collections.reverse(list) 用于反转列表中的元素顺序。
  • 交换Collections.swap(list, i, j) 用于交换列表中两个位置的元素。
  • 最大最小值Collections.max(collection)Collections.min(collection) 用于找到集合中的最大和最小值。

4. 并发集合 (Concurrent Collections)

为了支持多线程环境,Java 集合框架还提供了一些线程安全的集合类,位于 java.util.concurrent 包中:

  • ConcurrentHashMap:线程安全的哈希表,允许高效的并发访问。
  • CopyOnWriteArrayList:线程安全的列表,适用于读多写少的场景。
  • CopyOnWriteArraySet:线程安全的集合,基于 CopyOnWriteArrayList 实现。

Java 集合框架通过这些接口、实现类和算法,提供了丰富的数据结构和操作方法,极大地简化了集合数据的处理。

2.2集合框架的优点:

使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码

二 时间和空间复杂度 

1.算法效率

算法的好与坏,取决于算法的效率。

2.常用集合类的时间复杂度和空间复杂度:

在Java集合框架中,不同数据结构和算法的效率是关键考虑因素。了解这些效率可以帮助你选择最适合特定应用场景的数据结构。下面列出了一些常用集合类的时间复杂度和空间复杂度:

1. List

ArrayList

  • 访问(get):O(1)
  • 插入(add):O(1)(摊销时间复杂度)
  • 删除(remove):O(n)(平均情况下,需要移动元素)
  • 空间复杂度:O(n)

LinkedList

  • 访问(get):O(n)
  • 插入(add):O(1)
  • 删除(remove):O(1)
  • 空间复杂度:O(n)

2. Set

HashSet

  • 插入(add):O(1)(在负载因子合理的情况下)
  • 删除(remove):O(1)
  • 查找(contains):O(1)
  • 空间复杂度:O(n)

LinkedHashSet

  • 插入(add):O(1)
  • 删除(remove):O(1)
  • 查找(contains):O(1)
  • 空间复杂度:O(n)

TreeSet

  • 插入(add):O(log n)
  • 删除(remove):O(log n)
  • 查找(contains):O(log n)
  • 空间复杂度:O(n)

3. Map

HashMap

  • 插入(put):O(1)(在负载因子合理的情况下)
  • 删除(remove):O(1)
  • 查找(get):O(1)
  • 空间复杂度:O(n)

LinkedHashMap

  • 插入(put):O(1)
  • 删除(remove):O(1)
  • 查找(get):O(1)
  • 空间复杂度:O(n)

TreeMap

  • 插入(put):O(log n)
  • 删除(remove):O(log n)
  • 查找(get):O(log n)
  • 空间复杂度:O(n)

4. Queue

PriorityQueue

  • 插入(add):O(log n)
  • 删除(remove):O(log n)
  • 查找(peek):O(1)
  • 空间复杂度:O(n)

LinkedList(作为Queue使用)

  • 插入(add):O(1)
  • 删除(remove):O(1)
  • 查找(peek):O(1)
  • 空间复杂度:O(n)

5. 并发集合(Concurrent Collections)

ConcurrentHashMap

  • 插入(put):O(1)
  • 删除(remove):O(1)
  • 查找(get):O(1)
  • 空间复杂度:O(n)

CopyOnWriteArrayList

  • 访问(get):O(1)
  • 插入(add):O(n)(需要复制整个数组)
  • 删除(remove):O(n)(需要复制整个数组)
  • 空间复杂度:O(n)

选择合适的数据结构和算法时需要根据具体的使用场景来考虑,尤其是数据量和操作的频率。例如,若需要频繁访问元素,ArrayList 是更好的选择;若需要频繁插入和删除元素,LinkedList 更为适合;若需要快速查找和删除元素,HashSetHashMap 是不错的选择。

了解这些效率能够帮助你在开发过程中做出更明智的决策,从而提高应用程序的性能和效率。

3.时间复杂度

3.1大O的渐进表示法

    void fun(int N) {int count = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {count++;}}for (int k = 0; k <2*N ; k++) {count++;}int M=0;while ((M--)>0){count++;}System.out.println(count);}

Func 执行的基本操作次数 : 

3.2 推导大O阶方法

1、用常数1取代运行时间中的所有加法常数。

2、在修改后的运行次数函数中,只保留最高阶项。

3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

使用大O的渐进表示法以后,Func1的时间复杂度为:

3.3最好、平均和最坏情况

另外有些算法的时间复杂度存在最好、平均和最坏情况: 最坏情况:任意输入规模的最大运行次数(上界) 平均情况:任意输入规模的期望运行次数 最好情况:任意输入规模的最小运行次数(下界)

4.时间复杂度的例题分析

4.1 例一

void func2(int N) {
int count = 0;
for (int k = 0; k < 2 * N ; k++) {
count++;
}
int M = 10;
while ((M--) > 0) {
count++;
}
System.out.println(count);
}

 

4.2.例二

void func3(int N, int M) {
int count = 0;
for (int k = 0; k < M; k++) {
count++;
}
for (int k = 0; k < N ; k++) {
count++;
}
System.out.println(count);
}

 

4.3例三

void func4(int N) {
int count = 0;
for (int k = 0; k < 100; k++) {
count++;
}
System.out.println(count);
}

 

4.4例四

void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {
boolean sorted = true;
for (int i = 1; i < end; i++) {
if (array[i - 1] > array[i]) {
Swap(array, i - 1, i);
sorted = false;
}
}
if (sorted == true) {
break;
}
}
}

 

4.5例五

int binarySearch(int[] array, int value) {
int begin = 0;
int end = array.length - 1;
while (begin <= end) {
int mid = begin + ((end-begin) / 2);
if (array[mid] < value)
begin = mid + 1;
else if (array[mid] > value)
end = mid - 1;
else
return mid;
}
return -1;
}

 

 

空间复杂度:最好:1

                      最坏:最坏

5 空间复杂度 

空间复杂度(Space Complexity)是计算机科学中用于描述算法在运行过程中所需存储空间的一个指标。它通常表示为输入大小 nnn 的函数,即随着输入数据量的增加,算法所需要的额外内存空间如何变化。

5.1例题

void bubbleSort(int[] array) {
for (int end = array.length; end > 0; end--) {
boolean sorted = true;
for (int i = 1; i < end; i++) {
if (array[i - 1] > array[i]) {
Swap(array, i - 1, i);
sorted = false;
}
}
if (sorted == true) {
break;
}
}
}

使用了常数个额外空间,所以空间复杂度为 O(1) 

三 初识泛型

1. 什么是泛型

在Java中,泛型(Generics)是一个强大的特性,它允许在定义类、接口和方法时使用类型参数。这意味着你可以编写代码时不必指定具体的数据类型,而是使用泛型参数来创建更通用和可重用的代码。

2.泛型的优势

  • 类型安全:在编译时进行类型检查,防止类型转换错误。
  • 代码重用:编写一次代码,可以用于多种不同的数据类型。
  • 可读性和可维护性:代码更清晰,减少类型转换的复杂性。

3.泛型的基本语法

3.1定义泛型类

public class Box<T> {private T item;public void set(T item) {this.item = item;}public T get() {return this.item;}
}

3.2使用泛型类

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get();

3.3.1 定义泛型方法

public class Util {public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}
}

3.3.2使用泛型方法

Integer[] intArray = {1, 2, 3, 4, 5};
Util.printArray(intArray);String[] stringArray = {"A", "B", "C"};
Util.printArray(stringArray);

 

3.4.1 定义泛型接口

public interface Container<T> {void add(T item);T get();
}

3.4.2 实现泛型接口: 

public class MyContainer<T> implements Container<T> {private T item;@Overridepublic void add(T item) {this.item = item;}@Overridepublic T get() {return item;}
}

希望能对大家有所帮助 

谢谢观看 ! ! ! !

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269449.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

请你谈谈:spring AOP的浅显认识?

在Java面向对象编程中&#xff0c;解决代码重复是一个重要的目标&#xff0c;旨在提高代码的可维护性、可读性和复用性。你提到的两个步骤——抽取成方法和抽取类&#xff0c;是常见的重构手段。然而&#xff0c;正如你所指出的&#xff0c;即使抽取成类&#xff0c;有时仍然会…

【Redis宕机啦!】Redis数据恢复策略:RDB vs AOF vs RDB+AOF

文章目录 Redis宕机了&#xff0c;如何恢复数据为什么要做持久化持久化策略RDBredis.conf中配置RDBCopy-On-Write, COW快照的频率如何把握优缺点 AOFAOF日志内容redis.conf中配置AOF写回策略AOF日志重写AOF重写会阻塞吗优缺点 RDB和AOF混合方式总结 Redis宕机了&#xff0c;如何…

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

分布式锁的三种实现方式:Redis、基于数据库和Zookeeper

分布式锁的实现 操作共享资源&#xff1a;例如操作数据库中的唯一用户数据、订单系统、优惠券系统、积分系统等&#xff0c;这些系统需要修改用户数据&#xff0c;而多个系统可能同时修改同一份数据&#xff0c;这时就需要使用分布式锁来控制访问&#xff0c;防止数据不一致。…

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…

项目开发实战案例 —— Spring Boot + MyBatis + Hibernate + Spring Cloud

作者简介 我是本书的作者&#xff0c;拥有多年Java Web开发经验&#xff0c;致力于帮助更多开发者快速掌握并运用Java Web技术栈中的关键框架和技术。本书旨在通过实战案例的方式&#xff0c;带领读者深入理解并实践Spring Boot、MyBatis、Hibernate以及Spring Cloud等热门技术…

2-46 基于matlab的声音信号的短时能量、短时过零率、端点检测

基于matlab的声音信号的短时能量、短时过零率、端点检测。通过计算计算短时能量、调整能量门限&#xff0c;然后开始端点检测。输出可视化结果。程序已调通&#xff0c;可直接运行。 2-46 短时能量 短时过零率 端点检测 - 小红书 (xiaohongshu.com)

Vue element ui分页组件示例

https://andi.cn/page/621615.html

Camera Raw:预设

Camera Raw 的预设 Presetss模块能够简化和加速照片编辑过程。预设不仅能大大提升工作效率&#xff0c;还能确保处理结果的一致性和专业性。 快捷键&#xff1a;Shift P 预设 Preset与配置文件、快照有其异同之处&#xff0c;它们都可以快速改变照片的影调和颜色。 不同是&…

SQL labs-SQL注入(三,sqlmap使用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; 盲注简述&#xff1a;是在没有回显得情况下采用的注入方式&#xff0c;分为布尔盲注和时间盲注。 布尔盲注&#xff1a;布尔仅有两种形式&#xff0c;ture&#…

python-学生排序(赛氪OJ)

[题目描述] 已有 a、b 两个链表&#xff0c;每个链表中的结点包括学号、成绩。要求把两个链表合并&#xff0c;按学号升序排列。输入格式&#xff1a; 输入共 NM1 行。 第一行&#xff0c;输入 a、b 两个链表元素的数量 N、M&#xff0c;中间用空格隔开。下来 N 行&#xff0c;…

全网爆火的AI老照片变视频项目来了,简单易上手,1单69,日入1000+

每天为大家带来一个可实操落地的副业项目&#xff0c;创业思维&#xff0c;只要你认真看完&#xff0c;多少都能够为你带来帮助或启发。 最近在短视频上看到很多怀旧视频流量真的大&#xff0c;同时也看到朋友圈很多人在培训这个项目。 既然有这么多人在做&#xff0c;就证明…

一天搞定React(5)——ReactRouter(下)【已完结】

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

C语言文件操作,文件读写

目录 为什么要使用文件&#xff1f; 文件概念 1. 什么是文件&#xff1f; 2. 程序文件 3. 数据文件 4. 文件名 文件的使用 1. 文件指针 2. 文件的打开与关闭 文件的顺序读写 1. 顺序读写函数 2. scanf系列与printf系列 文件的随机读写 1. fseek 2. ftell 3. …

B端:用弹框还是用抽屉,请说出你的依据。

选择浮层&#xff08;弹出框&#xff09;还是抽屉&#xff08;侧边栏&#xff09;作为B端系统的浮层&#xff0c;需要根据具体情况来决定。以下是一些依据供您参考&#xff1a; 1.功能需求&#xff1a; 浮层的选择应该符合系统的功能需求。如果需要在当前页面上提供一些额外的操…

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表&#xff08;尽量使用列表初始化&#xff09; 二. static成员 2.1static成员初始化 三.友元 3.1友元&#xff1a;提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫…

Google Android 2024年7月最新消息汇总

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Google Android 2024年7月最新消息汇总 2024年7月&#xff0c;Google在Android生态系统中发布了多项更新和政策调整&#xff0c;涵盖了Google …

6万字,让你轻松上手的大模型 LangChain 框架

本文为我学习 LangChain 时对官方文档以及一系列资料进行一些总结&#xff5e;覆盖对Langchain的核心六大模块的理解与核心使用方法&#xff0c;全文篇幅较长&#xff0c;共计50000字&#xff0c;可先码住辅助用于学习Langchain。** 一、Langchain是什么&#xff1f; 如今各类…

开源多协议分布式压力测试工具Tsung详解

目录 1、Tsung简介 2、Tsung安装 3、Tsung的使用流程 4、Tsung配置详解 4.1、客户端配置 4.2、服务端配置 4.3、压力阶段配置 4.4、选项参数配置 4.5、会话动作配置 5、Tsung压测后的结果分析 5.1、统计数据表 5.2、曲线图 6、其他 6.1、record录制 6.2、Plotte…

多区域DNS以及主从DNS的搭建

搭建多域dns服务器&#xff1a; 搭建DNS多区域功能&#xff08;Multi-Zone DNS&#xff09;主要是为了满足复杂网络环境下的多样化需求&#xff0c;提高DNS服务的灵活性、可扩展性和可靠性。 适应不同网络环境&#xff1a; 在大型组织、跨国公司或跨地域服务中&#xff0c;网…