【算法与数据结构】2 梅开二度,线性查找的究极优化

news2024/11/17 3:39:48

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越

在这里插入图片描述

线性查找的究极优化

  • 1.前言
  • 2.泛型
    • 1.1粗略介绍泛型类
    • 1.2使用泛型方法
      • 1.2.1 mian()调用search()出错
      • 1.2.2 解析正确代码
  • 3 `==`or`equals`

1.前言

在上篇文章中,详细讲述了线性查找法并且对其进行了初步的优化:1️⃣使用static将方法写成一个静态的方法,2️⃣为了避免用户创造类的对象,将勾走凹函数声明为私有的。👉传送门:💖详解什么是算法?什么是线性查找法?💖

对于前面讲的线性查找法,它仍然存在一些需要改进的地方——当时的代码传入的是一个int型的数组,并且查找的元素也是一个int型,这些写完后,我们只可以在int型数组中查找一个int型的元素,但是在java中即使是基本类型也有8种,我们不可能对每一种类型都写一个线性查找的方法,这不是我们所希望的,不断重复写一个方法既不合理也是我们平时需要避免的

本篇文章就是为了学会我们应该如何避免重复写一个方法——泛型,这种语言机制就是为了可以应付不同的类型,一起来学习吧👇

2.泛型

1.1粗略介绍泛型类

  • 在Java语言中最常用的使用泛型方式就是定义一个泛型类——在类定义的后面加一个尖括号,里面写一个泛型的类型相应的代表的字母:<E>,在Java标准库中, 几乎所有的容器类都是泛型类
public class LinearSearch<E>{...}

1.2使用泛型方法

  • 对于上面的LinearSearch类,在具体使用的时候,并不是使用这个类的类对象,仅仅是使用这个类中相应的search()方法,所以我们将这个类定义成泛型类是没有意义的
  • 所以,我们实现的这个线性查找的算法类LinearSearch类不应该定义成泛型类,而是应该把search这个方法定义成是一个泛型方法——在public static后面加一个尖括号,里面写一个泛型的类型相应的代表的字母
//<E> 表示这个方法将会用到一个类型,类型E具体是什么,用户在调用的时候再指定
//data数组,是E这个类型的数组
//target,要查找的元素,也是E这个类型
public static <E> int search(E[] data, E target){...}

1.2.1 mian()调用search()出错

在这里插入图片描述

  • 原因: 在Java语言中,泛型只能接受类对象,而不能接受基本数据类型,图中的data数组是int类型,属于基本数据类型
  • 解决措施: Java语言对每一种基本数据类型都做了一个对应的 包装类,基本数据类型和所对应的包装类之间可以进行互相的转换
    在这里插入图片描述
  • 结论: 有了包装类的概念,当我们使用泛型的时候,如果我们想传入的类型是基本数据类型的话,只需要相应的把基本数据类型转化成对应的包装类

1.2.2 解析正确代码

  • 1️⃣search方法,已经是泛行方法了,对于泛行方法来说,接受的数据类型是E的data数组以及E类型的target,都不能是基本数据类型int,必须是类对象
  • 2️⃣只需要将data数组的类型修改为Integer类型
public class LinearSearchGeneric {

    private LinearSearchGeneric(){}
    public static <E> int search(E[] data, E target) {
        for (int i = 0; i < data.length; i++) {
            if (data[i] == target)
                return i;    //如果找到目标,返回对应的索引值
        }
        return -1;          //如果没有找到目标,返回-1
    }

    public static void main(String[] args) {

        //准备用于查找的数组 
        //👉int类型转化成对应的包装类Integer
        Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};

        int res = LinearSearchGeneric.search(data, 16);
        System.out.println(res); //输出res

        int res2 = LinearSearchGeneric.search(data,666); //查找目标666
        System.out.println(res2);

    }
}
  • 3️⃣那为什么传入的target参数的值是16和666,并没有报错呢?
    • 在Java内部, 有一个 自动转换的机制 ,对于16而言,Java编译器知道这里应该是一个泛型类E target,对于泛型类应该是一个类对象,java语言就会自动把这个16这个基本数据类型给转换成它所对应的包装类
  • 4️⃣那为什么对于int型数组就会报错呢?
    • data是一个数组,java语言不能帮助我们自动把一个基本数据类型的数组转换成对应的包装类的数组
  • 对于老版本的Java的话,上面的main函数在调用search()的时候,应该写成LinearSearch.<Integer>search(data,16),在Java8中,<Integer>是可以省略的——我们不显示的告诉泛行方法的泛行的类型是什么
  • 在Java语言中,有一个叫做类型推断的机制——会根据传来的这个data是integer类型的数组以及16对应的包装类是integer类型,Java编译器可以自动的推断出用户调用的这个search所对应的这个泛型应该就是Integer这个类型

3 ==orequals

  • 上述代码中的if语句中判断使用的是data[i] == target,由于我们的data[i]此时已经不是一个基本数据类型,而是一个类对象,且target也是一个类对象
  • 判断两个类对象相等的时候,不应该用==, 因为 ==判断的是引用相等, 而我们在这里想判断的是值相等,应该调用equals方法
for(int i = 0; i < data.length; i ++)
	if(data[i].equals(target))
		return i;
  • ✌️那么现在,我们整个这个代码才是完全没有问题的

扩展:

  • 基于字符串进行处理的时候,对于字符串的判等使用了==可能会导致整个算法的逻辑错误
  • 在Java语言中,string字符串它是一个类,对于类对象之间的判断,一定要使用equals方法

在这里插入图片描述

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

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

相关文章

Python 中如果键不存在,则将键添加到字典

文章目录使用 not in 检查键是否存在如果字典不存在则使用 dict.get() 添加键到字典如果字典不存在&#xff0c;则使用 setdefault() 将键添加到字典中使用 not in 检查键是否存在 如果字典不存在&#xff0c;则将键添加到字典中&#xff1a; 使用 not in 运算符检查键是否不…

如何用ChatGPT写文章?只需要这3步,10倍提升写作效率

随着技术的不断进步和创新&#xff0c;我们的生活方式和工作方式也在不断变化。在日常工作中&#xff0c;越来越多的人使用人工智能和机器学习等技术提高效率减少时间成本。最近ChatGPT火出圈了&#xff0c;很多人通过使用ChatGPT提高了工作效率。那么&#xff0c;在写作领域&a…

【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点 p269 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ 1. 题目介绍&#xff08; 54. 二叉搜索树的第k大节点&#xff09; 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 【测试用例】&#xff1a; 示例 1: 示例2&…

UTONMOS:打造你的梦想,开启元宇宙无限彩排的游戏时代

有人认为&#xff0c;元宇宙不过是 VR 概念的“旧瓶换新酒式”的炒作。 有人认为&#xff0c;元宇宙是被资本和巨头绑架的另一场“游戏”。 有人认为&#xff0c;元宇宙是骗局&#xff0c;是智商税。 更多人对元宇宙的评价是“呵呵”。 媒体朋友对元宇宙的描述更具艺术性&a…

详解FreeRTOS中的软件定时器

软件定时器用于让某个任务定时执行&#xff0c;或者周期性执行。比如设定某个时间后执行某个函数&#xff0c;或者每隔一段时间执行某个函数。由软件定时器执行的函数称为软件定时器的回调函数。 参考资料&#xff1a; 《Mastering the FreeRTOS™ Real Time Kernel》——Cha…

vue2、vue3使用i18n实现国际化

一、目标效果 源码地址&#xff1a;git clone i18n-demo: vue2、vue3实现i18n国际化功能 默认语言是中文&#xff1a; 点击语言切换&#xff0c;变成英文&#xff08;这里简单设置了中文、英文两种语言&#xff09; 注意&#xff1a;vue2支持 vue-i18n 版本8.0 &#xff0c;vu…

本轮沙尘已跨过长江!这些地区请注意加强防范

气象台4月12日06时继续发布沙尘暴蓝色预警&#xff1a;受冷空气大风影响&#xff0c;预计4月12日08时至13日08时&#xff0c;新疆南疆盆地和东部、内蒙古中西部、甘肃河西和中部、宁夏、陕西中部、山西、河北、辽宁、北京、天津、山东、河南、安徽、江苏、上海、湖北中北部、浙…

漏洞利用之弱口令

漏洞利用之弱口令1.弱口令的定义2.弱口令字典生成收集用户信息&#xff0c;组成爆破字典特殊字符增强的字典生成字典生成项目3.利用 Burp Suite 进行密码爆破1.弱口令的定义 弱口令没有严格和准确的定义&#xff0c;通常认为容易被别人猜测到或被破解工具破解的口令均为弱口令…

【Mysql】mysql8.0.26解压包部署方式

版本背景&#xff1a; 操作系统&#xff1a;centos7.3 mysql版本&#xff1a;mysql-8.0.26-linux-glibc2.12-x86_64.tar 一、前期准备 1、检测操作系统自带安装的mysql和mariadb服务&#xff0c;如存在&#xff0c;需卸载 rpm -qa | grep mysql rpm -qa | grep mariadb 卸载…

vim编辑器使用

目录 vim基本概念 vim基本操作 插入模式 命令模式 移动光标 删除字符 复制剪切 替换 撤销 更改 移动指定行 底行模式 命令集 vim简单配置 vim基本概念 vim编辑器有三种模式&#xff1a; 命令模式&#xff1a;光标移动&#xff0c;字符或行移动&#x…

iTOP-RK3568开发板Android kernel移植-单独编译内核

此方法常用于 kernel 的开发和调试&#xff0c;以下的方法既编译 kernel 部分时&#xff0c; 同 时打包成 boot.img&#xff0c; 这样加快了我们开发的速度&#xff1b; 进入内核目录下&#xff0c; 输入以下命令&#xff1a; cd kernel make ARCHarm64 CC../prebuilts/cla…

Vue:axios

1、 第三方库方式&#xff0c; 基于 Promise 的 HTTP 库&#xff1a;axios &#xff08;对 XMLHttpRequest进行的封装&#xff09; 即&#xff1a; axios.get().then() 2、跨域访问 定义&#xff1a;在 a 页面中想获取 b 页面中的资源&#xff0c;如果 a 页面和 b 页面所处的协…

Java基础从入门到精通系列(一)

1、Java简介 Java语言是一种高级、并发、面向对象的计算机编程语言&#xff0c;由Sun Microsystems公司于1995年推出。Java广泛应用于Web应用程序开发、移动应用程序开发以及大型企业级应用程序的开发中。Java语言具有跨平台、安全性好、可移植性强、易学易用等优点&#xff0…

JavaSE学习进阶day04_01 Date类

第一章 Date类 首先对时间的几个补充有必要知道&#xff1a; 时间起点&#xff1a; 心得&#xff1a; 如果以后我们仅仅要展示时间&#xff0c;那么可以用Date和SimpleDateFormat&#xff08;格式化&#xff09; 如果我们要拿着两个时间进行计算&#xff0c;用Date和SimpleD…

【C++升级之路】第十二篇:模板进阶 | 非类型模板参数 模板特化 类模板的分离编译 模板优缺点总结

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;非类型模板参数&#xff0c;函数模板特化&#xff0c;类模板特化&#xff08;全特化&#xff0c;部分特化&a…

【系统集成项目管理工程师】信息系统集成专业知识

信息系统集成专业技术 一 信息系统建设 1 信息系统生命周期 立项阶段&#xff1a;即概念阶段或需求阶段&#xff0c;这一阶段根据用户业务发展和经营管理的需要&#xff0c;提出建设信息系统的初步构想&#xff0c;然后对企业信息系统的需求进行深入调研和分析&#xff0c;形…

K8s结合docker部署

原生安装步骤 安装必要的环境依赖与工具 sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release下载证书更新 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-key…

Linux基础命令-seq打印数字序列

Linux基础命令-sed流编辑器 前言 seq命令通常是用来打印一串有规律的数字&#xff0c;常与其他命令搭配使用&#xff0c;一起来看下它的用法。 一. 命令介绍 在doc文档中查看seq命令的含义 NAMEseq - print a sequence of numbers DESCRIPTIONPrint numbers from FIRST to…

4.14-4.16学习总结

多线程&#xff1a; 线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 进程&#xff1a; 进程是程序的基本执行实体 举个例子&#xff1a;360运行之后&#xff0c;它就可以看做是一个进程&#xff0c;但…

【UE4】关卡流送的demo

关卡流送功能可以将地图文件加载到内存中&#xff0c;或者从内存中卸载&#xff0c;并在游戏过程中切换地图的可视性。 这样一来&#xff0c;场景便能拆分为较小的地图块&#xff0c;并且只有相关部分才会占用资源并被渲染。 正确设置后&#xff0c;开发者便能创建大型、无缝衔…