JAVA数组和JAV集合类的操作

集合|数组

如果你做过很多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这样的集合类型在它内部有某种存储类型去存储集合元素。在这个例子中,使用的存储类型是作为参数传。

时间: 2024-09-19 09:34:06

JAVA数组和JAV集合类的操作的相关文章

Java数组操作的10大方法_java

1.定义一个Java数组 String[] aArray = new String[5]; String[] bArray = {"a","b","c", "d", "e"}; String[] cArray = new String[]{"a","b","c","d","e"}; 第一种是定义了一个数组,并

求解java中的 二维数组添加 删除 修改 查询 操作

问题描述 二维数组添加删除修改查询操作如何实现?不用传统数组用List()做一个通讯录用字符串输入的方式编写一个简单的通讯录.此通讯录由多条记录构成.每条记录包括一个联系人的姓名.性别.电话.通信地址,并具有查询.增加.修改.删除等功能,且每执行一次功能操作后,可以选择用类似以下的格式,输出通讯录的所有信息记录: 解决方案 解决方案二:這不是二維數組.用Map來做更合適,先定義一個個人資料的類,然後放到Map時用ID當KEY.解决方案三:我用List做

实例解析如何正确使用Java数组_java

一.关于数组的特点 1.在Java中,无论使用数组或集合,都有边界检查.如果越界操作就会得到一个RuntimeException异常. 2.数组只能保存特定类型.数组可以保存原生数据类型,集合则不能.集合不以具体的类型来处理对象,它们将所有对象都按Object类型处理,集合中存放的是对象的引用而不是对象本身. 3.集合类只能保存对象的引用.而数组既可以创建为直接保存原生数据类型,也可以保存对象的引用.在集合中可以使用包装类(Wrapper Class),如Integer.Double等来实现保存

关于java数组的深度思考

数组 刚刚开始接触java数组的人都会听到一句类似的话:java是纯面向对象的语言,他的数组也是一个对象.于是乎,笔者就按照一个对象的方式来使用数组,心安理得.直到我接触到C的数组后,才发现将数组作为一个类来使用在实现上是多么的"不自然". 首先我们看一下表面现象,数组创建的时候采用的是如下语句: MyClass[] arr = new MyClass[9]; 而普通类采用的是如下语句: MyClass obj = new MyClass(); 就是说,创建数组的时候不使用小括号传参.

新手入门:Java数组特点及基本使用技巧

技巧|数组 1.关于数组的特点 1)在Java中,无论使用数组或容器,都有边界检查.如果越界操作就会得到一个RuntimeException异常. 2)数组只能保存特定类型.数组可以保存基本类型,容器则不能.容器不以具体的类型来处理对象,它们将所有对象都按Object类型处理. 3)容器类只能保存对象的引用.而数组既可以创建为直接保存基本类型,也可以保存对象的引用.在容器中可以使用包装类,如Integer.Double等来实现保存基本数据类型值. 4)对象数组和基本类型数组在使用上几乎是相同的:

java数组的返回

假定我们现在想写一个方法,同时不希望它仅仅返回一样东西,而是想返回一系列东西.此时,象C和C++这样的语言会使问题复杂化,因为我们不能返回一个数组,只能返回指向数组的一个指针.这样就非常麻烦,因为很难控制数组的"存在时间",它很容易造成内存"漏洞"的出现. Java采用的是类似的方法,但我们能"返回一个数组".当然,此时返回的实际仍是指向数组的指针.但在Java里,我们永远不必担心那个数组的是否可用--只要需要,它就会自动存在.而且垃圾收集器会在

Java数组模拟优先级队列数据结构的实例_java

优先级队列如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权

Java数组 不一定要初始化也可正常使用

数组是大多数编程语言提供的一种复合结构,如果程序需要多个类型相同的变量时,就可以考虑定义一个数组.Java语言的数组变量是引用类型的变量,因此具有Java独有的特性. 在正常的Java开发中,使用Java数组之前,我们都会对数组进行初始化,为数组中的元素分配内存空间.赋值等,但Java数组一定要初始化吗?不初始化可以 么? 其实,java的数组变量是引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使用该数组变量,比如下面这个例子: public class T {

关于JAVA 数组的使用介绍_java

JAVA数组与容器类主要有三方面的区别:效率.类型和保存基本类型的能力.在JAVA中,数组是一种效率最高的存储和随机访问对象引用序列的方式.数组就是一个简单的线性数列,这使得元素访问非常快速.但是为此付出的代价却是数组的大小被固定,并且在其生命周期中不可改变. 由于范型和自动包装机制的出现,容器已经可以与数组几乎一样方便地用于基本类型中了.数组和容器都可以一定程度上防止你滥用他们,如果越界,就会得到RuntimeException异常.数组硕果仅存的优势便是效率,然而,如果要解决更一般化的问题,