中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > java高级编程
使用零长度数组
作者:未知 时间:2005-07-24 21:15 出处:JR 责编:chinaitpower
              摘要:使用零长度数组
假定写一个过滤数据的应用程序。例如,要得到整形数组中给定范围的数据,写一个方法除去数组中不符合条件的数据,返回一个新的数组。
将如何实现这个方法呢,一种方法为:
    import java.util.*;
    
    public class ZeroDemo1 {
    
        // filter input array and throw away values 
        // that are less than minval or greater than 
        // maxval
    
        static int[] filterData(int indata[], int minval, int maxval) {
    
            // check parameters for errors 
    
            if (indata == null) {
                throw new NullPointerException("indata is null");
            }
            if (maxval < minval) {
                throw new IllegalArgumentException("maxval < minval");
            }
    
            // count number of valid values 
            // in input array
    
            int validcnt = 0;
            for (int ii = 0; ii < indata.length; ii++) {
                if (indata[ii] >= minval && indata[ii]<= maxval) {
                    validcnt++;
                }
            }
    
            // if no valid values, return null
    
            if (validcnt == 0) {
                return null;
            }
    
            // copy valid values to new array 
            // and return it
    
            int outdata[] = new int[validcnt];
            for (int ii = 0, j = 0; ii < indata.length; ii++) {
                if (indata[ii] >= minval && indata[ii] <= maxval) {
                    outdata[j++] = indata[ii];
                }
            }
            return outdata;
        }
    
        public static void main(String args[]) {
    
            // set up test array of integers
    
            int indata[] = new int[]{1, 3, -17, 8, 59};
    
            // filter out values not in the range 1-10
    
            int outdata1[] = filterData(indata, 1, 10);
            for (int ii = 0; ii < outdata1.length; ii++) {
                System.out.println(outdata1[ii]);
            }
    
            // filter out values not 
            // in the range 100-200
    
            int outdata2[] = filterData(
                                     indata, 100, 200);
            for (int ii = 0; ii < outdata2.length; ii++) {
                System.out.println(outdata2[ii]);
            }
        }
    }

filterData方法两次遍历input数组,第一次是计算有效数据的数目。根据此数据初始化一个新的数组,然后拷贝合法数据。如果没有有效的数据,方法返回null。
ZeroDemo1的执行结果为:
    1
    3
    8
    Exception in thread "main"
    java.lang.NullPointerException
        at ZeroDemo1.main(ZeroDemo1.java:72)

这是个很简单的应用,第二次调用filterData时返回了null,程序抛出了异常。

对于无有效数据的情况,有一个更好的实现方法:
    /*
    if (validcnt == 0) {
        return null;
    }
    */

如果无有效的数据,我们可以分配一个零长度的数组:

    int outdata[] = new int[0];

这是一个绝对合法的java用法。

在ZeroDemo的例子中,如果validcnt会经常是0的话,即给定数据常常都是无效数据,你可以将程序片改为:


    int outdata[] = new int[validcnt];
    if (validcnt == 0) {
        return outdata;
    }

这种用法等同于:

    int outdata[] = new int[]{};

这种用法同样是合法的,初始化一个零长度的数组。

一般情况下,返回一个null数组不是一个好的选择。当返回数组时,即使数组的长度为零,也会很大的改进你的算法。如果程序常常会返回零长度数组,为了提高效率,可以声明一个如下的静态的常数:

    private static final int[] ZERO_LENGTH_ARRAY = new int[0];

这个常数可以在所用的应用中所共用。

下面的例子,说明了零长度数组另外一个应用:

    import java.util.*;
    
    public class ZeroDemo2 {
        public static void main(String args[]) {
    
            // set up ArrayList and add strings to it
    
            List stringlist = new ArrayList();
            stringlist.add("string 1");
            stringlist.add("string 2");
            stringlist.add("string 3");
    
            // convert to String array
    
            String out[] = (String[])stringlist.toArray(new String[0]);
            for (int ii = 0; ii < out.length; ii++) {
                System.out.println(out[ii]);
            }
        }
    }

ZeroDemo2程序的运行结果:
    string 1
    string 2
    string 3

程序创建了一个ArrayList对象,并加入三个字符串。然后程序调用toArray方法。在例子中,toArray方法的参数是"new String[0]"。

想了解更多的零长度数组的内容,可以参见Joshua Bloch的著作Effective Java Programming Language Guide第27条Return zero-length arrays, not nulls
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有