`
dianziermu
  • 浏览: 137481 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

操纵java数组

    博客分类:
  • J2SE
阅读更多

如果你做过很多java程序,你可能对java集合类很熟悉,例如Vector和ArrayList。你可以创建一个集合并向其中增加元素:

  1.     List  lst = new  ArrayList ();
  2.     lst.add(new  Integer (37));


在这个特殊的范例中,一个整型值37用于构造一个Integer封装类对象,然后那个对象被加入到列表。

这个简单的范例展示集合的一个基础-他们用于操纵一列对象,其中的每个对象是一个类或者接口类型。因此,一个ArrayList可以包含Object,String,Float以及Runnable类型的对象。集合类不能用于原始数据类型的列表,例如整型数组。

如果你在你的程序中使用原始类型的数组,你如何操纵它们呢?这个技巧就给你展示几个你可以使用的技术。

第一个技术是排序。java.util.Arrays类包含一套排序和查找数组的类方法,例如:

  1.     import  java.util.Arrays ;
  2.     public  class  ArrayDemo1 {
  3.         public  static  void  main(String  args[]) {
  4.             int  vec[] = {37, 47, 23, -5, 19, 56};
  5.             Arrays .sort(vec);
  6.             for  (int  i = 0; i < vec.length ; i++) {
  7.                 System .out.println(vec[i]);
  8.             }
  9.         }
  10.     }


这个演示程序初始化一个整数数组然后调用Arrays.sort升序排序那个数组。

类似的,你可以在排完序的数组上进行二分法查找:

  1.     import  java.util.Arrays ;
  2.     public  class  ArrayDemo2 {
  3.         public  static  void  main(String  args[]) {
  4.             int  vec[] = {-5, 19, 23, 37, 47, 56};
  5.             int  slot = Arrays .binarySearch(vec, 35);
  6.             slot = -(slot + 1);
  7.             System .out.println("insertion point = "  + slot);
  8.         }
  9.     }


这个程序有个微妙的概念,如果二分法查找失败它将返回:

    -(insertion point) - 1

这 个演示程序以参数35调用查找方法,而那个参数在数组中不存在,方法返回值-4,如果这个值加一再取其负数就得到3,这就是35应该被插入到数组中的位 置,换言之,值-5, 19和23在数组中占据的位置是0,1和2。因此值35应该在索引3的位置,而37, 47以及56顺延。搜索方法并不进行实际的 插入操作而只是指出应该在何处插入。

除了排序和查找,我们还可以对原始类型数组做什么?另一个有用的技术是将一个原始数组转换为等价的对象类型数组。每个对应元素使用它们的封装器类,例如在封装数组中,37成为Integer(37)。

  1.     import  java.util.Arrays ;
  2.     import  java.lang.reflect.Array ;
  3.     
  4.     public  class  ArrayDemo3 {
  5.     
  6.         // if input is a single-dimension primitive array,
  7.         // return a new array consisting of wrapped elements,
  8.         // else just return input argument
  9.     
  10.         public  static  Object  toArray(Object  vec) {
  11.     
  12.             // if null, return
  13.     
  14.             if  (vec == null ) {
  15.                 return  vec;
  16.             }
  17.     
  18.             // if not an array or elements not primitive, return
  19.     
  20.             Class  cls = vec.getClass();
  21.             if  (!cls.isArray()) {
  22.                 return  vec;
  23.             }
  24.             if  (!cls.getComponentType().isPrimitive()) {
  25.                 return  vec;
  26.             }
  27.     
  28.             // get array length and create Object output array
  29.     
  30.             int  length  = Array .getLength(vec);
  31.             Object  newvec[] = new  Object [length ];
  32.     
  33.             // wrap and copy elements
  34.     
  35.             for  (int  i = 0; i < length ; i++) {
  36.                 newvec[i] = Array .get(vec, i);
  37.             }
  38.     
  39.             return  newvec;
  40.         }
  41.     
  42.         public  static  void  main(String  args[]) {
  43.     
  44.             // create a primitive array
  45.     
  46.             int  vec[] = new  int []{1, 2, 3};
  47.     
  48.             // wrap it
  49.     
  50.             Object  wrappedvec[] = (Object [])toArray(vec);
  51.     
  52.             // display result
  53.     
  54.             for  (int  i = 0; i < wrappedvec.length ; i++) {
  55.                 System .out.println(wrappedvec[i]);
  56.             }
  57.         }
  58.     }


方法"toArray"的参数是一个Object对象(数组可以被赋值给一个Object引用)。如果参数是null或者代表的不是原始类型数组那么这个方法简单的返回参数值。java.lang.Class工具类用于判断参数是否是一个数组并获取数组的底层元素的类型。

一旦做完这些检查,使用java.lang.reflect.Array工具类的反射工具方法就可以获取原始数组的长度并获得数组的单个元素。Array.get获得的每个元素被返回到封装器类中,例如Integer或者Double。

最终的范例基于前面的那个并向你展示如何在数组上使用集合特性。这假设你已经有一个对象数组。

  1.     import  java.util.Arrays ;
  2.     import  java.util.List ;
  3.     public  class  ArrayDemo4 {
  4.         public  static  void  main(String  args[]) {
  5.             Object  vec[] = {new  Integer (37), new  Integer (47)};
  6.             List  lst = Arrays .asList(vec);
  7.             lst.set(1, new  Integer (57));
  8.             for  (int  i = 0; i < vec.length ; i++) {
  9.                 System .out.println(vec[i]);
  10.             }
  11.         }
  12.     }


在 这个程序中,vec是一个对象数组,包含Integer(37)和Integer(47),然后Arrays.asList被调用。它返回一个集合 (List接口类型),使用数组作为集合的后台存储。换言之,ArrayList这样的集合类型在它内部有某种存储类型去存储集合元素。在这个例子中,使 用的存储类型是作为参数传递到Arrays.asList的数组。这意味着集合方法所做的改变会被反射到底层的数组。

修改集合中的元素1导致底层的数组也改变,程序的输出是:

    37
    57

因此如果你有一个对象数组,你可以在它上面使用集合特性,数组自身作为底层存储。

我们也可以将集合转换为一个对象数组,例如:

    Object vec[] = lst.toArray();

分享到:
评论

相关推荐

    Java byte数组操纵方式代码实例解析

    主要介绍了Java byte数组操纵方式代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    ICSI-213-Project1:代码创建一个空袋子,并用.txt文件中的项目填充袋子。 然后可以操纵数组

    我无法弄清楚如何创建一个数组,然后将文件中的项目实现到数组中,然后使用其他方法来操纵该数组。 当尝试通过while循环从.txt文件中读取数据并将数据插入数组时,不会使用文件中的项目填充数组。 当我打印输入时...

    JAVA习题库及答案

     java 自己操纵内存减少了内存出错的可能性 D. java 还实现了真数组,避免了覆盖数据的可能 2. java语言的执行模式是: A. 全编译型 B. 全解释型 C. 半编译和半解释型 D. 同脚本语言的解释模式

    Java集合框架.ppt

    集合是将多个元素组成一个单元的...Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了Java集合框架位于java.util包中

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最熟悉的陌生人:main()方法 229 9.4.1 main()方法的参数 229 9.4.2 static关键字 232 9.4.3 当方法遇到static关键字 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最熟悉的陌生人:main()方法 229 9.4.1 main()方法的参数 229 9.4.2 static关键字 232 9.4.3 当方法遇到static关键字 ...

    Thinking in java4(中文高清版)-java的'圣经'

    一切都是对象 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.2.1 存储到什么地方 2.2.2 特例:基本类型 2.2.3 Java中的数组 2.3 永远不需要销毁对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 创建新的数据类型:类 ...

    JAVA综合课程设计 学生宿舍管理系统

    学生宿舍管理系统的开发主要包括前台用户...而对于前端应用程序的开发则要求应用程序能提供强大的数据操纵功能,界面友好、使用简单方便等特点。本系统采用java作为前台用户界面的开发语言,而后台的数据库采用MySql。

    java 编程入门思考

    2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...

    Java初学者入门教学

    2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...

    java程序设计实验指导代码

    15.2 实验1 操纵URL以访问网络资源 15.3 实验2 一个网络交互式汇率转换程序 15.4 实验3 基于TCP/IP的Socket通信 第16章 多媒体技术 16.1 预备知识 16.2 实验1 文字滚动条 16.3 实验2 幻灯片的定制和显示 16.4 ...

    Java语言基础下载

    JAVA操纵XML 实例讲解 414 通过JAVA写数据到XML里面 415 内容总结 418 独立实践 418 第二十三章:HTML基础 419 学习目标 419 知识要点 420 HTML元素 420 标签属性 420 HTML基本标签 422 标题元素 422 HTML格式 427 ...

    java联想(中文)

    2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...

    Java编程思想(完整版)

    2.2.3 Java中的数组 2.3 绝对不要清除对象:在大多数程序设计语言中,变量的“存在时间”(Lifetime)一直是程序员需要着重考虑的问题。变量应持续多长的时间?如果想清除它,那么何时进行?在变量存在时间上...

    java web,毕业设计.zip

    因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向...

    Thinking in Java 中文第四版+习题答案

    2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...

    毕业设计 健身房管理系统 java后端.zip

    因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向...

    JAVA_Thinking in Java

    2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的作用域 2.4 新建数据类型:类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用...

    基于java的校园二手交易系统毕业设计.zip

    因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向...

Global site tag (gtag.js) - Google Analytics