Java:数据结构-初始结合框架 时间复杂度和空间复杂度 初识泛型

一  初始结合框架

1.什么是Java的集合框架

Java 的集合框架(Java Collection Framework,JCF)是 Java 标准库中的一部分,用于存储和操作一组数据。它提供了一些常用的数据结构和接口,用来高效管理和操作数据。Java 的集合框架位于 java.util 包中。 

1.让我们来简单认识一下 Java 集合框架的主要组成部分和它们的用途:

1. 核心接口

Java 集合框架中定义了一些核心接口,它们是各种集合实现类的基础:

  • Collection 接口: 所有集合的根接口,提供了集合的基本操作(如添加、删除、遍历等)。
    • List 接口: 有序集合,允许重复元素。
    • Set 接口: 不允许重复元素的集合。
    • Queue 接口: 用于存储按照 FIFO(先进先出)顺序处理的元素。
    • Deque 接口: 双端队列,支持在两端添加和移除元素。
    • Map 接口: 不属于 Collection 接口体系,但常用于存储键值对映射。
2. 核心实现类

Java 集合框架中提供了接口的多种实现类,涵盖了不同的使用场景:

  • List 实现类

    • ArrayList: 基于动态数组的实现,访问速度快,适合随机访问。
    • LinkedList: 基于双向链表的实现,插入和删除速度快,适合频繁的插入/删除操作。
    • Vector: 类似于 ArrayList,但线程安全。
    • Stack: 基于 Vector 实现的栈,遵循 LIFO(后进先出)原则。
  • Set 实现类

    • HashSet: 基于哈希表的实现,元素无序且不重复,插入和查找速度快。
    • LinkedHashSet: 具有插入顺序的 HashSet 实现。
    • TreeSet: 基于红黑树的实现,元素有序(自然顺序或自定义比较器)。
  • Map 实现类

    • HashMap: 基于哈希表的键值对存储,无序。
    • LinkedHashMap: 保留键值对的插入顺序。
    • TreeMap: 基于红黑树,键值对按键有序排列。
    • Hashtable: 类似 HashMap,但线程安全。
  • Queue 和 Deque 实现类

    • PriorityQueue: 基于优先级的队列,元素按自然顺序或自定义顺序排列。
    • ArrayDeque: 基于数组的双端队列,适用于栈和队列操作。
3. 工具类

集合框架还提供了一些工具类,用于辅助操作集合:

  • Collections: 提供了各种静态方法,如排序、查找、线程安全包装等。
  • Arrays: 用于数组的操作(如转换为集合、排序、搜索等)。

 2.数据结构的概念

数据结构是计算机科学中的一个重要概念,指的是数据的存储、组织和管理方式,以便能够有效地访问和修改数据。选择适当的数据结构可以提高算法的效率,使得程序运行更快、占用更少的资源。简单来说,数据结构决定了数据如何被存储在计算机的内存中,如何被读取、操作和维护。

二 时间复杂度和空间复杂度

1.算法效率

如何判断一个算法的效率:

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作 空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间, 在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎,但是计算机经过很长时间的发展,储存容量已经到达了一个很高的容量,所以现在对于空间复杂度已经无所谓了,不是很在乎。

2时间复杂度

时间复杂度是一个函数,定量描述了算法的运行时间,算法中基本操作的执行次数为时间复杂度。

2.1大O的渐进表示法:

结果为:

 

大O的渐进表示法的规则 :

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

3.空间复杂度 

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,空间复杂度基本算的是变量的个数,和时间复杂度的算法基本一样,也用大O渐进表示法。

示例一:

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

示例二:

示例2动态开辟了N个空间,空间复杂度为 O(N) 

三 初识泛型

泛型是一种允许在类、接口和方法中定义类型参数的特性。通过泛型,实例化时可以指定具体的类型,使代码变得更加灵活。

1.包装类

1.1基本数据类型对应的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

1.2 装箱和拆箱

装箱是将基本数据类型(如intchar)转换为对应的包装类对象(如IntegerCharacter)。

拆箱则是将包装类对象转换回基本数据类型。

1.3装箱

分为手动装修和自动装箱

手动装修
public class Test {public static void main(String[] args) {int a=10;Integer a1=Integer.valueOf(a);System.out.println(a);}
自动拆箱
public class Test {public static void main(String[] args) {int b=11;Integer c=b;System.out.println(c);

1.4拆箱

分为手动拆箱和自动拆箱

手动装修
public class Test {public static void main(String[] args) {Integer a=10;int b=a.intValue();System.out.println(b);}
自动拆箱
public class Test {public static void main(String[] args) {Integer a=10;int c=a;System.out.println(c);

大家猜一下这个代码的运行结果

public class Test {public static void main(String[] args) {Integer a=10;Integer b=10;System.out.println(a==b);System.out.println("----------------");Integer c=200;Integer d=200;System.out.println(c==d);}

 

为什么结果会不一样呢?

所以让我们一起来看一下装箱是怎么操作的

我们可以看出有一个最大值和一个最小值,所以Integer是有范围的

 

如果不在这个范围内,则不会比较数值的大小,而是比较地址。

 2.泛型

泛型就是适用于许多类型。

示例(没有用泛型方法)

class MyArray{public Object[] array=new Object[10];public void setValue(int pos,Object val){array[pos]=val;}public Object getValue(int pos){return (Object) array[pos];}
}
public class Test2 {public static void main1(String[] args) {MyArray myArray=new MyArray();myArray.setValue(1,"he");String s=(String) myArray.getValue(1);System.out.println(s);}

(用了泛型方法) 

class MyArray<E>{public Object[] array=new Object[10];public void setValue(int pos,E val){array[pos]=val;}public E getValue(int pos){return (E) array[pos];}
}
public class Test2 {public static void main(String[] args) {MyArray<String> myArray=new MyArray<>();myArray.setValue(1,"he");String a=myArray.getValue(1);System.out.println(a);}

 通过上例,我们可以看出,泛型的运用可以在实例化时具体指定类型,接收时不需要强转,非常的便利。

2.1泛型的语法

1.

class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class Name<T1, T2, ..., Tn> {}
class 泛型类名称<类型形参列表> extends 继承类 /* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}

2. class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> {
// 可以只使用部分类型参数
}

class MyArray<E>extends Name<E>{public Object[] array=new Object[10];public void setValue(int pos,E val){array[pos]=val;}public E getValue(int pos){return (E) array[pos];}
}
public class Test2 {public static void main(String[] args) {MyArray<String> myArray=new MyArray<>();myArray.setValue(1,"he");String a=myArray.getValue(1);System.out.println(a);}public static void main1(String[] args) {MyArray myArray=new MyArray();myArray.setValue(1,"he");String s=(String) myArray.getValue(1);System.out.println(s);}}

2.2泛型类的使用 

泛型类的语法

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

示例

        MyArray<String> myArray=new MyArray<>();

 后面的<>中写不写Integer都可以,因为编译器会自动推导出需要的类型实参为 Integer

3.泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。 

语法:

class 泛型类名称<类型形参 extends 类型边界> {
...
}

示例:

class MyArray<E extends Number>{public Object[] array=new Object[10];public void setValue(int pos,E val){array[pos]=val;}public E getValue(int pos){return (E) array[pos];}
}

 Number的源代码

注:只接受 Number 的子类型作为 E 的类型实参 

public class Test2 {public static void main(String[] args) {MyArray<String> myArray=new MyArray<>();MyArray<Integer> myArray2=new MyArray<>();myArray.setValue(1,"he");String a=myArray.getValue(1);System.out.println(a);}

 

String会报错,因为Integer 是 Number 的子类型,String 不是 Number 的子类型。

4.泛型方法

class FindMax<E extends Comparable>{public E findMax(E[] array){E max=array[0];for (int i = 0; i < array.length; i++) {if(max.compareTo(array[i])>0){array[i]=max;}}return max;}
}
public class TestGenergic {public static void main(String[] args) {FindMax<Integer> findMax=new FindMax<>();Integer[] array = {1,2,3,4,45,5,6,8};System.out.println(findMax.findMax(array));}
}

希望能对大家有所帮助!!!! 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TOP-K问题

目录 TOP-K问题 1.对TOP-K问题的理解 1.1.TOP-K问题定义 1.2.TOP-K问题的解决思路 1.3.以求N个数据中的前K个最大元素为例&#xff0c;阐述建堆来解决TOP-K的原理 1.4.TOP-K问题的类型 2.类型1&#xff1a;数据量N较小&#xff0c;可以全部加载到内存中。求数据量N的前K…

2024 ciscn WP

一、MISC 1.火锅链观光打卡 打开后连接自己的钱包&#xff0c;然后点击开始游戏&#xff0c;答题八次后点击获取NFT&#xff0c;得到有flag的图片 没什么多说的&#xff0c;知识问答题 兑换 NFT Flag{y0u_ar3_hotpot_K1ng} 2.Power Trajectory Diagram 方法1&#xff1a; 使用p…

集合论基础 - 离散数学系列(一)

目录 1. 集合的基本概念 什么是集合&#xff1f; 集合的表示方法 常见的特殊集合 2. 子集与幂集 子集 幂集 3. 集合的运算 交集、并集与补集 集合运算规则 4. 笛卡尔积 5. 实际应用 6. 例题与练习 例题1 练习题 总结 引言 集合论是离散数学的基础之一&#xff…

Linux 外设驱动 应用 1 IO口输出

从这里开始外设驱动介绍&#xff0c;这里使用的IMX8的芯片作为驱动介绍 开发流程&#xff1a; 修改设备树&#xff0c;配置 GPIO1_IO07 为 GPIO 输出。使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。编译并测试。 这里假设设备树&#xff0c;已经配置好了。不在论述这个问题…

金融教育宣传月 | 平安养老险百色中心支公司开展金融知识“消保县域行”宣传活动

9月22日&#xff0c;平安养老险百色中心支公司积极落实国家金融监督管理总局关于开展金融教育宣传月活动的相关要求&#xff0c;联合平安人寿百色中心支公司共同组成了平安志愿者小队&#xff0c;走进百色市四塘镇百兰村开展了一场别开生面的金融消费者权益保护宣传活动。此次活…

通用mybatis-plus查询封装(QueryGenerator)

结果如下图所示 java类代码分别如下 1 package com.hdx.contractor.util.mybatis;import com.hdx.contractor.common.user.SecurityUser; import com.hdx.contractor.common.user.UserDetail; import com.hdx.contractor.util.query.oConvertUtils; import lombok.extern.slf…

YOLO11改进|卷积篇|引入线性可变形卷积LDConv

目录 一、【LDConv】卷积1.1【LDConv】卷积介绍1.2【LDConv】核心代码 二、添加【LDConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LDConv】卷积 1.1【LDConv】卷积介绍 下图是【LDCNV】的结构图&#xff0c;让我们简单分析…

Ajax面试题:(第一天)

目录 1.说一下网络模型 2.在浏览器地址栏键入URL&#xff0c;按下回车之后会经历以下流程&#xff1a; 3.什么是三次握手和四次挥手&#xff1f; 4.http协议和https协议的区别 1.说一下网络模型 注&#xff1a;各层含义按自己理解即可 2.在浏览器地址栏键入URL&#xff0c;…

盲拍合约:让竞拍更公平与神秘的创新解决方案

目录 前言 一、盲拍合约是什么&#xff1f; 二、盲拍合约工作原理 1、合约创建与初始化 2、用户出价&#xff08;Bid&#xff09; 3、出价结束 4、披露出价&#xff08;Reveal&#xff09; 5、处理最高出价 6、结束拍卖 7、退款与提款 三、解析盲拍合约代码…

阿里云域名解析和备案

文章目录 1、域名解析2、新手引导3、ICP备案 1、域名解析 2、新手引导 3、ICP备案

类的特殊成员函数——三之法则、五之法则、零之法则

系统中的动态资源、文件句柄&#xff08;socket描述符、文件描述符&#xff09;是有限的&#xff0c;在类中若涉及对此类资源的操作&#xff0c;但是未做到妥善的管理&#xff0c;常会造成资源泄露问题&#xff0c;严重的可能造成资源不可用&#xff0c;如申请内存失败、文件句…

【redis-05】redis保证和mysql数据一致性

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

57.对称二叉树

迭代 class Solution {public boolean isSymmetric(TreeNode root) {if(rootnull){return true;}Deque<TreeNode> denew LinkedList<>();TreeNode l,r;int le;de.offer(root.left);de.offer(root.right);while(!de.isEmpty()){lde.pollFirst();rde.pollLast();if(…

BMC pam认证的使用

1.说明 1.1 文档参考资料 https://www.chiark.greenend.org.uk/doc/libpam-doc/html/Linux-PAM_ADG.htmlhttp://www.fifi.org/doc/libpam-doc/html/pam_appl-3.htmlpdf文档: https://fossies.org/linux/Linux-PAM-docs/doc/adg/Linux-PAM_ADG.pdflinux-pam 中文文档pam 旧文p…

<数据集>工程机械识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2644张 标注数量(xml文件个数)&#xff1a;2644 标注数量(txt文件个数)&#xff1a;2644 标注类别数&#xff1a;3 标注类别名称&#xff1a;[dump truck, wheel loader, excavators] 序号类别名称图片数框数1dum…

SpringBootWeb快速入门!详解如何创建一个简单的SpringBoot项目?

在现代Web开发中&#xff0c;SpringBoot以其简化的配置和快速的开发效率而受到广大开发者的青睐。本篇文章将带领你从零开始&#xff0c;搭建一个基于SpringBoot的简单Web应用~ 一、前提准备 想要创建一个SpringBoot项目&#xff0c;需要做如下准备&#xff1a; idea集成开发…

wordpress Contact form 7发件人邮箱设置

此教程仅适用于演示站有留言的主题&#xff0c;演示站没有留言的主题&#xff0c;就别往下看了&#xff0c;免费浪费时间。 使用了Contact form 7插件的简站WordPress主题&#xff0c;在有人留言时&#xff0c;就会发邮件到网站的系统邮箱(一般与管理员邮箱为同一个)里。上面显…

SpringCloud简介 Ribbon Eureka 远程调用RestTemplate类 openfeign

〇、SpringCloud 0.区别于单体项目和soa架构&#xff0c;微服务架构每个服务独立&#xff0c;灵活。 1. spring cloud是一个完整的微服务框架&#xff0c;springCloud包括三个体系&#xff1a; spring cloud Netflix spring cloud Alibaba spring 其他 2.spring cloud 版本命名…

论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning

前言 在NLP领域,预训练模型(准确的说应该是预训练语言模型)似乎已经成为各大任务必备的模块了,经常有看到文章称后BERT时代或后XXX时代,分析对比了许多主流模型的优缺点,这些相对而言有些停留在理论层面,可是有时候对于手上正在解决的任务,要用到预训练语言模型时,面…

软件设计师(软考学习)

数据库技术 数据库基础知识 1. 数据库中的简单属性、多值属性、复合属性、派生属性简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值…