<SCRIPT type=text/javascript><!--google_ad_client = "pub-2141342037947367";google_ad_width = 125;google_ad_height = 125;google_ad_format = "125x125_as";google_ad_channel ="3662469727";google_color_border = "CCCCCC";google_color_bg = "FFFFFF";google_color_link = "000000";google_color_url = "666666";google_color_text = "333333";//--></SCRIPT><SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript></SCRIPT><IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-2141342037947367&dt=1106398780593&lmt=1106398780&format=125x125_as&output=html&channel=3662469727&url=http%3A%2F%2Fwww.javaresearch.org%2Farticle%2Fshowarticle.jsp%3Fcolumn%3D544%26thread%3D2194&color_bg=FFFFFF&color_text=333333&color_link=000000&color_url=666666&color_border=CCCCCC&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=16&u_tz=480&u_his=5&u_java=true" frameBorder=0 width=125 scrolling=no height=125 allowTransparency><img height="1" width="1" border="0" src="http://pagead2.googlesyndication.com/pagead/imp.gif?client=ca-pub-2141342037947367&dt=1106398780593&lmt=1106398780&format=125x125_as&output=html&channel=3662469727&url=http%3A%2F%2Fwww.javaresearch.org%2Farticle%2Fshowarticle.jsp%3Fcolumn%3D544%26thread%3D2194&color_bg=FFFFFF&color_text=333333&color_link=000000&color_url=666666&color_border=CCCCCC&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=16&u_tz=480&u_his=5&u_java=true&event=noiframe" /></IFRAME> |
| 假定写一个过滤数据的应用程序。例如,要得到整形数组中给定范围的数据,写一个方法除去数组中不符合条件的数据,返回一个新的数组。 将如何实现这个方法呢,一种方法为: 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
|
|