当前位置:

首页 > 编程开发 > Java数组的基本操作有哪些

Java数组的基本操作有哪些

一、为什么要使用数组以及数组的定义1.1为什么使用数组问题1:声明变量时,每一个单独的变量都要对应一个变量名,但现在要处理一组相同类型的数据时,如要表示班上100个人的年龄,绝对不希望定义100个变量来表示每个人的年龄,那怎么办呢?再看下列例子。intage=17;//表示一个年龄问题2:求两个数之和,需要一个方法,求5个数之和,需要重载一个方法,求100个数之和、1000个数之和、10000个数之和,方法的参数列表会很长很长,而且方法得有很多个,而且还得去记住哪个方法是两个参数的,哪个方法是三个参数的。

本文目录

    Java数组的基本操作有哪些


    一、为什么要使用数组以及数组的定义

    1.1 为什么使用数组

    问题1:

    声明变量时,每一个单独的变量都要对应一个变量名,但现在要处理一组相同类型的数据时,如要表示班上100个人的年龄,绝对不希望定义100个变量来表示每个人的年龄,那怎么办呢?再看下列例子。

    int age = 17;//表示一个年龄

    问题2:

    求两个数之和,需要一个方法,求5个数之和,需要重载一个方法,求100个数之和、1000个数之和、10000个数之和,方法的参数列表会很长很长,而且方法得有很多个,而且还得去记住哪个方法是两个参数的,哪个方法是三个参数的。这样总感觉很不爽,仔细分析这个功能,其实就是求一组数值的和而已,这个方法并不在乎具体是多少个加数,它只在乎需要把哪些数加起来。

    大师的建议:定义方法的形参时,最好不好超过5个。

    1.2 什么是数组

    简单来讲就是一组数据,一堆数据。所谓数组是在程序设计中为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式。这些按一定顺序排列的同类型数据的集合称为数组。而数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引从0开始,步长是1,有点像Excel表格的行号逐行递增。

    Java数组的基本操作有哪些

    1.3 数组的定义

      方式1(推荐使用): 数组元素的类型[]  数组名;          eg:int[] ages;

    可以把int[]看成是一种数据类型,int类型的数组类型。

      方式2:数组元素的类型  数组名[];           eg: int ages[];

    注意:数组必须先初始化才能使用。因为初始化表示在内存中分配空间。

    二、数组的初始化

    Java中数组必先初始化后才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋初始值。

    初始化数组的两种方式分为静态初始化、动态初始化;无论以哪种方式初始化数组一旦初始化完成,数组的长度就固定了,除非重新初始化。也就是说数组是定长的。

    数组是定长的:数组一旦初始化成功,数组中的元素个数就已经固定了,不能更改。如果需要更改,只能重新做初始化。

    2.1 数组的静态初始化

    由我们自己来为每一个数组元素设置初始化值,而数组的长度由系统(JVM)决定。

    语法:

    数组元素类型[]  数组名 = new 数组元素类型[]{元素1,元素2,元素3,.......};

    举例:

    int[] nums = new  int[]{1,3,5,7,9};

    简单写法,必须声明之后立刻初始化,不能先声明后初始化; int[] nums = {1,3,5,7,9};

    图解数组静态初始化操作及重新赋值操作

    Java数组的基本操作有哪些

    2.2 数组的动态初始化

    由我们来设置数组的元素个数(数组长度),而每一个数组元素的初始值由系统决定。

    语法:

    数组元素类型[]  数组名 = new  数组元素类型[ length ];

    举例:

        int[] ages = new  int[
    100
    ];

    注意:int[] nums = new  int[5]{1,3,5,7,9};//写法是错误的。不能同时使用静态初始化和动态初始化。

    2.3 什么时候使用静态初始化,什么时候使用动态初始化呢?

    当我们事先知道需要存储哪一些数据的时候,选用静态初始化;

    当我们事先不知道,需要存储哪些数据的时候,只能使用动态初始化;

    Java中给数据类型设定了初始值,如下图:

    数据类型

    初始值

    byte、short、int

    0

    long

    0L

    float

    0F

    double

    0.0D

    boolean

    false

    char

    ’\u0000‘ (表示空)

    引用数据类型

    null

    三、数组基本操作(一维数组)

    3.1 数组基本操作:

    • 获取元素: 元素类型 变量 =  数组名[index];

    • 设置元素: 数组名[index] = 值;

    • 遍历数组元素: 建议使用for循环,因为for循环事先知道循环的次数。

    • 数组长度:  int len = 数组名.length;  length是属性,不是方法.

    • 索引范围:  从0开始,逐一递增。 [0,数组名.length-1]

    3.2 操作数组常见异常:

    NullPointerException:空指针异常(空引用)。

    出现该异常的原因:当数组还未初始化,就直接操作数组

    如以下代码:

    String[] bs = null;
    
    System.out.println(bs.length)

    ArrayIndexOutOfBoundsException:数组的索引越界异常。

    出现该异常的原因:根据索引取出数据元素时,输入了超出数组索引范围之外的值。

    如下代码:

    int[] nums = {1,3,5,7,9};
    
    int a = nums[4];

    3.3 获取数组最大最小元素

    /**
     * 求数组最大值
     *
     * @param nums
     * @return
     */
    public static int getMax(int[] nums) {
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            if (result < num) {
                result = num;
            }
        }
        return result;
    }
    
    /**
     * 求数据最小值
     *
     * @param nums
     * @return
     */
    public static int getMin(int[] nums) {
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            if (i == 0) {
                result = num;
            }
            if (result > num) {
                result = num;
            }
        }
        return result;
    }

    3.4 打印数组元素

    当我们直接使用System.out.println()打印数组的时候,打印出来是hashCode值,如

    int[] nums = new int[]{1, 3, 5, 7, 9};
    
    System.out.println(nums);

    Java数组的基本操作有哪些

    我们不喜欢,我们想打印数组的时候,把该数组的元素打印出来,这时需要循环遍历打印

    int[] nums = new int[]{1, 3, 5, 7, 9};
    for (int i = 0; i < nums.length; i++) {
        System.out.print(nums[i] + " ");
    }

    但是呢,每次想打印数据中的元素都还要循环遍历一遍,好麻烦啊! 有没有更好的方式呢?其实不用着急,Java前辈们已经帮我们想到了这一点了,我们只需要调用Arrays.toString()方法就能够对数组进行打印。

    3.5 逆序排列数组元素

    例子:原数组[A, B, C, D, E],要求对该数组进行逆序操作得到新数组:[E, D, C, B, A]。

    public static String[] reversedOrder(String[] nums) {
        String[] result = new String[nums.length];
        int index = 0;
        for (int i = nums.length - 1; i >= 0; i--) {
            result[index] = nums[i];
            index++;
        }
        return result;
    }

    3.6 线性搜索:元素出现索引(第一次/最后一次)

    数组的线性搜索指得就是挨个遍历,查找数组中与key相同的元素,若查找不到则可以返回-1(惯例,自定义),其效率为O(n)。

    例子:int[] arr = {10,20,30,10,50,-30,10};获取元素10在arr数组中第一次出现的索引和最后一次出现的索引

    /**
     * 获取数组中指定元素第一次出现的索引
     *
     * @param nums
     * @param element
     * @return
     */
    public static int indexOf(int[] nums, int element) {
        for (int i = 0; i < nums.length; i++) {
            if (element == nums[i]) {
                return i;
            }
        }
        return -1;
    }
    
    /**
     * 获取数组中指定元素最后一次出现的索引
     *
     * @param nums
     * @param element
     * @return
     */
    public static int lastIndexOf(int[] nums, int element) {
        for (int i = nums.length - 1; i >= 0; i--) {
            if (element == nums[i]) {
                return i;
            }
        }
        return -1;
    }

    四、多维数组

    在前面的文章中我们有提到数组其实就是是多个数据的集合。如果现在有多个数组,我想把多个数组保存在一个集合中,此时我又应该如何完成呢?此时就需要引入多维数组的概念。多维数组其实就是把整个数组看成一个元素,存放到另一个数组当中去。

    多维数组的语法:

    数组元素类型[] 数组名;

    例如如下定义二维数组的格式:

    int[][]  arr = new int[][]   {
    
      arr1 ,arr2,arr3
    
    };
    
    int[][]  arr = new int[][]   {
    
      {1,2,3} ,
    
      {4,5},
    
      {6}
    
    };

    4.1 多维数组和一维数组的区别

    • 一维数组:数组中的每一个元素都是一个值(基本类型和引用类型的值);

    • 二维数组:数组中的每一个元素又是一个一位数组;

    • 三维数组:数组中的每一个元素又是一个二维数组;

    注意:严格上说在Java中不存在多维数组的概念。为了和C语言做区分一般称之为数组中的数组。

    4.2 二维数组的初始化操作

    静态初始化:

    int[][]  arr = new int[][]   {

    {1,2,3} ,

    {4,5},

    {6}

    };

    动态初始化:

    int[][]  arr = new int[3][5] ;//创建一个长度为3的二维数组,每一个元素(一维数组)的长度为5。

    针对于N维数组,需要N个循环嵌套。

    Java数组的基本操作有哪些

    五、Java5对数组的新语法支持

    Java5对数组的新语法支持主要是增强for循环(foreach)和方法的可变参数。

    5.1 增强for循环-foreach

    在之前我们使用for循环的打印元素操作如下

    int[] nums = new int[]{1, 3, 5, 7, 9};
    for (int i = 0; i < nums.length; i++) {
        System.out.println(nums[i]);
    }

    其实我们在使用循环迭代数组的时候,往往是不关心迭代变量(数组的索引)。那在Java中有没有更好的方式,在迭代数组元素的时候就只操作数组元素,不去操作数组的索引呢?其实是有的。

    从Java5开始(JDK1.5)开始,Java提供了一种新的语法:增强for循环(foreach)。

    语法:

    for(数组元素类型 变量  :   数组名)

    {

          循环体

    }

    我们通过反编译工具查看字节码,会发现foreach其实在底层依然是使用for循环+索引来操作数组的。我们把增强for循环称之为编译器的新特性---->语法糖。

    注意:语法糖的最大甜头就是让开发者写更少、更简单的代码,完成相同的功能。当我们在迭代数组元素的时候不关心数组的索引的时,首选使用foreach。当然咯,foreach远远没有本篇博客讲解的这么简单,星仔到时候带着大家在集合框架篇的时候再深入讲解foreach。

    Java数组的基本操作有哪些

    5.2 方法的可变参数

    Java5的时候为什么要增加可变参数呢?我们来看一下以下的需求

    需求:编写一个方法,统计使用数组传递过来的总和。

    Java数组的基本操作有哪些

    虽然说也是可以实现,但是我们心里肯定是不爽的,主要在于以下几点:

    • 为了求多个数之和,我们还得先创建一个数组来存储数据。

    • 如果多个数是变化的,比如求3个数之和变成求5个数之和.......,还得去修改定义数组,但是数组是定长的。

    那如果要解决该问题该怎么办呢?这个时候就需要引入Java5的另一个新特性:方法的可变参数(说的是参数的个数可变)

    注意:

    • 方法的可变参数其实也是一个语法糖,是编译器级别的新特性。主要是为了让开发者写代码更简单。

    • 方法的可变参数其底层是就是一个数组类型。

    • 可变参数必须作为方法的最后一个参数,避免参数的歧义性。

    • 一个方法最多只有一个可变参数。

    Java数组的基本操作有哪些

    六、数组元素拷贝

    数组拷贝:从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

    • 从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。

    • 被复制的组件的编号等于 length 参数。

    • 源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。

    数组拷贝操作是经常使用到的,SUN就直接把数组的拷贝操作存放在JDK中的System类中。

    Java数组的基本操作有哪些

    Object:Java语言中的根类。是所有类的老祖宗。Object可以表示任意数据类型。

    该方法没有方法体,该方法使用了native修饰符(本地方法)。该方法底层使用了C/C++语言实现了,Java直接调用其他语言编写好的功能。

    arraycopy 方法使用方式:

    System.arraycopy(src, 2, dest, 5, 4);

    查阅API文档了(Java的帮助文档/好比字典),在什么类中有什么功能的方法即可。文档在手,天下我有!

    Java数组的基本操作有哪些


    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。