【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,  ,  ,  ]

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

相关文章
|
Cloud Native Dubbo NoSQL
金九银十最新一线大厂 Java 面试题大全1000+ 面试题附答案详解
纵观今年的技术招聘市场, Java 依旧是当仁不让的霸主 !即便遭受 Go 等新兴语言不断冲击,依旧岿然不动。究其原因: Java 有着极其成熟的生态,这个不用我多说; Java 在 运维、可观测性、可监 控性方面都有着非常优秀的表现; Java 也在积极 应对容器化、云原生等大趋势,比如 Spring Boot 就已经全面拥抱云原生。 企业对 Java 的需求最大 ,Java 程序员的群体也最为庞大,有着 1200 万之多 ,彼此之间都有更多的选择。 换句话说,也是最修罗场的! 所以,要想拿下心仪的 Offer ,咱就一定要做好准备,把那些必考点、套路都给吃透了! 我拉来几
93 0
|
消息中间件 缓存 NoSQL
牛皮了!阿里面试官终于分享出了2023年最新的java面试题及答案
今天给大家分享一波阿里面试官分享的2023年最新的java面试题以及答案,喜欢的小伙伴可以学习一下! 包含的内容比较多,也比较全,主要包括:消息队列ActiveMQ、分布式缓存 Redis + Memcached、Java高级必备的Netty、Java面试必备的设计模式、Java经典的List、Java经典的Main、Java多线程、消息队列Kafka、非常牛逼的Nginx、顶尖的Spring Boot、JVM面试题、高级Java面试题、史上最全Redis面试题、Elastic Search、Mysql等等面试题!
|
消息中间件 缓存 Java
经过阿里四面而形成的10万字java面试题及答案文档到底有多牛?
首先,给大家介绍一波小伙伴的阿里java岗四面问到的面试题问题分享,大家可以仔细来看看! 一面,问了数据结构、jvm、锁等~
【JavaSE成神之路】流程控制语句
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是流程控制语句。
126 0
|
Java 编译器
【JavaSE成神之路】可变参数
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java的可变参数。
|
存储 Java 索引
黑马全套Java教程(八):集合进阶(中)
黑马全套Java教程(八):集合进阶
61 0
黑马全套Java教程(八):集合进阶(中)
|
存储 Java 索引
黑马全套Java教程(八):集合进阶(上)
黑马全套Java教程(八):集合进阶
70 0
黑马全套Java教程(八):集合进阶(上)
|
存储 Java
黑马全套Java教程(八):集合进阶(下)
黑马全套Java教程(八):集合进阶
74 0
黑马全套Java教程(八):集合进阶(下)