ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 返回数组 假设你写了一个方法,这个方法不是返回一个元素,而是返回多个元素。对 C++/C 这样的语言来说这是很困难的,因为你无法返回一个数组,只能是返回一个指向数组的指针。这会带来一些问题,因为对数组生存期的控制变得很混乱,这会导致内存泄露。 而在 Java 中,你只需返回数组,你永远不用为数组担心,只要你需要它,它就可用,垃圾收集器会在你用完后把它清理干净。 下面,我们返回一个 **字符串** 数组: ```Java // arrays/IceCreamFlavors.java // Returning arrays from methods import java.util.*; import static onjava.ArrayShow.*; public class IceCreamFlavors { private static SplittableRandom rand = new SplittableRandom(47); static final String[] FLAVORS = { "Chocolate", "Strawberry", "Vanilla Fudge Swirl", "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", "Praline Cream", "Mud Pie" }; public static String[] flavorSet(int n) { if(n > FLAVORS.length) throw new IllegalArgumentException("Set too big"); String[] results = new String[n]; boolean[] picked = new boolean[FLAVORS.length]; for(int i = 0; i < n; i++) { int t; do t = rand.nextInt(FLAVORS.length); while(picked[t]); results[i] = FLAVORS[t]; picked[t] = true; } return results; } public static void main(String[] args) { for(int i = 0; i < 7; i++) show(flavorSet(3)); } } /* Output: [Praline Cream, Mint Chip, Vanilla Fudge Swirl] [Strawberry, Vanilla Fudge Swirl, Mud Pie] [Chocolate, Strawberry, Vanilla Fudge Swirl] [Rum Raisin, Praline Cream, Chocolate] [Mint Chip, Rum Raisin, Mocha Almond Fudge] [Mocha Almond Fudge, Mud Pie, Vanilla Fudge Swirl] [Mocha Almond Fudge, Mud Pie, Mint Chip] */ ``` **flavorset()** 创建名为 **results** 的 **String** 类型的数组。 这个数组的大小 **n** 取决于你传进方法的参数。然后从数组 **FLAVORS** 中随机选择 flavors 并且把它们放进 **results** 里并返回。返回一个数组就像返回其他任何对象一样,实际上返回的是引用。数组是在 **flavorSet()** 中或者是在其他什么地方创建的并不重要。垃圾收集器会清理你用完的数组,你需要的数组则会保留。 如果你必须要返回一系列不同类型的元素,你可以使用 [泛型](book/20-Generics.md) 中介绍的 **元组** 。 注意,当 **flavorSet()** 随机选择 flavors,它应该确保某个特定的选项没被选中。这在一个 **do** 循环中执行,它将一直做出随机选择直到它发现一个元素不在 **picked** 数组中。(一个字符串 比较将显示出随机选中的元素是不是已经存在于 **results** 数组中)。如果成功了,它将添加条目并且寻找下一个( **i** 递增)。输出结果显示 **flavorSet()** 每一次都是按照随机顺序选择 flavors。 一直到现在,随机数都是通过 **java.util.Random** 类生成的,这个类从 Java 1.0 就有,甚至更新过以提供 Java 8 流。现在我们可以介绍 Java 8 中的 **SplittableRandom** ,它不仅能在并行操作使用(你最终会学到),而且提供了一个高质量的随机数。这本书的剩余部分都使用 **SplittableRandom** 。