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

news2024/12/24 1:02:43

一  初始结合框架

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.coloradmin.cn/o/2195880.html

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

相关文章

全面图解Docker架构设计:掌握Docker全链路思维与优化(命令篇)

Docker 是一个革命性的开放平台&#xff0c;用于开发、交付和运行应用程序。通过使用 Docker&#xff0c;开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何支持 Docker 的环境中&#xff0c;在不同环境中实现一致的运行。无论是在虚…

ctf.bugku - POST

题目来源 &#xff1a;POST - Bugku CTF 访问请求&#xff0c;返回如下信息&#xff1b; 从这里可以得到信息&#xff1b;想要得到flag &#xff0c;需要发送post请求&#xff0c;并且请求带有what参数&#xff0c;参数值为flag 构造消息体&#xff1b; burpsuite中&#x…

运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )

在上一篇文章中&#xff0c;我们已经在云服务器中安装并开启了minio服务&#xff0c;本章我们将为大家讲解如何利用程序将文件上传到minio桶中 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 - **对象&#xff08;Object&#xff0…

C++笔记之原子操作

C++笔记之原子操作 code review! 文章目录 C++笔记之原子操作1.初始化2.赋值3.取值4.赋给另一个原子类型5.`exchange`6.`compare_exchange_weak` 和 `compare_exchange_strong`使用场景7.注意事项在 C++ 中,原子类型提供了对共享变量的无锁操作,确保多线程环境下的安全。以下…

Android Automotive(一)

目录 什么是Android Automotive Android Automotive & Android Android Automotive 与 Android Auto 什么是Android Automotive Android Automotive 是一个基础的 Android 平台&#xff0c;它能够运行预装的车载信息娱乐系统&#xff08;IVI&#xff09;应用程序&#…

LeetCode讲解篇之1043. 分隔数组以得到最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 对于这题我们这么考虑&#xff0c;我们选择以数字的第i个元素做为分隔子数组的右边界&#xff0c;我们需要计算当前分隔子数组的长度为多少时能让数组[0, i]进行分隔数组的和最大 我们用数组f表示[0, i)区间内的…

【C++】函数重载+引用

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的函数重载和引用&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 预处理、编译、汇编、链接二. 函数重载1 概念2 C支持函数重载的原理—名字修饰…

『网络游戏』制作加载进度UI【04】

将上一章的提示界面隐藏 创建空节点重命名为LoadingWnd 设置父物体为伸展 创建一个image背景重命名为bg 将以下资源放进Art文件夹 设为精灵模式后拖拽 将下面资源图片放进Art文件夹 创建Image作为进度条重命名为loadingbg 复制一份重命名为loadingfg 将loadingfg设置为水平填充…

Stable Diffusion绘画 | AI 图片智能扩充

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

OpenStack Yoga版安装笔记(十六)Openstack网络理解

0、前言 本文将以Openstack在Linux Bridge环境下的应用为例进行阐述。 1、Openstack抽象网络 OpenStack的抽象网络主要包括网络&#xff08;network&#xff09;、子网&#xff08;subnet&#xff09;、端口&#xff08;port&#xff09;&#xff0c;路由器&#xff08;rout…

Android15车载音频之Virtualbox中QACT实时调试(八十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

Python--暂停一秒输出

在编程实践中&#xff0c;我们经常需要让程序在执行特定操作后暂停一段时间。Python中的time模块提供了一个简单而强大的sleep()函数&#xff0c;允许程序暂停指定的时间。本文将通过一个具体的例子&#xff0c;展示如何使用sleep()函数来实现每隔一秒输出一次当前时间的最后两…

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…

Golang | Leetcode Golang题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; type pair struct{ x, y int } var dir4 []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func islandPerimeter(grid [][]int) (ans int) {n, m : len(grid), len(grid[0])for i, row : range grid {for j, v : range row {if v 1 {for _, d :…

深度学习---------------------------------自注意力和位置编码

目录 自注意力跟CNN、RNN对比位置编码位置编码矩阵 绝对位置信息相对位置信息总结自注意力和位置编码自注意力该部分总代码 位置编码该部分总代码 二进制表示在编码维度上降低频率该部分总代码 自注意力 给定一个由词元组成的输入序列 x 1 x_1 x1​,…, x n x_n xn​&#xff…

基于web的网上摄影工作室的开发与实现源码+论文

项目简介 基于springboot实现的&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;springboot/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09;/Maven3&#xff08…

基于ssm实现的建筑装修图纸管理平台(源码+文档)

项目简介 基于ssm实现的建筑装修图纸管理平台&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;spring/springmvc/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09…

农业政策与市场分析:解读当前政策导向下的农业发展趋势

在快速变化的全球经济格局中&#xff0c;农业作为国家稳定发展的基石&#xff0c;其政策走向与市场动态备受瞩目。本文将深入剖析当前的农业政策背景&#xff0c;探讨其对设计的导向作用&#xff0c;以及市场趋势的反馈与影响&#xff0c;为农业可持续发展提供洞见。 1. 政策背…

SAP学习笔记 - 豆知识11 - 如何查询某个字段/DataElement/Domain在哪个表里使用?

大家知道SAP的表有10几万个&#xff08;也有说30多万个的&#xff0c;总之很多就是了&#xff09;&#xff0c;而且不断增多&#xff0c;那么当想知道一个字段在哪个表里使用的时候该怎么办呢&#xff1f; 思路就是SAP的表其实也是存在表里的&#xff1a;&#xff09;&#xf…

k8s 中的 PV 的动态供给

目录 1 存储类 Storageclass 介绍 1.1 StorageClass 说明 1.2 StorageClass 的属性 2 存储分配器 NFS Client Provisioner 2.1 官网存储分配器的部署介绍 2.2 实现动态创建 PV 模版清单文件的介绍 2.2.1 Storageclass 存储类的模版 2.2.2 创建 Provisioner 制备器的模版 2.2.3…