如果你做过很多java程序,你可能对java集合类很熟悉,例如Vector和ArrayList。你可以创建一个集合并向其中增加元素:
-
-
List
lst = new
ArrayList
();
-
-
lst.add(new
Integer
(37));
在这个特殊的范例中,一个整型值37用于构造一个Integer封装类对象,然后那个对象被加入到列表。
这个简单的范例展示集合的一个基础-他们用于操纵一列对象,其中的每个对象是一个类或者接口类型。因此,一个ArrayList可以包含Object,String,Float以及Runnable类型的对象。集合类不能用于原始数据类型的列表,例如整型数组。
如果你在你的程序中使用原始类型的数组,你如何操纵它们呢?这个技巧就给你展示几个你可以使用的技术。
第一个技术是排序。java.util.Arrays类包含一套排序和查找数组的类方法,例如:
-
-
import
java.util.Arrays
;
-
-
public
class
ArrayDemo1 {
-
public
static
void
main(String
args[]) {
-
int
vec[] = {37, 47, 23, -5, 19, 56};
-
Arrays
.sort(vec);
-
for
(int
i = 0; i < vec.length
; i++) {
-
System
.out.println(vec[i]);
-
}
-
}
-
}
这个演示程序初始化一个整数数组然后调用Arrays.sort升序排序那个数组。
类似的,你可以在排完序的数组上进行二分法查找:
-
-
import
java.util.Arrays
;
-
-
public
class
ArrayDemo2 {
-
public
static
void
main(String
args[]) {
-
int
vec[] = {-5, 19, 23, 37, 47, 56};
-
int
slot = Arrays
.binarySearch(vec, 35);
-
slot = -(slot + 1);
-
System
.out.println("insertion point = "
+ slot);
-
}
-
}
这个程序有个微妙的概念,如果二分法查找失败它将返回:
-(insertion point) - 1
这
个演示程序以参数35调用查找方法,而那个参数在数组中不存在,方法返回值-4,如果这个值加一再取其负数就得到3,这就是35应该被插入到数组中的位
置,换言之,值-5, 19和23在数组中占据的位置是0,1和2。因此值35应该在索引3的位置,而37, 47以及56顺延。搜索方法并不进行实际的
插入操作而只是指出应该在何处插入。
除了排序和查找,我们还可以对原始类型数组做什么?另一个有用的技术是将一个原始数组转换为等价的对象类型数组。每个对应元素使用它们的封装器类,例如在封装数组中,37成为Integer(37)。
-
-
import
java.util.Arrays
;
-
import
java.lang.reflect.Array
;
-
-
public
class
ArrayDemo3 {
-
-
// if input is a single-dimension primitive array,
-
// return a new array consisting of wrapped elements,
-
// else just return input argument
-
-
public
static
Object
toArray(Object
vec) {
-
-
// if null, return
-
-
if
(vec == null
) {
-
return
vec;
-
}
-
-
// if not an array or elements not primitive, return
-
-
Class
cls = vec.getClass();
-
if
(!cls.isArray()) {
-
return
vec;
-
}
-
if
(!cls.getComponentType().isPrimitive()) {
-
return
vec;
-
}
-
-
// get array length and create Object output array
-
-
int
length
= Array
.getLength(vec);
-
Object
newvec[] = new
Object
[length
];
-
-
// wrap and copy elements
-
-
for
(int
i = 0; i < length
; i++) {
-
newvec[i] = Array
.get(vec, i);
-
}
-
-
return
newvec;
-
}
-
-
public
static
void
main(String
args[]) {
-
-
// create a primitive array
-
-
int
vec[] = new
int
[]{1, 2, 3};
-
-
// wrap it
-
-
Object
wrappedvec[] = (Object
[])toArray(vec);
-
-
// display result
-
-
for
(int
i = 0; i < wrappedvec.length
; i++) {
-
System
.out.println(wrappedvec[i]);
-
}
-
}
-
}
方法"toArray"的参数是一个Object对象(数组可以被赋值给一个Object引用)。如果参数是null或者代表的不是原始类型数组那么这个方法简单的返回参数值。java.lang.Class工具类用于判断参数是否是一个数组并获取数组的底层元素的类型。
一旦做完这些检查,使用java.lang.reflect.Array工具类的反射工具方法就可以获取原始数组的长度并获得数组的单个元素。Array.get获得的每个元素被返回到封装器类中,例如Integer或者Double。
最终的范例基于前面的那个并向你展示如何在数组上使用集合特性。这假设你已经有一个对象数组。
-
-
import
java.util.Arrays
;
-
import
java.util.List
;
-
-
public
class
ArrayDemo4 {
-
public
static
void
main(String
args[]) {
-
Object
vec[] = {new
Integer
(37), new
Integer
(47)};
-
List
lst = Arrays
.asList(vec);
-
lst.set(1, new
Integer
(57));
-
for
(int
i = 0; i < vec.length
; i++) {
-
System
.out.println(vec[i]);
-
}
-
}
-
}
在
这个程序中,vec是一个对象数组,包含Integer(37)和Integer(47),然后Arrays.asList被调用。它返回一个集合
(List接口类型),使用数组作为集合的后台存储。换言之,ArrayList这样的集合类型在它内部有某种存储类型去存储集合元素。在这个例子中,使
用的存储类型是作为参数传递到Arrays.asList的数组。这意味着集合方法所做的改变会被反射到底层的数组。
修改集合中的元素1导致底层的数组也改变,程序的输出是:
37
57
因此如果你有一个对象数组,你可以在它上面使用集合特性,数组自身作为底层存储。
我们也可以将集合转换为一个对象数组,例如:
Object vec[] = lst.toArray();
分享到:
相关推荐
主要介绍了Java byte数组操纵方式代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
我无法弄清楚如何创建一个数组,然后将文件中的项目实现到数组中,然后使用其他方法来操纵该数组。 当尝试通过while循环从.txt文件中读取数据并将数据插入数组时,不会使用文件中的项目填充数组。 当我打印输入时...
java 自己操纵内存减少了内存出错的可能性 D. java 还实现了真数组,避免了覆盖数据的可能 2. java语言的执行模式是: A. 全编译型 B. 全解释型 C. 半编译和半解释型 D. 同脚本语言的解释模式
集合是将多个元素组成一个单元的...Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了Java集合框架位于java.util包中
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关键字 ...
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关键字 ...
一切都是对象 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作为前台用户界面的开发语言,而后台的数据库采用MySql。
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 使用...
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 使用...
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操纵XML 实例讲解 414 通过JAVA写数据到XML里面 415 内容总结 418 独立实践 418 第二十三章:HTML基础 419 学习目标 419 知识要点 420 HTML元素 420 标签属性 420 HTML基本标签 422 标题元素 422 HTML格式 427 ...
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 使用...
2.2.3 Java中的数组 2.3 绝对不要清除对象:在大多数程序设计语言中,变量的“存在时间”(Lifetime)一直是程序员需要着重考虑的问题。变量应持续多长的时间?如果想清除它,那么何时进行?在变量存在时间上...
因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 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没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 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没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向...