【JavaSE成神之路】数组思考题讲解

news2024/9/27 9:19:47

 

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容是数组的思考题讲解,也就是上一节我留下的两个小作业。

数组是非常重要的知识点,也是我们后续学习各种数据结构的基础,所以我们要专门抽一节出来,把那两道题目讲一讲。

有好处的。

回顾思考题

1.编写一个方法,接收一个int类型数组,返回数组内所有元素的和。

2.编写一个方法,接收一个String类型的参数,里面设置一个String类型的局部数组变量,要求每次调用该方法时,参数要均匀地分配到数组。(即实现一个简易的hash表,不考虑hash冲突问题)

第一题解法与思路

第一题还是比较简单的,只要我们熟悉了一维数组的声明和创建、以及初始化,还有循环的语法就可以轻松实现啦。

    public int sum(int[] nums){
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }

这段代码声明了一个名为sum的函数,它接受一个int类型的数组作为参数。然后在其中声明了一个名为sum的变量,初始值为0,然后使用for循环遍历数组,将每个元素的值累加到sum变量中,最后返回sum变量的值。

逻辑看起来是没有什么问题,你要让程序更健壮一些的话,可以再加个非空判断。

    public int sum(int[] nums){
        if(nums == null){
            throw new RuntimeException("参数不允许为空!");
        }
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
        }
        return sum;
    }

throw new RuntimeException的意思是抛出一个运行时异常,异常的相关知识我们会在后面的章节学到。

测试:

public static void main(String[] args) {
    Test test = new Test();
    int sum = test.sum(new int[]{1, 2, 3, 4});
    System.out.println(sum);
}

答案是10

因为sum方法是写在Test类里面的,所以要调用方法就先得把class给new出来。

如果你传个null进去,就会报错:

int sum = test.sum(null);

效果:

为什么不能传空呢,大家可以看着代码,思考一下这个问题?

顺便问下,还能优化吗?自然是可以的,比如我们可以用Java8的Stream来做简化:

public int sum(int[] nums){
    if(nums == null){
        throw new RuntimeException("参数不允许为空!");
    }
    return IntStream.of(nums).sum();
}

具体来说,代码中使用了 Java 8 中的 IntStream 类的 of 方法来将数组转换成一个整型流,然后使用 sum 方法对流中的元素求和,并将结果返回。

第二题解法与思路

开始第二题,编写一个方法,接收一个String类型的参数,里面设置一个String类型的局部数组变量,要求每次调用该方法时,参数要均匀地分配到数组。(即实现一个简易的hash表,不考虑hash冲突问题)

简单来说,就是你给我一个Sring对象,我要根据某种规则均匀地放置到数组中!

比如我有个长度为10的数组,接收一个“Hello”字符串,我们首先要根据Hash算法得出一个数字,也就是HashCode,然后用取模运算得到数组的下标。

代码大概长这样:

public void distributeString(String str) {
    // 定义一个局部数组变量
    String[] arr = new String[10];

    // 计算 str 的哈希值
    int hash = str.hashCode();
    // 计算 str 在数组中的下标
    int index = hash % arr.length;

    // 将 str 分配到数组的对应位置
    arr[index] = str;
}

这个方法接收一个 String 类型的参数 str。在方法内部,我们定义了一个局部数组变量 arr,并将其初始化为一个长度为 10 的数组。然后,我们使用字符串的 hashCode 方法计算出字符串的哈希值,并使用模运算计算出该字符串在数组中的下标。最后,我们将字符串分配到数组的对应位置。

这样,每次调用这个方法时,传入的字符串都会均匀地分配到数组中。

注意:这个方法只是一个简单的实现,实际上 hash 冲突是一个很常见的问题,需要使用更加复杂的算法来解决。这里只是为了给出一个基本的思路。

什么是HashCode?

Java的hashCode方法是用来获取对象的散列码的方法。散列码是一个整数,它是通过对象的属性进行计算得到的。

Java中的散列码通常用来支持哈希表(也称为散列表)这种数据结构。哈希表是一种高效的查找和插入数据的方式,它通过使用散列函数将数据映射到表中的桶(也称为桶位置)来实现。

如果两个对象的hashCode相等,那么这两个对象可能相等(但不一定相等)。如果两个对象的hashCode不相等,那么这两个对象一定不相等。

Java中的每个对象都有一个hashCode方法,因此你可以在任何对象上调用这个方法。例如,你可以在字符串上调用hashCode方法来获取字符串的散列码:

String s = "Hello, World!";
int hashCode = s.hashCode();

值得注意的是,hashCode方法的返回值并不唯一,也就是说,不同的对象可能会返回相同的散列码。因此,如果你想要判断两个对象是否相等,你应该使用equals方法,而不是使用hashCode方法。

测试distributeString方法,首先我们把数组放到成员属性中去,不然每次调用数组都被重置了。

String[] arr = {"  ","  ","  ","  ","  ","  ","  ","  ","  ","  "};

public void distributeString(String str) {

    // 计算 str 的哈希值
    int hash = str.hashCode();
    // 计算 str 在数组中的下标
    int index = hash % arr.length;

    // 将 str 分配到数组的对应位置
    arr[index] = str;

    //打印数组
    System.out.print("[ ");
    for (int i = 0; i < arr.length; i++) {
        if(i == arr.length - 1){
            System.out.print(arr[i]);
        }else
            System.out.print(arr[i] + ",");
    }
    System.out.println("]");
}

public static void main(String[] args) {
    Test test = new Test();
    test.distributeString("Hello");
    test.distributeString("world");
    test.distributeString("Java");
}

结果:

[ Hello,  ,  ,  ,  ,  ,  ,  ,  ,  ]
[ Hello,  ,world,  ,  ,  ,  ,  ,  ,  ]
[ Hello,  ,world,  ,  ,  ,Java,  ,  ,  ]

好啦,关于这两道思考题的讲解,就到这里啦。

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

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

相关文章

【MMC子系统】 一、MMC/SD/SDIO介绍

个人主页&#xff1a;董哥聊技术我是董哥&#xff0c;嵌入式领域新星创作者创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01;文章目录1、前言2、MMC/SD/SDIO介绍3、总线接口4、参考文章1、前言 该节学习Linux Kernel的MMC子系统&#xff…

JVM学习笔记(3)—— 运行时数据区—— 程序计数器、虚拟机栈、本地方法栈

程序计数器、虚拟机栈、本地方法栈都是线程私有的&#xff0c;jvm中每个线程都有一份 一、程序计数器 JVM中的程序计数器是一个与PC寄存器功能类似的逻辑结构&#xff0c;用于记录当前线程要执行的下一条jvm指令的地址&#xff0c;解释器读取到对应的jvm指令后将其翻译成机器指…

解决ubuntu(Linux)桌面/应用不插电掉帧问题

解决ubuntu(Linux)桌面/应用不插电掉帧问题 笔记本安装的ubuntu的gnome桌面&#xff0c;插电状态下触摸板动画丝滑&#xff0c;翻看浏览器文章的时候也不会有延迟掉帧的情况&#xff0c;但是离开了充电器&#xff0c;电池供电就会掉帧。 思路&#xff1a;在插电模式下&#x…

Spring Boot三种跨域解决方案与Spring Security跨域解决方案

跨域解决方案1、什么是跨域2、Spring Boot跨域解决方案1、服务端代码2、前端页面3、运行服务3、Spring Security跨域解决方案1、什么是跨域 什么是跨域&#xff0c;首先可以参考我之前写的这篇文章&#xff1a;JavaWeb跨域问题及解决方案 &#xff0c;另外我下面会做补充。 很…

unreal中actor的property replicate简单小节

首先参考的网址是官网中的&#xff1a; https://docs.unrealengine.com/5.1/en-US/multiplayer-programming-quick-start-for-unreal-engine/ unreal引擎的版本是5.1 还原的过程相对比较简单&#xff0c;主要的精力花在了编译报错和调试的过程。 属性复制的流程如下&#xff…

尚医通-MongDB简介-安装-概念-操作(十六)

目录 &#xff08;1&#xff09;MongDB-简介和安装 &#xff08;2&#xff09;MongDB-概念和操作 &#xff08;1&#xff09;MongDB-简介和安装 1、NoSQL简介 MongDB为什么要用呢&#xff1f;之前我们用MySQL数据库&#xff0c;如果数据达到一定的量级&#xff0c;或者有高…

QT 之SQLite数据库

文章目录一、windows下使用命令行方法操作db文件1、 安装sqlite2、 使用sqlite二、QT操作sqlite1、 建立数据库2、 打开数据库3 、关闭数据库4、 创建数据表5 、插入数据6、 删除表数据7、 修改表数据8、 查询数据——遍历查询、条件查询一、windows下使用命令行方法操作db文件…

计算机网络期中考试部分题目

1. &#xff08;1&#xff09;以太网帧的数据部分是IP数据报&#xff0c;只要数出相应字段所在的字节即可。由图可知以太网帧头部有6&#xff0b;6214字节&#xff0c;IP数据报首部的目的P地址字段前有4x4 16字节&#xff0c;从帧的第1字节开始数141630字节&#xff0c;得目的P…

java怎么完成输出语句

我们在前面的文章和案例中&#xff0c;其实早就知道Java是如何实现输出功能的了。没错&#xff0c;就是利用System.out.println()语句来实现的&#xff01;接下来壹哥就给大家详细解读一下这个语句的作用及其含义。 1. System 我们先来看看System是个什么东东。 System是Jav…

不推荐别的了,IDEA 自带的数据库工具就很牛逼!

MySQL 等数据库客户端软件市面上非常多了&#xff0c;别的栈长就不介绍了&#xff0c; 其实 IntelliJ IDEA 自带的数据库工具就很牛逼&#xff0c;不信你继续往下看。 本文以 IntelliJ IDEA/ Mac 版本作为演示&#xff0c;其他版本的应该也差距不大&#xff01; 1、打开数据库…

JPE驱动器维修印刷机驱动器维修JV4-380-1410

印刷机水辘/墨辘/墨斗辊电机马达驱动器维修、墨控电机驱动器维修、JPE驱动器维修。 三菱印刷机电路板维修范围&#xff1a;东洋变频器维修&#xff0c;油墨电机维修&#xff0c;水辊变频器维修&#xff0c;电眼控制板维修&#xff0c;接口板维修&#xff0c;电源维修等。 小森…

【结构型】外观模式(Facade)

目录外观模式(Facade)适用场景外观模式实例代码&#xff08;Java&#xff09;外观模式(Facade) 为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式 (Facade) 定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 适用场景 要为一个复杂子系统提…

【C++】初级面试整理

C基础 四种类型转换 static_cast&#xff1a;用于良性转换&#xff0c;一般不会导致意外发生&#xff0c;风险很低。常用于基本类型转换到 void&#xff0c;转换父类指针到子类不安全&#xff1b; const_cast&#xff1a;一般用于去掉const属性以及volatile&#xff0c;但是…

如何进行深度数据恢复?分享详细的恢复方法

有时我们会发现保存已久的照片&#xff0c;因为某些误操作导致它们消失了。通过多种方法都没有办法找回&#xff0c;这时该怎么办&#xff1f;不妨尝试下深度数据恢复的方法。它可以帮助我们找到更深层次的数据&#xff01; 一、恢复数据前的一些问题 很多人都会遇到数据丢失的…

windows环境下安装RocketMQ

文章目录前言一、下载二、环境变量配置三、启动RocketMq1.启动nameserver2.启动broker四、RocketMq控制台安装1.下载2.修改配置文件3.打包4.启动前言 环境要求&#xff1a;JDK1.8Maven 3.2x;64为操作系统 一、下载 官网下载地址&#xff1a;https://rocketmq.apache.org/zh/…

xxljob 的路由策略如何理解,他的选择逻辑是什么(小白阅读)

目录 1 需求2 路由策略2.1 第一个 FIRST2.2 最后一个 LAST2.3 ROUND 轮询2.4 RANDOM :随机2.5 CONSISTENT_HASH:一致性HASH2.6 LEAST_FREQUENTLY_USED:最不经常使用2.7 LEAST_RECENTLY_USED :最近最久未使用2.8 FAILOVER :故障转移2.9 BUSYOVER :忙碌转移1 需求 xxljob …

Ansible变量定义和使用

剧本中使用变量 在playbook中,可以直接定义变量,如下所示: vars&#xff1a;变量名变量值&#xff0c;也可以写在下一级将改成冒号空格值的形式 debug&#xff1a;debug模块&#xff0c;msg消息 引用变量&#xff1a;使用两对{{ }} vim juben.yml - hosts: allvars:bianliang…

extern关键字以及加了头文件引用的作用

0.前言 xdm&#xff0c;今天是阳了的第一天&#xff0c;昨天是高烧&#xff0c;浑身酸痛&#xff0c;今天好多了。。。祝大家健康。 推荐一首歌《不是因为寂寞才想你》。看了《阿凡达2》&#xff0c;感觉没第一部好看哎。 1.extern 之前写过一篇博客extern关键字。今天讲一下和…

fpga实操训练(ip ram和ip fifo)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 所有的fpga ip当中&#xff0c;用的最多的ip一般有pll、rom、ram和fifo。前面&#xff0c;我们讨论过了rom&#xff0c;rom相比较ram和fifo而言&am…

弹性盒子(flex)

一、什么是弹性盒子 弹性盒子是一种用于按行或按列布局元素的一维布局方法。元素可以膨胀以填充额外的空间&#xff0c;收缩以适应更小的空间。 二、flex 模型说明 主轴&#xff08;main axis&#xff09;&#xff1a; 是沿着 flex 元素放置的方向延伸的轴&#xff08;比如页…