服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java中数组的返回


  假定我们现在想写一个方法,同时不希望它仅仅返回一样东西,而是想返回一系列东西。此时,象c和c++这样的语言会使问题复杂化,因为我们不能返回一个数组,只能返回指向数组的一个指针。这样就非常麻烦,因为很难控制数组的“存在时间”,它很容易造成内存“漏洞”的出现。
  java采用的是类似的方法,但我们能“返回一个数组”。当然,此时返回的实际仍是指向数组的指针。但在java里,我们永远不必担心那个数组的是否可用――只要需要,它就会自动存在。而且垃圾收集器会在我们完成后自动将其清除。
  
  作为一个例子,请思考如何返回一个字串数组:
  
  //: icecream.java
  // returning arrays from methods
  
  public class icecream {
   static string[] flav = {
    "chocolate", "strawberry",
    "vanilla fudge swirl", "mint chip",
    "mocha almond fudge", "rum raisin",
    "praline cream", "mud pie"
   };
   static string[] flavorset(int n) {
    // force it to be positive & within bounds:
    n = math.abs(n) % (flav.length + 1);
    string[] results = new string[n];
    int[] picks = new int[n];
    for(int i = 0; i < picks.length; i++)
     picks[i] = -1;
    for(int i = 0; i < picks.length; i++) {
     retry:
     while(true) {
      int t =
       (int)(math.random() * flav.length);
      for(int j = 0; j < i; j++)
       if(picks[j] == t) continue retry;
      picks[i] = t;
      results[i] = flav[t];
      break;
     }
    }
    return results;
   }
   public static void main(string[] args) {
    for(int i = 0; i < 20; i++) {
     system.out.println(
      "flavorset(" + i + ") = ");
     string[] fl = flavorset(flav.length);
     for(int j = 0; j < fl.length; j++)
      system.out.println("/t" + fl[j]);
    }
   }
  } ///:~
  
  flavorset()方法创建了一个名为results的string数组。该数组的大小为n――具体数值取决于我们传递给方法的自变量。随后,它从数组flav里随机挑选一些“香料”(flavor),并将它们置入results里,并最终返回results。返回数组与返回其他任何对象没什么区别――最终返回的都是一个句柄。至于数组到底是在flavorset()里创建的,还是在其他什么地方创建的,这个问题并不重要,因为反正返回的仅是一个句柄。一旦我们的操作完成,垃圾收集器会自动关照数组的清除工作。而且只要我们需要数组,它就会乖乖地听候调遣。
  另一方面,注意当flavorset()随机挑选香料的时候,它需要保证以前出现过的一次随机选择不会再次出现。为达到这个目的,它使用了一个无限while循环,不断地作出随机选择,直到发现未在picks数组里出现过的一个元素为止(当然,也可以进行字串比较,检查随机选择是否在results数组里出现过,但字串比较的效率比较低)。若成功,就添加这个元素,并中断循环(break),再查找下一个(i值会递增)。但假若t是一个已在picks里出现过的数组,就用标签式的continue往回跳两级,强制选择一个新t。用一个调试程序可以很清楚地看到这个过程。
  main()能显示出20个完整的香料集合,所以我们看到flavorset()每次都用一个随机顺序选择香料。为体会这一点,最简单的方法就是将输出重导向进入一个文件,然后直接观看这个文件的内容。

扫描关注微信公众号