再谈谈java 数组
来源:互联网 发布:软件设计师下午试题 编辑:程序博客网 时间:2024/06/05 06:44
之所以写一篇专门的文章来说明这个java中的数组,是因为我对此并不熟悉,所以我要系统的来梳理下我所学到的,并在此基础
上进行深入一点的研究.好吧,闲话少说!
首先还是从最基础的讲起.
1,定义:
String这个类最常用不过了,基本上你写的每个类都有它的身影.但是我们看它的源代码就知道其实这个类只是基于char[]
的操作的封装而已.之所以说这个我是想说数组对于java很好很重要.
从很多书上都讲了关于数组的定义和初始化.
int[] a; //定义一个int型数组
String[] arrStr = new String[3]; //定义了一个字符串数组,长度为3,每个元素为null
也就是说这句运行完了后 arrStr[0] = null, arrStr[2] = null, 如果你写了句 String a = arrStr[3];那么你会获得一个
"java.lang.ArrayIndexOutOfBoundsException: 3 "异常.
2,初始化:
先看例子:
String[] arrStr = new String[3];
for (int i=0; i<arrStr.length; i++)
arrStr[i] = "hello";
其实定义和初始化可以放在一句里面.
int[] a = new int[]{1,2,4};
String[] strs = new String[]{"hello","world","everyone"}; //或者直接String[] strs = {"abc","efg","hij","hh"};
但是看这里的函数
public String[] getArrays() {
return {"hello","world"};
}
有问题,如果你在eclipse里面写的该代码,你肯定知道,因为编辑器知道错了,你得改正.如果是记事本或editplus就必须要编译
的时候才知道了.
编译的时候会抛出下面的异常
LotteryDrawing.java:7: illegal start of expression
return {"hello","world"};
^
1 error
必须改为 return new String[]{"hello","world"}; //注意这里的[]中一定不要填上2或者别的数字
原因???
今天 和何同事讨论下,他说是返回的时候并不知道 {"hello","world"}是什么类型的,
而定义的时候是明确指定的左边的类型的String[] strs = {"abc","efg","hij","hh"};
-------------------------------------------------------------------------------------------
3,动态数组:
在实际编码过程中,我们要返回一个数组类型,但是函数逻辑是不确定该数组到底有多长,这种情况你是怎么做的呢?
我是这样解决的:
这段代码的意思是返回字符串str中符合正则表达式regex的子串数组
4,操作:
说到操作数组的利器莫过于Arrays这个类了.
二分搜索法binarySearch函数,填充fill函数,升序排序sort函数,另外java5 中新增加一个工具函数toString(T []);这个函数对于
我们写测试代码很有用,把一个数组转换成字符串[a,b,c].
如果使用java.1.4的朋友可以看下1.5的代码自己写个工具类来打印数组了,不用老是写个循环来打印了,注意1.4是没有StringBuilder
这个类的,使用StringBuffer来代替即可
/**********************************************************************************/
/***********************************比较*******************************************/
/**********************************************************************************/
上面两段代码很有意思,你可以看看他们是如何处理最后一个","的问题的.
我在没有看源代码之前是这样写的:
比较以上三种代码,窃以为算toString(Object[] obj)最差,因为每个循环里面都作了判断,但是我写的代码中多了个delete函数
不论是delete还是 deleteCharAt,里面都进行了数组的拷贝(查看源代码知道的),无疑也是落了下乘.最好的代码莫过于
toString(int[] a)了,或者说这种循环的思想最perfect.值得学习!!!
5,数组拷贝
请尽量使用System.arraycopy()函数,特别是大的数组,方便高效,从下面的程序可以看出
运行结果 : 71 40
因为定义 public static native void arraycopy(...)这个函数是一个本地的函数,速度更快。
关于本地方法的一些知识参考:
http://www.80x86.cn/article.asp?id=1448
上进行深入一点的研究.好吧,闲话少说!
首先还是从最基础的讲起.
1,定义:
String这个类最常用不过了,基本上你写的每个类都有它的身影.但是我们看它的源代码就知道其实这个类只是基于char[]
的操作的封装而已.之所以说这个我是想说数组对于java很好很重要.
从很多书上都讲了关于数组的定义和初始化.
int[] a; //定义一个int型数组
String[] arrStr = new String[3]; //定义了一个字符串数组,长度为3,每个元素为null
也就是说这句运行完了后 arrStr[0] = null, arrStr[2] = null, 如果你写了句 String a = arrStr[3];那么你会获得一个
"java.lang.ArrayIndexOutOfBoundsException: 3 "异常.
2,初始化:
先看例子:
String[] arrStr = new String[3];
for (int i=0; i<arrStr.length; i++)
arrStr[i] = "hello";
其实定义和初始化可以放在一句里面.
int[] a = new int[]{1,2,4};
String[] strs = new String[]{"hello","world","everyone"}; //或者直接String[] strs = {"abc","efg","hij","hh"};
但是看这里的函数
public String[] getArrays() {
return {"hello","world"};
}
有问题,如果你在eclipse里面写的该代码,你肯定知道,因为编辑器知道错了,你得改正.如果是记事本或editplus就必须要编译
的时候才知道了.
编译的时候会抛出下面的异常
LotteryDrawing.java:7: illegal start of expression
return {"hello","world"};
^
1 error
必须改为 return new String[]{"hello","world"}; //注意这里的[]中一定不要填上2或者别的数字
原因???
今天 和何同事讨论下,他说是返回的时候并不知道 {"hello","world"}是什么类型的,
而定义的时候是明确指定的左边的类型的String[] strs = {"abc","efg","hij","hh"};
-------------------------------------------------------------------------------------------
3,动态数组:
在实际编码过程中,我们要返回一个数组类型,但是函数逻辑是不确定该数组到底有多长,这种情况你是怎么做的呢?
我是这样解决的:
- public static String[] getMatch(String str, String regex) {
- if (str == null || str.length() == 0)
- return null;
- if (regex == null || regex.length() == 0)
- return new String[]{str};
- ArrayList list = new ArrayList();
- Pattern p = Pattern.compile(regex);
- Matcher m = p.matcher(str);
- while(m.find()) {
- String s = m.group();
- list.add(s);
- }
- String[] a= new String[list.size()];
- list.toArray(a);
- return a;
- }
这段代码的意思是返回字符串str中符合正则表达式regex的子串数组
4,操作:
说到操作数组的利器莫过于Arrays这个类了.
二分搜索法binarySearch函数,填充fill函数,升序排序sort函数,另外java5 中新增加一个工具函数toString(T []);这个函数对于
我们写测试代码很有用,把一个数组转换成字符串[a,b,c].
如果使用java.1.4的朋友可以看下1.5的代码自己写个工具类来打印数组了,不用老是写个循环来打印了,注意1.4是没有StringBuilder
这个类的,使用StringBuffer来代替即可
/**********************************************************************************/
- public static String toString(Object[] a) {
- if (a == null)
- return "null";
- if (a.length == 0)
- return "[]";
- StringBuilder buf = new StringBuilder();
- for (int i = 0; i < a.length; i++) {
- if (i == 0)
- buf.append('[');
- else
- buf.append(", ");
- buf.append(String.valueOf(a[i]));
- }
- buf.append("]");
- return buf.toString();
- }
/***********************************比较*******************************************/
- public static String toString(int[] a) {
- if (a == null)
- return "null";
- if (a.length == 0)
- return "[]";
- StringBuilder buf = new StringBuilder();
- buf.append('[');
- buf.append(a[0]);
- for (int i = 1; i < a.length; i++) {
- buf.append(", ");
- buf.append(a[i]);
- }
- buf.append("]");
- return buf.toString();
- }
/**********************************************************************************/
上面两段代码很有意思,你可以看看他们是如何处理最后一个","的问题的.
我在没有看源代码之前是这样写的:
- public static String toString(int[] a) {
- if (a == null)
- return "null";
- if (a.length == 0)
- return "[]";
- StringBuffer buf = new StringBuffer();
- buf.append('[');
- for (int i = 0; i < a.length; i++) {
- buf.append(a[i]);
- buf.append(", "); //有两个字符
- }
- int len = buf.length();
- if (len > 1){
- buf.delete(len-2,len);
- //上面一行可以用这两句来替代 buf.deleteCharAt(len-2); buf.deleteCharAt(len-1);
- }
- buf.append("]");
- return buf.toString();
- }
比较以上三种代码,窃以为算toString(Object[] obj)最差,因为每个循环里面都作了判断,但是我写的代码中多了个delete函数
不论是delete还是 deleteCharAt,里面都进行了数组的拷贝(查看源代码知道的),无疑也是落了下乘.最好的代码莫过于
toString(int[] a)了,或者说这种循环的思想最perfect.值得学习!!!
5,数组拷贝
请尽量使用System.arraycopy()函数,特别是大的数组,方便高效,从下面的程序可以看出
- class AtoS{
- public void copy1(String[] src) {
- String[] d = new String[src.length];
- int len = src.length;
- for (int i=0; i<len; i++){
- d[i] = src[i];
- }
- //System.out.println(toString(d));
- }
- public void copy2(String[]src) {
- String[] d = new String[src.length];
- int len = src.length;
- System.arraycopy(src, 0, d, 0, len);
- //System.out.println(toString(d));
- }
- public static void main(String[] args) {
- String[] src = new String[1000000];
- Arrays.fill(src, "hello");
- AtoS as = new AtoS();
- long time = System.currentTimeMillis();
- as.copy1(src);
- long a = System.currentTimeMillis() - time;
- time = System.currentTimeMillis();
- as.copy2(src);
- long b = System.currentTimeMillis() - time;
- System.out.println(a + " " + b);
- }
- }
运行结果 : 71 40
因为定义 public static native void arraycopy(...)这个函数是一个本地的函数,速度更快。
关于本地方法的一些知识参考:
http://www.80x86.cn/article.asp?id=1448
- 再谈谈java 数组
- 谈谈Java中数组
- 谈谈数组
- 谈谈JAVA的数组(数组是对象吗?)
- 再谈谈java的单例模式
- 谈谈C#中的六大数组
- 谈谈Java的学习方法
- JAVA:谈谈Thread Pool
- 谈谈Java中的类
- 谈谈LAMP与Java
- 谈谈java 反射机制
- 谈谈"Java架构"
- Java: 谈谈Thread Pool
- 谈谈java中的WeakReference
- 谈谈java中的WeakReference
- 谈谈Java的优点
- 谈谈java 集合框架
- 谈谈Java的对象
- java 处理excel
- 运行时改变控件大小和位置
- Jfreechart中文API解释
- [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket 错误
- MySQL数据类型及列类型
- 再谈谈java 数组
- 二、Struts 2的类型转换---1.Struts 2中实现自定义的类型转换
- 老赵弱弱学习——unix环境高级编程(十)
- Pentaho BI源代码下载及tomcat-pci-test版本的编译
- 2009年的计划
- 老赵弱弱学习——unix环境高级编程(十一)
- 要使用ORM吗?那么用对象去思考吧
- rdlc报表使用详细方法
- 09年1月10日突然想起学Flash CS4 ActionScript3