如果你做过很多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数组操纵方式代码实例解析,通过示例代码详细介绍了Java byte数组的操纵方式,涵盖了字节数组的基本概念、字节数组的操作方法、ByteArrayInputStream和ByteArrayOutputStream的使用等方面。...
我无法弄清楚如何创建一个数组,然后将文件中的项目实现到数组中,然后使用其他方法来操纵该数组。 当尝试通过while循环从.txt文件中读取数据并将数据插入数组时,不会使用文件中的项目填充数组。 当我打印输入时...
在本文中,我们将深入探讨如何使用Java语言操纵Windows注册表。为了实现这一目标,我们将使用Java标准库中的用户首选项API,并通过JNI(Java Native Interface)调用Windows原生API来实现更底层的操作。 首先,Java...
java自己操纵内存减少了内存出错的可能性 - D. java还实现了真数组,避免了覆盖数据的可能 **解析:** 鲁棒性是指系统在异常情况下仍能保持一定功能的特性。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支持一维数组和多维数组。 - **声明数组**:指定数组的类型和名称。 - **创建数组**:使用`new`关键字分配内存空间。 - **初始化数组**:为数组中的元素赋值。 - **多维数组**:数组的数组。 - **数组拷贝**:...
集合是将多个元素组成一个单元的...Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了Java集合框架位于java.util包中
1. **反射**:Java反射允许在运行时访问类的信息,并创建和操纵对象。 2. **注解**:用于给程序元素添加元数据,可以被编译器、工具或运行时系统处理。 3. **泛型**:泛型提供了一种类型安全的方法来指定集合或其他...
此外,你还会接触到赋值运算符、位运算符等,这些都会帮助你更好地操纵和操作数据。 "第4章—程序设计中的流程控制"深入讲解如何控制程序的执行流程。除了上文提到的if和循环,这一章可能还会涉及switch语句、break...
指令集部分为Java虚拟机中的指令分类,并简述了它们的用途,例如加载和存储指令、算术指令、类型转换指令、对象创建与操纵指令、操作数栈管理指令、控制转移指令、方法调用与返回指令以及异常处理指令等。...
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.awt.image 包处理和操纵来自于网上的图片的Java工具类库,包括图像处理、图像resize和图像滤镜等方法。 7. java.awt.peer 包 java.awt.peer 包提供了 peer-to-peer 的通信模型,允许不同的Java程序在不同的软...
Java的`File`类用于文件和目录路径名的操纵,而`FileInputStream`和`FileOutputStream`则分别用于读写文件。在这个系统中,我们创建`FileOutputStream`实例来写入序列化的图书对象,同时用`FileInputStream`实例读取...
对于数组,Java 会把数组的所有元素初始化为其相应类型的默认值。 9.数组遍历的三种方法: for 循环、for-each 语句遍历、迭代器 Iterator 遍历。 10.强制类型转换的条件: 强制类型转换需要父类和子类之间存在...
Java基础语法是学习Java的起点,包括数据类型、运算符、控制流程(if、switch、循环等)、数组和类等。Java是一种面向对象的编程语言,理解面向对象的概念如继承、封装、多态对于深入学习Java至关重要。异常处理是...
Java中的数组是特殊的对象,它们也有自己的存储位置。创建数组时,实际上是创建了一个指向数组的引用。 ```java int[] arr = new int[10]; ``` 在这个例子中,`arr`是指向一个包含10个整数的数组的引用。数组的每...
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关键字 ...
3. **数组与集合**:详述了Java中的数组,包括一维、多维数组,以及集合框架,如ArrayList、LinkedList、HashSet和HashMap等。 4. **字符串与字符流**:介绍String类的使用,以及字符和字节流的读写操作,包括...
讲解了如何通过句柄操纵对象,对象的创建和内存管理,特别是Java中特殊的主类型和数组。作者指出,Java不支持显式的对象清除,而是依赖于垃圾收集机制。此外,本章还介绍了类的定义,包括字段和方法,以及构建Java...