如果一个Object对象可能是数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是基本类型数组,也可能是对象数组,如何将这个对象中的数组元素进行迭代,同时添加进一个集合中(我们不关心添加迭代出来的值是什么类型)。
分析:如果想将一个数组迭代添加进一个集合中,那么我们最可能想到是的使用数组工具类Arrays的asList(T…a)方法:
但是这个方法的不足之处在于,对于对象数组,可以将对象数组中的每个元素迭代添加到一个List集合中,但是对于基本类型数组,由于数组中的每个元素并不是对象,所以在返回的List集合中只是保存基本类型数组的对象(即该基本类型数组的hashcode)。
解决:
首先判断方法传入Object类型(假设对象为“items”)的参数是否真的是数组。这里要使用反射,在Class类中有“isArray”方法可以满足次需求:
接着使用数组类Array,既然是数组类,那么Array必定封装了操作数组的方法,无论是对象类型数组还是基本类型数组,这里我们要对这个对象(“items”,Object类型)进行迭代,那么只需要使用数组类Array中的getLength(Object array)方法和get(Object array, int index)即可。
代码:
public Collection setItems(Object items) {
if(items.getClass().isArray()) { Collection coll = new ArrayList();
int length = Array.getLength(items); for(int i=0;i<length;i++) {
Object value = Array.get(items, i);
coll.add(value);
}
return coll;
}else{
throw new RuntimeException("items is not Array");
}
}
应用1:
int[] arr = {1,2,3,4,5};
System.out.println(setItems(arr));
结果:[1, 2, 3, 4, 5]
应用2:
String[] arr = {"long","live","sd"};
System.out.println(setItems(arr));
结果:[long, live, sd]
从上面两个应用可以看到,在我们的方法参数设置为Object,这样做使用到了多态,因此无论我们传入的是对象类型数组还是基本类型数组都可以进行迭代。
如果一个Object对象可能是数组那么如何对其进行迭代的更多相关文章
- new一个Object对象占用多少内存?
Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况. 也许很多人都没有考虑过这 ...
- [转]new一个Object对象占用多少内存?
我们分解下ArrayList arr = new ArrayList();等同于ArrayList arr = null;//初始化arr = new ArrayList();//实例化这两个过程.初 ...
- JAVA将Object对象转byte数组
/** * 将Object对象转byte数组 * @param obj byte数组的object对象 * @return */ public static byte[] toByteArray(Ob ...
- 如果一个Object对象可能是集合或者数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是集合,包括Collection和Map,也 ...
- 【转】js判断一个object对象是否为空
判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in... 遍历属性,为真则为“非空数组”:否则为“空数组” for (var i in obj) { // 如果不为空 ...
- js判断一个 object 对象是否为空
方法一:使用for...in for...in... 遍历属性,为真则为“非空数组”:否则为“空数组” for (var i in obj) { return true // 如果不为空,则会执行到 ...
- php 分享一个object(stdclass)转数组的函数
经常调用一个借口之后 返回的内容是json串,利用php函数json_decode() 解析json串之后得到的 数据类型为object(stdclass) 这是一个对象,要取其中的内容也可以 取得, ...
- 原生JS:Object对象详细参考
Object对象详细参考 本文参考MDN做的详细整理,方便大家参考MDN JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象. 构造函数: Objec ...
- javascript ES5 Object对象
原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Obje ...
随机推荐
- ThinkPHP文件上传类
TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...
- C++ cout 如何保留小数输出
参考 : http://upliu.net/how-cout-out-2-precision.html 大家都知道用 C 语言中 printf () 函数可以非常方便控制保留 几位小数输出 不过在 C ...
- 使用Maven打包项目并上传到Linux服务器
Maven打包: 项目右键Run as-->Maven build...--> 出来下面的界面,注意红色部分的填写,Goals填写package表示打包,下面的Skip Tests表示打 ...
- Hadoop SecondaryNameNode
[转] 1.概述 光从字面上来理解,很容易让一些初学者先入为主的认为:SecondaryNameNode(snn)就是NameNode(nn)的热备进程.X 其 实不是.snn是HDFS架构中的一 ...
- JVM-如何判断一段数据是真正的数据,还是对象的引用
JVM 判断一段数据到底是数据还是引用类型,首先要看JVM选择用什么方式.通常这个选择会影响到GC的实现. 一.保守式 如果JVM选择不记录任何这种类型的数据,那么它就无法区分内存里某个位置上的数据到 ...
- 知识点3-6:HTML辅助方法
顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HT ...
- TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志
TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志 TF-IDF与余弦相似性的应用(一):自动提取关键词 作者: 阮一峰 日期: 2013年3月15日 ...
- [034] 微信公众帐号开发教程第10篇-解析接口中的消息创建时间CreateTime(转)
从微信公众平台的消息接口指南中能够看出,每种类型的消息定义中,都包括有CreateTime參数,它表示消息的创建时间,例如以下图所看到的: 上图是消息接口指南中4.1-文本消息的定义.注意Create ...
- HDU 4336 Card Collector(动态规划-概率DP)
Card Collector Problem Description In your childhood, do you crazy for collecting the beautiful card ...
- 使用链表实现队列------《数据结构与算法分析-C语言描述》
经过ubuntu的gcc验证 一.头文件 que_link.h #ifndef _QUE_LINK_H_ #define _QUE_LINK_H_ struct que_record; typedef ...