美国上市公司,专注Java培训22年

java中数组的定义是什么,使用方法是什么?


基础:在Java语言中,数组是对象(An object is a class instance or an array.),而且是动态创建的。数组超类是Objcet,可以在数组上调用Object类的所有方法。每个数组都有一个关联的Class对象,与具有相同组成类型的所有其他数组共享(§10.8)。虽然数组类型不是一个class,但每个数组的Class对象的行为如下:

每个数组类型的直接超类都是Object。

每个数组类型都实现了Cloneable和java.io.Serializable接口。

数组类型的超类型关系

以下规则定义了数组类型之间的直接超类型关系(§4.10.3):

如果 S 和 T 都是引用类型,当S >1 T时,S[] >1 T[]

Object >1 Object[]

Cloneable >1 Object[]

java.io.Serializable >1 Object[]

如果 P 是一种原始数据类型,则:

(1) Object >1 P[]

(2) Cloneable >1 P[]

(3) java.io.Serializable >1 P[]

数组类型的超类型关系与超类关系不同:

根据上面(即§4.10.3),Integer[]的直接超类型是Number[]。

但根据Integer[]是一个Class对象(§10.8),Integer []的直接超类是Object。

这在实践中无关紧要,因为Object也是所有数组类型的超类型(原话:This does not matter in practice, because Object is also a supertype of all array types.)。

推一篇相关分析的文章:Java中的数组是对象吗?

一个Characters数组不是一个String(§10.8)

在Java语言中,一个char数组并不是一个String,并且String和char数组都不会被'\ u0000'(NUL字符)终止。

String对象是不可变的,它的内容永远不变,而char数组有可变元素。

String类中的toCharArray方法返回一个包含与String相同字符序列的字符数组。StringBuffer类在可变字符数组上实现有用的方法。

数组类型成员

以下是数组类型的所有成员:

public final字段length,包含数组的元素个数。长度可以是正数或零。

public 方法 clone,它会覆盖Object类中的同名方法,并且抛出任何未检查的异常。数组类型T []的clone()方法的返回类型是T []。多维数组的clone很浅,也就是说它只创建一个新数组。子阵列是共享的。

所有成员都继承自Object类;唯一没有继承的Object方法是它的clone方法。

Java中的length和length()

问:为什么数组有length属性,而字符串没有?或者,为什么字符串有length()方法,而数组没有?

答:

一旦数组被创建,他的长度就是固定的了。数组的长度可以作为final实例变量的长度。因此,长度可以被视为一个数组的属性。

String背后的数据结构是一个char数组,所以没有必要来定义一个不必要的属性(因为该属性在char数值中已经提供了)。

深入分析Java中的length和length()

特点

数组与其他种类的容器

数组与其他种类的容器之间的区别有三方面:效率、类型和保存基本类型的能力。

在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。

数组是一个简单的线性序列,这使得元素访问非常快速。

付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变。

数组之所以优于泛型之前的同期,就是因为可以创建一个数组去持有某种具体类型。

在泛型之前,其他的容器在处理对象时,都将他们视为没有任何具体类型,即将这些对象当做Javav中根类的根类Object处理。

有了泛型后,容器可以指定并检查它们所持有对象的类型,并且有了自动包装机制,容器看起来还能够持有基本类型。

随着自动包装机制的出现,容器已经可以与数组几乎一样方便的用于基本类型中了。

数组硕果仅存的优点就是效率。然而,如果要解决更一般化的问题,数组可能会受到过多的限制,因此在这些情形下还是会使用容器。

基础

无论什么类型的数组,数组标识符只是一个引用,指向在堆中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。

可以作为数组初始化语法的一部分隐式地创建此对象,或者用new表达式显式地创建。

只读成员length是数组对象的一部分(事实上,这是唯一一个可以访问的字段),表示此数组可以存储多少元素。

“[]”语法是访问数组对象的唯一的方式。

对象数组和基本类型数组

对象数组和基本类型数组在使用上几乎是相同的,唯一的区别就是对象数组保存的是引用,基本类型数组直接保存基本类型的值。

多维数组中构成矩阵的每个向量都可以具有任意的长度(这被称为粗糙数组)。

数组与泛型

通常,数组与泛型不能很好的结合。不能实例化具有参数化类型的数组。

擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型,以强制保证类型安全。

但可以参数化数组本身。

/**

* 擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型,以强制保证类型安全。

* 但可以参数化数组本身。

*/

public class ParameterizedArrayType {

public static void main(String[] args) {

Integer[] ints = { 1, 2, 3, 4, 5 };

Double[] doubles = { 1.1, 2.2, 3.3, 4.4, 5.5 };

Integer[] ints2 = new ClassParameter<Integer>().f(ints);

Double[] doubles2 = new ClassParameter<Double>().f(doubles);

ints2 = MethodParameter.f(ints);

doubles2 = MethodParameter.f(doubles);

}

}

class ClassParameter<T> {

public T[] f(T[] arg){

return arg;

}

}

class MethodParameter {

public static <T> T[] f(T[] arg){

return arg;

}

}

使用参数化方法而不使用参数化类的方便之处在于:

不必为需要应用的每种不同的类型都使用一个参数去实例化这个类,并且可以将其自定义为静态的。

当然,不能总是选择使用参数化方法而不是参数化类,但应该成为首选。

泛型容器总是比泛型类数据更好的选择。

一般而言,会发现泛型在类或方法的边界处很有效,而在类或方法的内部,擦除通常会使泛型变得不适用。如,不能创建泛型数组。

Arrays实用功能

java.util类库中的Arrays类,有一套用于数组的static实用方法。其中有六个基本方法:

Arrays.fill()可以填充整个数组。或者只填充数组的某个区域。但只能用单一的数值来调用。

equals()比较两个数组是否相等(deepEquals()用于多维数组)。

sort()用于对数组排序。

binarySearch()用于在已经排序的数组中查找元素。

toString()产生数组的String表示。

hashCode()产生数组的散列码

这些方法对各种基本类型和Object类做了重载。此外,Arrays.asList()接收任意的序列或数组作为其参数,并将其转变为List容器。

复制数组-System.arraycopy

标准类库提供的System.arraycopy(),用它复制数组比用for循环快很多。其针对所有类做了重载。

需要的参数有:源数组,表示从源数组中的什么位置开始复制的偏移量,表示从目标数组的什么位置开始复制的偏移量,需要复制的元素个数。 对数组的任意越界操作都会导致异常。

基本类型和对象数组都可以复制。

如果复制对象数组,只是复制了对象的引用,而不是对象本身的拷贝,即浅复制(shallow copy,亦称为浅拷贝)。

不会自动包装盒自动拆包,两个数组必须具有相同的确切类型。

数组的比较

equals(),数组相等的条件:

元素的个数必须相等。

对应位置的元素也相等

可以通过对每个元素使用equals()作比较来判断,对于基本类型,需要使用基本类型的包装器类的equals()。如,对于int类型需要使用Integer,equals()作比较;

数组元素的比较

java有两种方式提供比较功能。

方案一:

一种是实现java.lang.Comparable接口,使类具有“天生”的比较能力。

方案二:

若没有实现Comparable接口或者不喜欢原有的,可以创建一个实现了Comparator接口的单独的类。这是策略模式的一个应用实例。 一般不需要实现里面的equals()方法,除非有特殊功能需求。

Collections类包含一个reverseOrder()方法,可以产生一个Comparator,可以反转自然的排序顺序,这很容易应用于CompType.

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • eclipse怎么建立Java项目?
    eclipse怎么建立Java项目?
    eclipse怎么建立Java项目?在使用Eclipse建立Java项目时,可以遵循以下步骤: 详情>>

    2024-05-10

  • Java关键词汇总-Java关键字有哪些及其作用?
    Java关键词汇总-Java关键字有哪些及其作用?
    Java关键词汇总-Java关键字有哪些及其作用?Java语言中的关键字(Keywords)是Java编程语言的核心组成部分,它们具有特定的意义,并被用于表示基本数据类型、控制语句、访问权限等。Java关键字总数大约有50个左右,下面列出了一些常用的Java关键字及其作用: 详情>>

    2024-04-08

  • Java编程工具用哪个最好
    Java编程工具用哪个最好
    Java编程工具用哪个最好?Java编程工具的选择取决于个人的偏好、项目需求和开发环境。以下是一些常用的Java编程工具: 详情>>

    2024-04-03

  • 好用的Java编写软件
    好用的Java编写软件
    Java是一种广泛使用的编程语言,因其跨平台、安全性和稳定性而受到许多开发者的喜爱。Java被用于开发各种类型的软件,从桌面应用程序到企业级服务器端应用程序。以下是一些常见的、用Java编写的软件示例: 详情>>

    2024-04-02

  • Java开班时间

    收起