数据结构的基本框架以及泛型

目录

  • 集合框架
  • 复杂度
    • 大O的渐进表示法
  • 装包(箱)或者拆包(箱)
    • 装包
    • 拆包
  • 泛型
    • 泛型的上界
    • 泛型方法求最大值

集合框架

Java的集合框架,Java Collection Framework 又被称为容器container, 定义在java.util包下的一组 interfaces 和其实现类 classes

interface: 接口
abstracb class: 抽象类
class: 类

在这里插入图片描述
这一张图片里面.,描述了Java里面,比较重要的类与类, 类与接口之间的关系.

在这里插入图片描述

在这两个图里面,最重要的接口有4个,分别是list, queue,set 以及 map,其他的类都是实现这些接口的

复杂度

在我们写代码的时候,我们是会讲究一个效率问题的,被用复杂度来表示,其中也分为时间复杂度以及空间复杂度,这两个复杂度都是用: 大O的渐进表示法来表示的

复杂度肯定也是有分为最好情况,最坏情况以及平均情况的 ,但是我们一般在讨论的时候,我们都是要默认说最坏的情况.

大O的渐进表示法

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

例如:
在这里插入图片描述
例如代码之中有这样一块循环,复杂度是按照最坏的情况考虑的,

for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {count++;}
}

首先里面第一部分是这样一块代码,两个for循环套在一起,最坏的情况就是每个for会循环N次,所以这一块的复杂度就是N^2次

for (int i = 0; i < 2 * N; i++) {count++;}

第二部分里面,循环会有2N次,所以他的复杂度就是2N次

int m = 10;while ((m--) > 0){count++;}

第三部分就是一个while循环,可以看见m是10,所以这个循环最多进行10次,复杂度为10

最后的话我们就可以知道这个复杂度是O(N) = N^2 + 2 * N + 10
我们再根据大O的渐进法进行化简,O(N) = N^2就是代码的复杂度了

装包(箱)或者拆包(箱)

装包

Integer a =10;int i = 5;
Integer b =i;

上面的代码是两种装包的写法
但是我们有两种装包的方式,一种是显式,一种是隐式装包

Integer a =10;
Integer aa = Integer.valueOf(10);

上面这两个就是不用的装包方式,a是一种隐式装包,在写的时候把valueof给隐藏起来了,没有显式出来
aa的话就是显式装包,在这个过程中,把valuof这个过程给写了出来

拆包

同样的,拆包也分为隐式的和显式的

Integer a =10;
int i = a;

想这个就是隐式的拆包

int aa = a.intValue();
double d = a.doubleValue();

像上面这两个就是显式的拆包,

从上面可以看出,对于拆包来说,隐式和显式的差别也就是在于value的差别

在这里插入图片描述
在这个截图上面,我们可以看出,定义了两组不同的包装类.但是有一组返回的是true,有一组返回的是false,这是为什么呢?
在这里插入图片描述
在这里插入图片描述
通过上面两个截图,调用valueof的底层源码可以看到,它的取值范围是在-128到127之间的,那也就是说我们的aa,以及bb是超出了这个范围的.
所以当aa,bb都取值200时候,他们都是创建了新的地址,所以地址是不同的

泛型

泛型的概念: 实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据.也可以根据成员方法数组中某个下标的值

class MyArray<T>{public Object[] array = new Object[10];public void setvalue(int pos,T val){array[pos] = val;}public T getvalue(int pos){return (T)array[pos];}
}
public class Test {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<Integer>();myArray.setvalue(0,10);myArray.setvalue(1,100);int a = myArray.getvalue(1);System.out.println(a);MyArray<String> myArray1 = new MyArray<String>();myArray1.setvalue(0,"hello");myArray1.setvalue(1,"ko");String b = myArray1.getvalue(0);System.out.println(b);

像在上面就是个泛型的代码,在上面这个代码里面,我们可以发现,我们在输出的时候可以输出整数,也可以输出字符串,我们想输出其他的类型,只要创建一个新的对象就可以了
在这里插入图片描述
我们可以正常的输出a和b,就像泛型的概念说的"类中包含一个数组成员,使得数组中可以存放任何类型的数据"
像在泛型里面还要一点要注意
在这里插入图片描述
像我们在泛型里面创建对象的时候,我们不可以new一个泛型类型的数据,必须是Object类型的,因为泛型是在编译时期的一个概念,当程序运行起来到了JVM以后,就没有了泛型的概念

泛型在编译时期是如何编译的?
是采用了擦除机制,把T擦除成了Object!!!

泛型的上界

模板: class 泛型类名称 <类型形参 extends 类型边界> {

}

class TestGeneric<T extends Number>{}public class Test {public static void main(String[] args) {TestGeneric<Number> testGeneric = new TestGeneric<>();}
}

这上面就是泛型的一个使用模板
在这里插入图片描述
这上面的话是一个泛型取最大值的方法,但是我们可以看到在if的那个地方,会报错.
这是因为T一定是引用数据类型,最终被擦除为了Object类型,因为我们是要求最大值,所以这个T的类型一定是可比较的,所以我们要继承自Comparable接口,然后可以调用CompareTo进行比较
在这里插入图片描述
所以正确的我们if里面要像上图这样写才可以

class Alg<T extends Comparable<T>> {public T findMaxValue(T[] array) {T max = array[0];for (int i = 0; i < array.length; i++) {if (max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}public class Test {public static void main(String[] args) {Alg<Integer> alg = new Alg<>();Integer[] integers = {1, 2, 3, 4, 5, 6, 7};Integer ret = alg.findMaxValue(integers);System.out.println(ret);}
}

在这里插入图片描述
完整的代码就是上面这样的,最大值也就是7

泛型方法求最大值

class Alg2{public static <T extends Comparable<T>> T findMaxValue(T[] array){T max = array[0];for (int i = 0; i < array.length; i++) {if (max.compareTo(array[i]) < 0){max = array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Alg2 alg2 = new Alg2();Integer[] integers1 = {1,2,3,4,5,6,7};Integer ret1 = alg2.findMaxValue(integers1);System.out.println(ret1);}}


像上面这个方法的话,我们的Alg2里面,并没有写是什么类型的,但是为什么会知道现在是什么类型的呢,因为类型推导
会根据我们类型的传值,来推到此时的类型

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

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

相关文章

前端框架的发展史介绍框架特点

目录 1.前端框架的发展历程 2.官网、优缺点、使用场景 2.1 jQuery 2.2 AngularJS 2.3 React 2.4 Vue.js 2.5 Angular 1.前端框架的发展历程 jQuery&#xff08;2006年&#xff09;&#xff1a;jQuery是一个非常流行的JavaScript库&#xff0c;用于简化DOM操作和事件处理…

数据库系统原理实验报告2 | 创建数据库和表

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ———— 本次实验使用到的图形化工具&#xff1a;Heidisql 目录 一、实验目的 二、实验内容 1、创建数据库 2、创建表 1.…

项目实践《招聘网站数据爬取》

文章目录 一、模块导入部分二、预定义参数部分三、函数定义部分&#xff1a;send_get(page)四、函数定义部分&#xff1a;process_data(data)五、函数定义部分&#xff1a;responsibility(job_url)六、函数定义部分&#xff1a;while_data()七、主程序执行部分&#xff1a;八、…

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

【消息队列开发】 实现MemoryDataCenter类——管理内存数据

文章目录 &#x1f343;前言&#x1f334;数据格式的准备&#x1f332;内存操作&#x1f6a9;对于交换机&#x1f6a9;对于队列&#x1f6a9;对于绑定&#x1f6a9;对于单个消息&#x1f6a9;对于队列与消息链表&#x1f6a9;对于未确认消息&#x1f6a9;从硬盘上读取数据 ⭕总…

Java -- 异常

异常概念 异常是程序在运行期间发生的不正常的事件, 它会打断指令的正常执行流程.   设计良好的程序应该在异常发生时提供处理这些不正常事件的方法, 使程序不会因为异常的发生而阻断或产生不可预见的结果.    Java语言使用异常处理机制为程序提供了异常处理的能力. 异常分…

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…

LGB2028 反向输出一个三位数

&#xff08;LG是洛谷&#xff08;洛谷&#xff09;的意思&#xff09; 题目链接&#xff1a;B2028 题目描述 将一个三位数反向输出&#xff0c;例如输入 358&#xff0c;反向输出 853。 输入格式 一个三位数 n。 输出格式 反向输出 n。 输入输出样例 输入 #1 100 输…

HashMap底层是如何实现的?

1、典型回答 不同的JDK 版本&#xff0c;HashMap 的底层实现是不一样的&#xff0c;总体来说&#xff1a;在JDK 1.8 之前(不包含JDK 1.8)&#xff0c;HashMap 使用的是数组 链表实现的&#xff0c;而JDK 1.8之后(包含JDK 1.8)使用的是数组 链表或红黑树实现的 HashMap 在JD…

CTFHUB-web-信息泄漏

题目所在位置&#xff1a;技能树->web->信息泄漏 目录遍历 打开题目&#xff0c;我们进入的是这个页面 翻译过来就是 得到的信息就是&#xff1a;flag要在这些目录里面寻找&#xff0c;我们直接一个一个点开查看就行 发现得到一个flag.txt&#xff0c;点击打开得到flag …

计算机组成原理 第五章(计算机的运算方法)—第六节(算数逻辑单元)

写在前面&#xff1a; 本系列笔记主要以《计算机组成原理&#xff08;唐朔飞&#xff09;》为参考&#xff0c;大部分内容出于此书&#xff0c;笔者的工作主要是挑其重点展示&#xff0c;另外配合下方视频链接的教程展开思路&#xff0c;在笔记中一些比较难懂的地方加以自己的…

upload-labs通关方式

pass-1 通过弹窗可推断此关卡的语言大概率为js&#xff0c;因此得出两种解决办法 方法一 浏览器禁用js 关闭后就逃出了js的验证就可以正常php文件 上传成功后打开图片链接根据你写的一句话木马执行它&#xff0c;我这里采用phpinfo&#xff08;&#xff09; 方法二 在控制台…

第八阶段:uni-app小程序 --首页开发(2)

一&#xff1a;分析页面布局 1.1: 功能 搜索框&#xff1a; 轮播图&#xff1a; 分类的导航区&#xff1a; 楼层区&#xff1a; 二&#xff1a; 利用命令创建home分支 git branch git checkout -b home git branch 三&#xff1a; 配置网络请求(main.js 入口函数&#x…

TCP多线程模型、IO模型(select、poll、epoll)

我要成为嵌入式高手之3月11日Linux高编第十九天&#xff01;&#xff01; ———————————————————————————— TCP并发模型 一、TCP多线程模型&#xff1a; 缺点&#xff1a;创建线程会带来资源开销&#xff0c;能够现的并发量比较有限 二、IO模型&…

科研绘图二:箱线图(抖动散点)

R语言绘图系列—箱线图抖动散点 &#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 文章目录 R语言绘图系列---箱线图抖动散点&#xff08;二&#xff09;: 科研绘图一&#xff1a;箱线图&#xff08;抖动散点&#xff09; 前言一、…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)下篇

onRequestSelected onRequestSelected(callback: () > void) 当Web组件获得焦点时触发该回调。 示例&#xff1a; // xxx.ets import web_webview from ohos.web.webviewEntry Component struct WebComponent {controller: web_webview.WebviewController new web_webv…

蓝桥集训之糖果

蓝桥集训之糖果 核心思想&#xff1a;dfs 剪枝 重复覆盖问题 暴搜 直到所有列都覆盖优化&#xff1a; 1.迭代加深 答案从1开始 2.逻辑简化 每次从可选行数最少得一列开始 3.可行性剪枝 添加估值函数h(),表示至少还需要选几行 与剩余行数的大小比较 4.**位运算 **将每包糖果…

wsl ubuntu 安装cuda nvcc环境

wsl ubuntu 安装cuda环境&#xff1a; CUDA Toolkit 11.6 Downloads | NVIDIA DeveloperDownload CUDA Toolkit 11.6 for Linux and Windows operating systems.https://developer.nvidia.com/cuda-11-6-0-download-archive?target_osLinux&target_archx86_64&Distri…

22-分支和循环语句_while语句(下)(初阶)

该代码输出什么&#xff1f; int main() {char ch \0;while ((ch getchar()) ! EOF){if (ch < 0 || ch>9){continue;}putchar(ch);}return 0; } 结果&#xff1a;该代码只打印数字字符 附&#xff1a;ASCII码表

C语言项目:数组与函数实践:扫雷游戏

目录 目录&#xff1a; 1.扫雷游戏分析与设计 1.1扫雷游戏的功能说明&#xff1a; 1.1.1使用控制台实现经典扫雷的游戏 1.1.2游戏可以通过菜单实现继续玩或者退出游戏 1.1.3扫雷棋盘是9*9的格子 1.1.4默认随机布置10个雷 1.1.5 可以排查雷 2.扫雷游戏的代码实现 1.遇到的问题…