作者:Flyingis
数组是Java语言内置的类型,除此之外,Java有多种保存对象引用的方式。Java类库提供了一套相当完整的容器类,使用这些类的方法可以保存和操纵对象。下面分别进行讨论,在研究Java容器类之前,先了解一下Java数组的基本功能和特性。
1. 数组的基本特性<!----><o:p></o:p>
数组与其它种类的容器(List/Set/Map)之间的区别在于效率、确定的类型和保存基本类型数据的能力。数组是一种高效的存储和随机访问对象引用序列的方式,使用数组可以快速的访问数组中的元素。但是当创建一个数组对象(注意和对象数组的区别)后,数组的大小也就固定了,当数组空间不足的时候就再创建一个新的数组,把旧的数组中所有的引用复制到新的数组中。<o:p></o:p>
Java中的数组和容器都需要进行边界检查,如果越界就会得到一个RuntimeException异常。这点和C++中有所不同,C++中vector的操作符[]不会做边界检查,这在速度上会有一定的提高,Java的数组和容器会因为时刻存在的边界检查带来一些性能上的开销。<o:p></o:p>
Java中通用的容器类不会以具体的类型来处理对象,容器中的对象都是以Object类型处理的,这是Java中所有类的基类。另外,数组可以保存基本类型,而容器不能,它只能保存任意的Java对象。<o:p></o:p>
一般情况下,考虑到效率与类型检查,应该尽可能考虑使用数组。如果要解决一般化的问题,数组可能会受到一些限制,这时可以使用Java提供的容器类。<o:p> </o:p>
2. 操作数组的实用功能<o:p></o:p>
在java.util.Arrays类中,有许多static静态方法,提供了操作数组的一些基本功能:<o:p></o:p>
equals()方法----用于比较两个数组是否相等,相等的条件是两个数组的元素个数必须相等,并且对应位置的元素也相等。<o:p></o:p>
fill()方法----用以某个值填充整个数组,这个方法有点笨。<o:p></o:p>
asList()方法----接受任意的数组为参数,将其转变为List容器。<o:p></o:p>
binarySearch()方法----用于在已经排序的数组中查找元素,需要注意的是必须是已经排序过的数组。当Arrays.binarySearch()找到了查找目标时,该方法将返回一个等于或大于0的值,否则将返回一个负值,表示在该数组目前的排序状态下此目标元素所应该插入的位置。负值的计算公式是“-x<!----><st1:chmetcnv unitname="”" sourcevalue="1" hasspace="False" negative="True" numbertype="1" tcsc="0" w:st="on">-1”</st1:chmetcnv>。x指的是第一个大于查找对象的元素在数组中的位置,如果数组中所有的元素都小于要查找的对象,则x = a.size()。如果数组中包含重复的元素,则无法保证找到的是哪一个元素,如果需要对没有重复元素的数组排序,可以使用TreeSet或者LinkedHashSet。另外,如果使用Comparator排序了某个对象数组,在使用该方法时必须提供同样的Comparator类型的参数。需要注意的是,基本类型数组无法使用Comparator进行排序。<o:p></o:p>
sort()方法----对数组进行升序排序。<o:p></o:p>
在Java标准类库中,另有static方法System.arraycopy()用来复制数组,它针对所有类型做了重载。<o:p></o:p>
<o:p></o:p>
3. 数组的排序<o:p></o:p>
在Java1.0和1.1两个版本中,类库缺少基本的算法操作,包括排序的操作,Java2对此进行了改善。在进行排序的操作时,需要根据对象的实际类型执行比较操作,如果为每种不同的类型各自编写一个不同的排序方法,将会使得代码很难被复用。一般的程序设计目标应是“将保持不变的事物与会发改变的事物相分离”。在这里,不变的是通用的排序算法,变化的是各种对象相互比较的方式。<o:p></o:p>
Java有两种方式来实现比较的功能,一种是实现java.lang.Comparable接口,该接口只有一个compareTo()方法,并以一个Object类为参数,如果当前对象小于参数则返回负值,如果相等返回零,如果当前对象大于参数则返回正值。另一种比较方法是采用策略(strategy)设计模式,将会发生变化的代码封装在它自己的类(策略对象)中,再将策略对象交给保持不变的代码中,后者使用此策略实现它的算法。因此,可以为不同的比较方式生成不同的对象,将它们用在同样的排序程序中。在此情况下,通过定义一个实现了Comparator接口的类而创建了一个策略,这个策略类有compare()和equals()两个方法,一般情况下实现compare()方法即可。<o:p></o:p>
使用上述两种方法即可对任意基本类型的数组进行排序,也可以对任意的对象数组进行排序。再提示一遍,基本类型数组无法使用Comparator进行排序。<o:p></o:p>
Java标准类库中的排序算法针对排序的类型进行了优化——针对基本类型设计了“快速排序”,针对对象设计的“稳定归并排序”。一般不用担心其性能。
<o:p>
其它相关内容:
Java容器分析--List和Set
Java容器分析--Map</o:p>
分享到:
相关推荐
数组是一组数据类型相同的数据的结合,可以看作一份容器。和变量不同的是,变量空间只能存放一份,而数组可以存储一组内容。 (2)性质 数组是一个引用数据类型,包括byte / short / int / long / float / double / ...
数组在Java中是存储同一类型数据的集合,可以看作是一个可变大小的容器。数组的定义和初始化通常包含以下几个步骤: 1. **声明**:指定数组的类型,如`int[] numbers`声明了一个整型数组。 2. **创建**:分配内存...
通过这些练习,你将巩固对Java容器的理解,提高代码编写效率,并为解决实际问题打下坚实基础。记得在实践中不断挑战自己,尝试不同的场景和数据结构,以便更好地掌握Java容器的精髓。祝你在学习过程中取得优异的成绩...
- **数组定义**:数组是一组数据的集合,可以理解为一个容器,存储着相同类型的数据。 - **引用类型**:数组本身是一种特殊的引用类型,它存储的是指向内存中连续空间的引用。 - **元素类型**:数组的元素可以是...
- **变量**:在Java中,变量是存储数据的容器,分为基本类型(如int, double, boolean等)和引用类型(如类、接口、数组)。 - **数据类型**:Java有两大类数据类型,即原始类型(primitives)和引用类型...
在Java编程中,对象的容纳主要分为两种方式:数组和容器。这里我们将详细讨论这两种方式。 **一、数组** 数组是一种基础的存储结构,它允许我们存储相同类型的对象引用。在Java中,数组的创建和使用可以通过以下...
在Java编程中,数组是一种非常基础且重要的数据结构,它用于存储同类型的多个元素。在处理数组时,经常需要找出数组中的最大值和最小值,这对于数据分析、算法实现或者简单的数学计算都至关重要。本详细教程将指导你...
数组是存储固定数量同类型元素的容器。在Java中,可以通过以下方式创建数组: 1. **声明与初始化**: ``` int[] numbers; // 声明数组 numbers = new int[5]; // 初始化数组 ``` 2. **同时声明与初始化**: ...
我们的目标是从这个数组中提取所有的数字,并将它们存储在一个新的容器中。在这个例子中,我们将使用`ArrayList<Integer>`来存储提取出来的数字。 首先创建一个`ArrayList<Integer>`实例: ```java ArrayList...
Java容器源码是Java开发中的重要组成部分,它们提供了一种高效的方式来存储和管理对象,使得在编程时可以更方便地处理数据。Java的容器主要包括集合框架(Collection Framework)中的类和接口,如ArrayList、...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
3. **Java第05章 - 数组与集合**:在这一章,学习者会接触到数组,它是存储多个同类型元素的容器。同时,集合框架(如ArrayList、LinkedList、HashSet等)也是重点,它们提供了更加灵活的数据存储和操作方式。 4. *...
在Java中,`JFrame` 是窗口容器的基础类,它是顶级容器,用于承载其他组件。在扫雷项目中,`JFrame` 作为游戏的主要窗口,承载着游戏面板、计时器、分数显示等各个部分。开发者会定义一个`JFrame`实例,并在其上添加...
3. 数组与集合:Java数组是存储同类型数据的容器,而集合框架如ArrayList、LinkedList、HashSet、HashMap等则提供了更灵活的数据存储方式。通过实例,学习者可以了解它们的用法和适用场景。 4. 函数与方法:函数是...
你还会学习如何使用数组来存储和处理一组相同类型的值,以及如何使用类和对象来封装数据和行为。 异常处理是Java中的一个重要概念,它允许程序优雅地处理错误情况,而不是突然崩溃。Java使用try-catch-finally结构...
数组是存储同一类型数据的容器,它的大小在创建时即被固定。声明数组时,我们需要指定数组的类型和名称,如`int[] arr`声明了一个整型数组。初始化数组有两种方式:一是声明的同时赋值,如`int[] arr = new int[]{1,...
本文档为Amazon S3 Java SDK使用手册,旨在为开发者提供关于如何在Java项目中安装与使用Amazon S3(Simple Storage Service)服务的详细指南。文档涵盖从安装SDK、初始化配置到操作对象存储的各项功能,包括管理存储...
5. **数组和集合**:讲解数组的使用,以及Java集合框架,包括List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等。 6. **字符串处理**:介绍String类的特性和常用方法,以及StringBuilder...