热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中数组参考指南

Java中数组参考指南-1.介绍本文,我们深入探讨Java中一核心概念-数组。首先了解什么是数组,然后了解如何使用它们。总的来说,我们将介绍如何:数组入门读写数组元素遍历数组将数组

1. 介绍

本文,我们深入探讨Java中一核心概念 - 数组。首先了解什么是数组,然后了解如何使用它们。总的来说,我们将介绍如何:

  • 数组入门
  • 读写数组元素
  • 遍历数组
  • 将数组转化为其对象,如List或Streams
  • 数组的排序、搜索和合并

    2. 什么是数组

    首先,我们需要定义什么是数组?根据Java文档,数组是包含固定数量相同类型的对象。数组中的每个元素都是有序号的,这意味着我们可以使用索引来访问它们。
    我们可以将数组看作是编号的单元格,每个单元格可以看作是保存一个值的亦是。在Java中,编号是从0开始的。
    变量的类型可以是基础类型数组和对象类型数组。这意味着我们可以使用int, float, boolean, ......同样也可以使用String, Object和自定义类型来定义数组。

    3. 设置数组

    现在我们已经知道数组的定义了,我们深入了解它们的用法。
    我们将涵盖很多关于如何使用数组的主题。我们将学习一些基础知识,如如何声明和初始化数组,还有更高级的主题如排序和搜索数组。
    先让我们学习声明和初始化数组。

    3.1. 声明

    我们从声明开始,在Java中有两种声明数组的方法

    // 方法一:
    int[] anArray;
    
    // 方法二:
    int anOtherArray[];
    

    前者比后者应用更广泛。

    3.2. 初始化

    现在让我们看一下如何初始化数组。同样有多种方法可以初始化一个数组。
    让我们从一个简单的方法开始:

    int[] anArray = new int[10];

    通过上面的语句,我们初始化了一个包含10个int元素的数组。注意我们必须指定数组的大小。
    使用此方法时,我们将每个元素的初始化的默认值为0,如果元素为Object,则默认值为null。
    另一种方法,我们可以在创建数组时直接为数组设置值:

    int[] anArray = new int[]{1, 2, 3, 4, 5};

    在这里我们初始化了一个包含数字1到5的五元素数组。使用此方法时,我们不需要指定数组的长度,需要在大括号之间指定数组元素。

    4. 访问数组

    如何访问数组元素呢?我们可以通过元素的位置来实现。
    如下面这段代码将在控制台上打印数字10

    anArray[0] = 10;
    System.out.println(anArray[0]);

    注意我们是用索引来访问数组元素的,括号内的数字是我们要访问的数组的具体位置。
    访问单元格时,如果索引为负数或超出最后一个单元格Java将抛出ArrayIndexOutOfBoundException。
    我们应该注意不要使用负数为索引,或大于或小于数组长度的值为索引。

    5. 遍历数组

    虽然逐个访问数组很有用,我们也需要经常遍历数组。
    第一种方法是使用for循环:

    int[] anArray = new int[]{1, 2, 3, 4, 5};
    for (int i = 0; i 

    上面这段代码将数字1-5打印到控制台上,我们利用了数组长度这一属性。我们还可以使用while 和 do while,以及for each来遍历数组。下面使用foreach循环:

    int[] anArray = new int[]{1, 2, 3, 4, 5};
    for (int element : anArray) {
      System.out.println(element);
    }

    这个例子和上一个例子是等价的,但是没有用到索引。在以下情况可以使用foreach循环:

  • 不需要修改数组
  • 不需要索引来做其他事情

    6. 可变参数

    我们已经介绍了创建和操作数组的的基础知识。现在我们将探讨更高级的主题,先从可变参数开始。可变参数用于将任意数量的参数传递给方法:

    void varargsMethod(String... varargs) {}

    这个方法可以传入0到任意数量的String参数。
    我们知道在方法内部,会将可变参数转化为一个数组。同样我们也可以将一个数组直接作为可变参数:

    String[] anArray = new String[]{"Milk", "Tomato", "Chips"};
    varargsMethod(anArray);
    
    // 和下面调用方法等效
    varargsMethod("Milk", "Tomato", "Chips");

    7. 将数组转化成List

    有时处理List会更方便,这里介绍如何将数组转换为列表。
    一个简单的笨方法来实现:

    List aList = new ArrayList<>();
    for (int element : anArray) {
      aList.add(element);
    }

    另外一种更简洁的方式:

    Integer[] anArray = new Integer[]{1, 2, 3, 4, 5};
    List aList = Arrays.asList(anArray);

    静态方法Arrays.asList接受一个可变参数并使用值传递方式创建一个列表,这个方法有一些缺点:

  • 不能使用基础类型数组
  • 我们不能从创建的列表中添加或删除元素,因为它会抛出UnsupportedOperationException

8. 将数组转化成Stream

我们现在可以将数组转换为列表,从Java8开始提供了Stream API,我们也有可能需要将数组转换为Stream。Java为我们提供了Arrays.stream方法:

String[] anArray = new String[]{"Milk", "Tomato", "Chips"};
Stream aStream = Arrays.stream(anArray);

将一个Object数组作为参数传递给该方法,它返回匹配类型的Stream。当传递一个基础类型数组时它将返回基础数据流。也可以在数组的子集上创建流:

Stream anotherStream = Arrays.stream(anArray, 1, 3);

这将创建一个只有"Tomato"和"Chips"字符吕的Stream

9. 数组排序

现在我们来对数组进行排序,即按特定顺序重新排列其元素。Arrays类为我们提供了sort方法。有点像流的方法,该方法有很多重载。
方法说明:

  • 基础类型数组:按升序排列
  • 对象数组(对象必须实现Comparable接口):按照自然顺序排序(依赖于Comparable的compareTo方法)
  • 泛型数组:根据给定的比较器排序,可以对数组的特定部分进行排序(需要将开始和结束索引传递给方法)

sort方法背后的算法分别是原始数组和其他数组的快速排序和合并排序。
让我们通过一些例子来看看sort是如何使用的:

int[] anArray = new int[]{5, 2, 1, 4, 8};
Arrays.sort(anArray);
// anArray is now {1, 2, 4, 5, 8}

Integer[] anotherArray = new Integer[]{5, 2, 1 4, 8};
Arrays.sort(anotherArray);
// anotherArray is now {1, 2, 4, 5, 8}

String[] yetAnotherArray = new String[]{"A", "E", "Z", "B", "C"};
Arrays.sort(yetAnotherArray, 1, 3, 
           Comparator.comparing(String::toString).reversed());
// yetAnotherArray is now {"A", "Z", "E", "B", "C"}

10. 搜索数组

搜索数组很简单,可以遍历数组并在数组元素中搜索我们的元素:

int[] anArray = new int[]{5, 2, 1, 4, 8};
for (int i = 0; i 

上面的代码,我们搜索了数字4,并在索引3处找到了它。
如果我们有一个排序数组,我们可以使用另一种解决这群:二分查找。
Java为我们提供了Arrays.binarySearch方法。我们必须给它一个数组和一个要搜索的元素。
在泛型数组的情况下,我们还必须首先为其提供用于对数组进行排序的比较器, 我们也可以在数组的子集上调用该方法。下面是用二分搜索方法的一个例子:

int[] anArray = new int[]{1, 2, 3, 4, 5};
int index = Arrays.binarySearch(anArray, 4);
System.out.println("Found at index " + index);

注意:前提是一个已经排序的数组。

11. 合并数组

最后让我们看一下如何连接两个数组。一个思路就是创建一个数组,长度为两个数组的和。之后我们再分别添加两个数组的元素。

int[] anArray = new int[]{5, 2, 1, 4, 8};
int[] anotherArray = new int[]{10, 4, 9, 11, 2};

int[] resultArray = new int[anArray.length + anotherArray.length];
for (int i = 0; i 

上面的代码,当索引小于第一个数组长度时添加第一个数组元素添加,然后中再添加第二个数组元素。我们也可以使用Arrays.setAll方法来避免写循环:

int[] anArray = new int[]{5, 2, 1, 4, 8};
int[] anotherArray = new int[]{10, 4, 9, 11, 2};

int[] resultArray = new int[anArray.length + anotherArray.length];
Arrays.setAll(resultArray, i 
    -> (i 

此方法将根据给定函数设置所有数组元素。此函数将索引与结果相关联。
合并数组的第三个方法,System.arraycopy。

System.arraycopy(anArray, 0, resultArray, 0, anArray.length);
System.arraycopy(anotherArray, 0, resultArray, anArray.length
    , anotherArray.length);

调用两次方法,分别将两个数组元素值copy到结果数组中。

12. 总结

本文中,我们介绍了Java中数组的基本和一些高级用法。
我们看到Java提供了很多通过Arrays来处理数组的方法。Apache Commons和Guava库还有一些实用的方法可以操作数组。


推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有