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

目录

  • 集合框架
  • 复杂度
    • 大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://www.mzph.cn/news/752666.shtml

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

相关文章

【LeetCode热题100】24. 两两交换链表中的节点(链表)

一.题目要求 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&am…

Docker 哲学 - 容器操作 (二)

命令行启动 参数键值之间可以使 " " 或者 空格 卷的挂载是在容器创建时指定的&#xff0c;不能在容器运行时再添加 当加上 --network-alias 设置同一网络下别名参数后 &#xff0c;inspect 该容器发现 会同步到 容器信息中 2、给容器打日志 docker logs 【-…

深度学习_ResNet_5

ResNet学习目标 什么是ResNet为什么要引入ResNet&#xff1f;ResNet网络结构的特点利用ResNet完成图像分类 什么是ResNet&#xff1f; ResNet&#xff08;Residual Network&#xff09;是一种深度残差网络&#xff0c;由何凯明等人在2015年提出&#xff0c;是深度学习领域中一…

Leetcode 31. 删除无效的括号

心路历程&#xff1a; 一开始看到有点懵&#xff0c;后来发现有点像按照一定规则穷举所有可能情况&#xff0c;想到了排列组合问题&#xff0c;再结合问题长度不固定&#xff0c;无法用已知个for循环表示&#xff0c;从而想到了回溯。这个题相当于需要在一定规则下枚举。 按照…

力扣题目训练(22)

2024年2月15日力扣题目训练 2024年2月15日力扣题目训练563. 二叉树的坡度637. 二叉树的层平均值643. 子数组最大平均数 I304. 二维区域和检索 - 矩阵不可变154. 寻找旋转排序数组中的最小值 II 2024年2月15日力扣题目训练 2024年2月15日第二十二天编程训练&#xff0c;今天主要…

3月17日ACwing每日一题

1230. K倍区间 - AcWing题库 //超时写法 需要优化 //两个1e5嵌套 变成1e10了>1e8需要优化 #include <bits/stdc.h> using namespace std; const int N100007; int a[N]; int main(){int n,k;cin>>n>>k;for(int i1;i<n;i){cin>>a[i];a[i]a[i-1]…

web ui自动化测试--元素操作

一、介绍 什么是web ui自动化测试 1、通过代码来模拟人的手工操作,执行测试内容 2、自动化是为了代替重复的手工操作,提高测试效率 ui自动化的价值: 1、回归速度的对比,以前进行全量回归测试需要x天,现在有没有减少 2、负责功能测试的同事,是不是有更多的时间测试新需求…

Java面试题总结15之简述你对RPC,RMI的理解

RPC&#xff1a;在本地调用远程的函数&#xff0c;远程过程调用&#xff0c;可以跨语言实现&#xff0c;httpClient RMI&#xff1a;远程方法调用&#xff0c;Java中用于实现RPC的一种机制&#xff0c;RPC的Java版本是J2EE的网络调用机制&#xff0c;跨JVM调用对象的方法&…

Redis-2 Redis基础数据类型与基本使用

高级Redis应用进阶 一站式Redis解决方案-Redis-2 Redis基础数据类型与基本使用 源代码在GitHub - 629y/food-social-contact-parent: redis项目-美食社交APP 1. Redis基本数据类型 1.字符串&#xff08;strings&#xff09; set username zhangsan get username mset age 18 …

JAVA代理模式梳理

什么是代理模式 代理模式&#xff1a;为其他对象提供一种代理&#xff0c;用以控制对这个对象的访问&#xff1b; 我们使用代理对象&#xff0c;可以在不修改目标对象的基础上&#xff0c;增强主业务逻辑&#xff1b;比如说我们的系统中有一个登录接口&#xff0c;我们要对这个…

在数据对象中增加新的属性值,数据更新,视图不更新问题

一、原始数据 dataTable:[{aa:111} ]然后我需要再给他一个对象属性值&#xff0c;就会发现打印出来的数据是更新了&#xff0c;视图不更新&#xff0c;原因是在于在Vue实例创建时&#xff0c; dataTable.bb 并未声明&#xff0c;因此就没有被Vue转换为响应式的属性. this.dat…

ECMAscript6学习

ECMAscript6介绍 ECMA是一个浏览器脚本标准制定的公司&#xff0c;Netscape 创造了 JavaScript 由于商标原因&#xff0c; 后面ECMA公司取名ECMAscript 1 发布&#xff0c;JavaScript 也就是 ECMAscript.到现在最新的版本是6&#xff0c;简称es6. 新增let 与const let 与const …

【数据分析可视化】动态生成柱状图

import pandas as pd import matplotlib.pyplot as plt import matplotlib.ticker as ticker from matplotlib.animation import FuncAnimation import matplotlib.patches as mpatches from matplotlib.animation import FFMpegWriter# 定义一个函数&#xff0c;用于生成…

探秘酒店业黑科技:3D可视化引领管理新风尚

在信息化飞速发展的今天&#xff0c;酒店管理已不再是传统的模式所能满足。 想象一下&#xff0c;你站在一个巨大的3D地图上&#xff0c;轻轻一点&#xff0c;就能瞬间进入酒店的任何一个角落。你可以看到客房的布置、餐厅的摆设、会议室的布局……一切都如同身临其境&#xff…

shell编程中 for while until循环的使用方法及案例

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; Shell编程专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人 ————前言———— Shell脚本编程中&#xff0c;有几种常见的循环结构&#xff0c;包括for循环、while循环和until循环&#xf…

C goto 语句

C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 注意&#xff1a;在任何编程语言中&#xff0c;都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪&#xff0c;使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语…

PWM驱动舵机

PWM驱动舵机 接线图 程序结构图&#xff1a; pwm.c部分代码 #include "stm32f10x.h" // Device headervoid PWM_Init(void){// 开启时钟&#xff0c;这里TIM2是通用寄存器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// GPIO初始化代…

MATLAB中的脚本和函数有什么区别?

MATLAB中的脚本和函数是两种不同的代码组织方式&#xff0c;它们在结构、功能和使用方式上有显著的区别。以下是对这两种方式的详细解释&#xff0c;总计约2000字。 一、MATLAB脚本 MATLAB脚本是一种包含多条MATLAB命令的文件&#xff0c;这些命令按照在文件中的顺序依次执行…

2.27线性模型

可以利用无监督学习解决的问题&#xff0c;大致分为两类&#xff1a; 关联分析&#xff1a;发现不同事物之间同时出现的概率。在购物篮分析中被广泛地应用。如果发现买面包的客户有百分之八十的概率买鸡蛋&#xff0c;那么商家就会把鸡蛋和面包放在相邻的货架上。 聚类问题&a…

Java的集合类

一、集合&#xff08;Collection和Map&#xff09; &#xff08;一&#xff09;List集合&#xff08;有序&#xff0c;可重复&#xff0c;存取顺序一致&#xff09;&#xff1a; 1.概述&#xff1a; 有序的collection&#xff0c;此接口的用户可以对列表中每个元素的插入位置…