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

简介: 哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!这一节啊,咱们要学习的内容是数组的思考题讲解,也就是上一节我留下的两个小作业。

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

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

21eb44b8a29da72e8c9229077d580620.gif

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

有好处的。


回顾思考题

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变量的值。


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

————————————————

版权声明:本文为CSDN博主「剽悍一小兔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_39570751/article/details/128487668

    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);


效果:

8fbfe9c842669214041e8ed44e8e3e9b.png

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

顺便问下,还能优化吗?自然是可以的,比如我们可以用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,  ,  ,  ]

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

相关文章
|
C语言
C语言学习记录——将三位数的个十百位单独打印,并求其和。
C语言学习记录——将三位数的个十百位单独打印,并求其和。
141 4
|
编译器
[√]添加预处理的2个不同方式:target_compile_definitions / add_definitions
[√]添加预处理的2个不同方式:target_compile_definitions / add_definitions
715 0
|
缓存 移动开发 运维
mPaaS云平台运维系列之—移动发布产品介绍
实时发布服务(Mobile Delivery Service,MDS)是 mPaaS 平台的核心基础服务组件之一,提供版本升级包、热修复包、H5 离线包的管理和发布服务,同时支持开关配置、白名单、发布规则管理功能。在客户端集成实时发布服务功能后,用户可以在 mPaaS 插件中生成新的包,然后在实时发布控制台发布新包,客户端收到新包并进行升级。实时发布服务还支持通过白名单进行灰度发布,可以使用高级过滤规则,比如指定机型,来进行更精准的灰度发布。
1210 0
mPaaS云平台运维系列之—移动发布产品介绍
|
安全 Java 程序员
深入理解jvm - 类加载过程
深入理解jvm - 类加载过程
183 0
|
XML 安全 Java
Bean作用域和生命周期
Bean作用域和生命周期
|
存储 编译器 C语言
【C++】类和对象(中)
类的6个默认成员函数、运算符的重载、日期类的实现和const成员。
检测使用校准的立体摄像头拍摄的视频中的人物并确定其与摄像头的距离
检测使用校准的立体摄像头拍摄的视频中的人物,并确定他们与摄像头的距离。
301 0
|
前端开发
vue-axios异步请求
axios概述 axios是一个基于 promise 的 HTTP 库, 主要用于:发送异步请求获取数据。 常见的方法: axios(config) axios.get(url, [config])
antd组件库封装10-函数类型和类型推断
antd组件库封装10-函数类型和类型推断
164 0
antd组件库封装10-函数类型和类型推断
|
JavaScript 前端开发
JavaScript学习笔记(十四) 继承
JavaScript学习笔记(十四) 继承
173 0