java复杂度,包装类,泛型解析

如何衡量代码的好坏?

评价代码的好坏我们使用算法效率来判断,而算法效率分两种:

算法效率:

第一种是时间效率,第二种是空间效率,时间效率被称为时间复杂度,⽽空间效率被称作空间复杂度。 时间复杂度主要衡量的是⼀个算法的运⾏速度,⽽空间复杂度主要衡量⼀个算法所需要的额外空间,现在我们计算机的储存容量已经很高了,所以我们更加注重时间复杂度。

1.时间复杂度的概念

在 Java 中,时间复杂度是用来衡量一个算法运行所消耗时间的概念。但它并不是精确计算算法实际运行的时间,因为算法实际运行时间会受运行环境(如机器性能)、测试数据规模等因素影响。时间复杂度采用大 O 符号表示法,⼀个算法所花费的时间与其中语句的执⾏次数成正⽐例,算法中的基本操作的执⾏次数,为算法的时间复杂度。

2.解析几个常见的时间复杂度类型。

在实际中⼀般情况关注的是算法的最坏运⾏情况。

O (n) - 常数时间复杂度

import java.util.Scanner;public class TEXT {public static void main(String[] args) {int count=0;Scanner scan=new Scanner(System.in);//输入nint n= scan.nextInt();for(int i=0;i<n;i++){//复杂度为ncount++;}System.out.println(count);}
}

O (n²) - 平方时间复杂度

import java.util.Scanner;public class TEXT {public static void main(String[] args) {int count=0;Scanner scan=new Scanner(System.in);int n= scan.nextInt();for(int i=0;i<n;i++){//n*n平方复杂度for (int j=0;j<n;j++){count++;}}System.out.println(count);}

3.O(M+N)复杂度

import java.util.Scanner;public class TEXT {public static void main(String[] args) {int count=0;Scanner scan=new Scanner(System.in);int m= scan.nextInt();int n= scan.nextInt();for(int i=0;i<m;i++){//m一个O(M)复杂度count++;}for(int j=0;j<n;j++){//n一个O(N)复杂度count++;}System.out.println(count);}

4. O (log n) - 对数时间复杂度

典型的就是二分查找:

在这段代码中,每执行一次循环体,查找范围就会缩小一半。比如初始数组长度为 n ,第一次循环后查找范围变为约 n​ /2,第二次变为约 n/4​ ,以此类推。假设最多需要 k 次循环就能找到目标元素或者确定目标元素不存在,那么就有 n/2'​k=1 ,解这个等式可得 k=log2​n,

根据时间复杂度的计算规则,总的时间复杂度就是 O(logn)

import java.util.Scanner;public class TEXT {public static int  boo(int[] arr,int tag){int left=0;int right= arr.length-1;while (left<=right){int mid=left+(right-left)/2;if(arr[mid]<tag){left=mid+1;} else if (arr[mid]==tag) {return mid;}else{right=mid-1;}}return -1;}public static void main(String[] args) {int[] arr={1,3,5,7,9};System.out.println(boo(arr,5));}

5. O (n log n) - 线性对数时间复杂度

二.包装类

包装类的作用:方便在泛型中使用,泛型只能引用类型,包装类包含许多实用方法

JAVA中8种基本数据类型进行封装,处理int的Integer和char的Character其他的包装类都为自己首字母大写后的模样

基本数据类型------------->包装类类型
boolean--------------------->Boolean(true,false)

byte------------------------->Byte(-128,127)

short------------------------->Short(-128,127)

long-------------------------->Long(-128,127)

float-------------------------->Float(-128,127)

double------------------------>Double(-128,127)

int----------------------------->Integer(-128,127)

char--------------------------->Character(0~127)

装箱拆箱

装箱分为自动装箱和手动装箱,拆箱也同样分为自动和手动。

看下面这组a,b为100时代码a==b返回true,而当我们将a,b变为200时返回false。这个原因是因为对于 Integer 类型,当值在 -128 到 127 之间时,Java 会对其进行缓存,以提高性能和节省内存。a 和 b 的值是 200,不在 -128 到 127 这个缓存范围内。因此,Java 会为 a 和 b 分别创建新的 Integer 对象。a 和 b 引用的是不同的对象,所以 a == b 的比较结果为 false

泛型

为实现可应用于各种类型的代码而生

概念:泛型即参数化类型,也就是把类型当作参数传递。借助泛型,在定义类、接口或者方法时,能使用类型参数来替代具体的类型。在使用时再指定具体的类型,这样就能让同一个类、接口或方法处理不同类型的数据。

下面的代码,当我们不使用泛型时,我们在将数组内容交给ret时会显得比较鸡肋,因为我们object是父类String是子类,父类内容交给子类要强制类型转换,当我们使用时会不方便,当我们需要多组数据时,我们还要去查看需要的是什么类型的。所以这个时候我们引入了泛型类型,它可以实现各种类型代码的应用。

我们看下面两组代码:

1组未使用泛型

2.组使用了泛型

使用了泛型后当我们需要调用String类型时,直接在<>内添加我们需要的类型如<Interger><Double>注意:这里面只能是包装类不能是基本类型如int这样。

这里我们自定义一个student类型,我们可以通过使用我们student类型来new student储存到jj中

泛型擦除机制

概念:在编译时,java编译器会把泛型的信息从泛型中移除,这就是泛型的擦除机制。

观察上面这段代码我们可以发现即使我们的两个list使用的泛型类型不同,在编译运行时我们还是可以返回true,这就是因为我们泛型类型的擦除效果。下面我们去看看他们的原始类型是什么:

我们通过代码的运行发现我们list1和list2原始类型都为ArrayList并没有携带具体的储存数据类型,而我们泛型擦除后大多数情况将泛型替换成边界或Object。

泛型的上界

泛型是没下界的,我们泛型在定义时有时候需要对传入的数据变量做一定的约束,我们就会用到泛型的边界约束。

class qq<t extends Number> 

像这样就是一种约束,我们泛型继承了Number,t是Number的子类,也可以是Number。

我们创建了一个找最大数的代码类qq,我们的qq继承了Comparable接口,当我们再创建animal类时,我们qq去使用了这个animal类会出现提醒让我们去实现Comparable接口,因为qq的泛型是继承了Comparable的。这也就进行了约束作用。

class qq<t extends Comparable<t>> {public t findmaxvalue(t[] Array) {t max = Array[0];for (int i = 1; i < Array.length; i++) {if (max.compareTo(Array[i]) < 0) {max = Array[i];}}return max;}
}
class animal{}
public class TEXT {public static void main(String[] args) {qq<Integer> K = new qq<>();Integer[] Array = {1, 2, 3, 4, 5, 6, 7, 8, 9};int p = K.findmaxvalue(Array);System.out.println(p);qq<animal> d=new qq<animal>();}
}

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

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

相关文章

基于 SpringBoot + Vue 的校园管理系统设计与实现

一、项目简介 本系统以校园组织管理为主线&#xff0c;结合用户权限分离机制与模块化设计&#xff0c;实现对“单位类别、单位、通知推送、投票信息、用户回复”等内容的全流程管理&#xff0c;广泛适用于教育局、高校及下属组织的信息管理工作。 &#x1f3af; 项目亮点&…

iOS蓝牙技术实现及优化

以下是针对2025年iOS蓝牙技术实现的核心技术要点的深度解析&#xff0c;结合当前iOS 18&#xff08;推测版本&#xff09;的最新特性与开发实践&#xff0c;分模块结构化呈现&#xff1a; 一、硬件与协议层适配 BLE 5.3 支持 iOS 18默认支持蓝牙5.3协议&#xff0c;需注意&…

Qt 中实现观察者模式(Observer Pattern)

在 Qt 中实现**观察者模式(Observer Pattern)通常利用其内置的信号与槽(Signals & Slots)**机制,这是最符合 Qt 设计哲学的方式。以下是详细实现方法和关键点: —### 1. 观察者模式的核心思想- Subject(被观察者):维护一个观察者列表,在状态变化时通知观察者。- …

写程序,统计两会政府工作报告热词频率,并生成词云

import jieba from collections import Counter from wordcloud import WordCloud import matplotlib.pyplot as pltdef generate_wordcloud():try:# 读取文本文件with open(E:\\桌面\\s.txt, r, encodingutf-8) as file:text file.read()# 中文分词words jieba.lcut(text)# …

【Science Advances】普林斯顿大学利用非相干光打造可重构纳米光子神经网络

(导读 ) 人工智能对计算性能需求剧增&#xff0c;电子微处理器发展受功耗限制。光学计算有望解决这些问题&#xff0c;光学神经网络&#xff08;ONNs&#xff09;成为研究热点&#xff0c;但现有 ONNs 因设计缺陷&#xff0c;在图像分类任务中精度远低于现代电子神经网络&#…

gin + es 实践 01

项目结构说明 目录结构概览 Go-ES 项目采用领域驱动设计&#xff08;DDD&#xff09;架构&#xff0c;目录结构清晰&#xff0c;各层次职责分明。以下是项目的主要目录结构&#xff1a; go-es/ ├── cmd/ # 应用程序入口 │ └── api/ …

如何构建直播美颜SDK?从美颜API调用逻辑到GPU优化实战

随着短视频和直播行业的爆发&#xff0c;美颜SDK已成为各大直播平台的“标配”。从基础的磨皮、美白&#xff0c;到如今的AI滤镜、虚拟形象&#xff0c;这些功能的背后都离不开高效的美颜SDK支持。那么&#xff0c;如何构建一款性能优越、体验流畅的直播美颜SDK呢&#xff1f;本…

高组装导轨的特点

高组装导轨通常是四列式单圆弧齿形接触直线导轨&#xff0c;具有整合化的结构设计&#xff0c;适用于重负荷和精密应用。与其它直线导轨高组装导轨提升了负荷与刚性能力&#xff0c;具备四方向等负载特色和自动调心功能&#xff0c;能够吸收安装面的装配误差&#xff0c;达到高…

2025-05-07-FFmpeg视频裁剪(尺寸调整,画面比例不变)

原比例如图 原比例如图裁剪后的比例 代码&#xff1a; 方法一&#xff1a;极速 ffmpeg -i input.mp4 -vf "crop1080:750:0:345" -c:v libx264 -preset ultrafast -c:a copy output.mp4关键参数说明&#xff1a; vf “crop宽:高❌y”&#xff1a;定义裁剪区域。 …

一个.Net开源的协作办公套件,包括文档、表格、演示文稿和表单

从零学习构建一个完整的系统 推荐一个开源的文档协作办公套件&#xff0c;可以很好的满足团队对方便、高效、安全的方式来处理文档工作&#xff0c;促进团队协作和信息共享。 项目简介 ONLYOFFICE 是一个开源的办公套件&#xff0c;包括文档、表格、演示文稿和表单等应用程序…

虚幻基础:硬件输入

文章目录 triggered&#xff1a;按下一直触发 等于tickcompleted&#xff1a;必须等到triggered结束后 才触发松下triggered结束 默认按键触发顺序按下&#xff1a;触发两个先 Started后 Triggered 松开Completed 触发器&#xff1a;用于修改triggered 触发和结束驱动阈值&…

Python中的global与nonlocal关键字详解

一、前言 在Python编程中&#xff0c;变量作用域是一个非常重要的概念。对于初学者来说&#xff0c;经常会遇到在函数内部无法修改外部变量的问题。这时候&#xff0c;global和nonlocal关键字就能派上用场了。本文将详细介绍这两个关键字的用法、区别以及适用场景&#xff0c;…

vue-qr生成的二维码增加下载功能

大家好&#xff01;今天给大家分享一个超实用的前端小技巧——如何在 Vue 项目中生成二维码并实现下载功能。这个功能在分享链接、活动推广等场景特别有用&#xff0c;一起来学习吧&#xff01; &#x1f50d; 功能预览 使用 vue-qr 生成美观二维码点击按钮即可下载 PNG 格式的…

嵌入式C进阶路线指南

嵌入式是工科&#xff0c;工科讲究实践。说的再多、懂得再多&#xff0c;不能做出实际的东西&#xff0c;是没有意义的。学习嵌入式的核心原则之一就是多动手写代码。另外还有一个原则就是&#xff1a;从浅到深学习。接下来的内容将贯彻这两个原则。最后强调一点&#xff0c;各…

服务器上机用到的设备

服务器上机通常需要以下硬件设备&#xff1a; 服务器主机&#xff1a; CPU&#xff1a;选择高性能的多核处理器&#xff0c;如英特尔至强&#xff08;Xeon&#xff09;系列或AMD EPYC系列&#xff0c;以满足高并发和多任务处理需求。 内存&#xff08;RAM&#xff09;&#xf…

FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法

起因&#xff1a;涡轮蜗轴的组合&#xff0c;是一种比较简单且高效的传动结构。可以实现减速、加速、转动角度的放大、缩小等应用。 如何绘制呢&#xff1f;我搜索了不少教程&#xff0c;看起来都挺复杂的&#xff0c;对于小白来说有点像天书。这里介绍和记录一下利用FreeCAD 的…

daplink开发_一次开发DAPLink的详细开发流程及调试步骤

以下是针对第一次开发DAPLink的详细开发流程及调试步骤,结合STM32平台特性,分阶段指导您完成从零到一的完整开发过程: 一、开发流程1. 硬件准备阶段选型STM32芯片:推荐型号:STM32F103C8T6(成本低、资源足够)、STM32F405RGT6(性能更强,支持更多外设)。关键外设需求:U…

给小白的AI Agent 基本技术点分析与讲解

引言&#xff1a;重塑交互与自动化边界的 AI Agent 在人工智能技术飞速发展的浪潮中&#xff0c;AI Agent&#xff08;智能体&#xff09;概念的兴起标志着自动化和人机交互正迈向一个全新的阶段。传统的软件系统通常被设计来执行精确预设的指令序列&#xff0c;它们强大且高效…

Mysql常用语句汇总

Mysql语句分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据…

【Python 模块】

Python 中的模块&#xff08;Module&#xff09;是组织代码的核心方式&#xff0c;通过将相关函数、类和变量封装到独立文件中&#xff0c;实现代码复用和结构化管理。以下是模块的核心知识点&#xff1a; 一、基础概念 1. 模块定义 任何 .py 文件都是一个模块模块名即文件名…