哈喽,我是兔哥呀,今天就让我们继续这个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]);}elseSystem.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, , , ]
好啦,关于这两道思考题的讲解,就到这里啦。