展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Java中数组定义和使用实例分析

Java中数组定义和使用实例分析

一维数组Java语言中的数组是一种引用数据类型;不属于基本数据类型;数组的父类是Object。数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合)数组:字面意思是“一组数据”数组当中可以存储“基本数据类型”的数据,也可以存储“引用数据类型”的数据。数组因为是引用类型,所以数组对象是堆内存当中。(数组是存储在堆当中的)数组当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象(存它的地址)。数组一旦创建,在java中规定,长度不可变。(

本文目录

    Java中数组定义和使用实例分析

    一维数组

    Java语言中的数组是一种引用数据类型;不属于基本数据类型;数组的父类是Object。
    数组实际上是一个容器,可以同时容纳多个元素。(数组是一个数据的集合)
        数组:字面意思是“一组数据”
    数组当中可以存储“基本数据类型”的数据,也可以存储“引用数据类型”的数据。
    数组因为是引用类型,所以数组对象是堆内存当中。(数组是存储在堆当中的)
    数组当中如果存储的是“java对象”的话,实际上存储的是对象的“引用(内存地址)”,数组中不能直接存储java对象(存它的地址)。

    Java中数组定义和使用实例分析

    数组一旦创建,在java中规定,长度不可变。(数组长度不可变)
    数组的分类:一维数组、二维数组、三维数组、多维数组...(一维数组较多,二维数组偶尔使用!)
    所有的数组对象都有length属性(java自带的),用来获取数组中元素的个数。
    java中的数组要求数组中元素的类型统一。比如int类型数组只能存储int类型,Person类型数组只能存储Person类型。例如:超市购物,购物袋中只能装苹果,不能同时装苹果和橘子。(数组中存储的元素类型统一)
    数组在内存方面存储的时候,数组中的元素内存地址(存储的每一个元素都是有规则的挨着排列的)是连续的。内存地址连续。这是数组存储元素的特点(特色)。数组实际上是一种简单的数据结构。
    所有的数组都是拿“第一个小方框的内存地址”作为整个数组对象的内存地址。(数组中首元素的内存地址作为整个数组对象的内存地址。)
    数组中每一个元素都是有下标的,下标从0开始,以1递增。最后一个元素的下标是:length - 1;下标非常重要,因为我们对数组中元素进行“存取”的时候,都需要通过下标来进行。
    数组这种数据结构的优点和缺点是什么?
           优点:查询/查找/检索某个下标上的元素时效率极高。可以说是查询效率最高的一个数据结构。为什么检索效率高?
      第一:每一个元素的内存地址在空间存储上是连续的。
      第二:每一个元素类型相同,所以占用空间大小一样。
      第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效率是最高的。数组中存储100个元素,或者存储100万个元素,在元素查询/检索方面,效率是相同的,因为数组中元素查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个内存地址,直接定位的。)
           缺点:
                第一:为了保证数组中每个元素的内存地址连续,所以在数组上随机删除或者增加元素的时候,效率较低,因为随机增删元素会涉及到后面元素统一向前或者向后位移的操作。
                第二:数组不能存储大数据量,为什么?因为很难在内存空间上找到一块特别大的连续的内存空间。对于数组中最后一个元素的增删,是没有效率影响的。

    怎么声明/定义一个一维数组?
          语法格式:

    int[] array1;
    double[] array2;
    boolean[] array3;
    String[] array4;
    Object[] array5;

    怎么初始化一个一维数组呢?
            包括两种方式:静态初始化一维数组,动态初始化一维数组。
            (1)静态初始化语法格式:
                int[] array = {100, 2100, 300, 55};
            (2)动态初始化语法格式:
                int[] array = new int[5];

    这里的5表示数组的元素个数。
                初始化一个5个长度的int类型数组,每个元素默认值0
                再例如:String[] names = new String[6];

    初始化6个长度的String类型数组,每个元素默认值null。

    什么时候使用静态数组初始化?什么时候使用动态数组初始化?

    (1)创键数组的时候,确定数组中存储哪些具体的元素时,采用静态初始化方式

    (2)创键数组的时候,不确定将来存储哪些数据,可以采用动态初始化的方式,预先分配内存空间

    package com.bjpowernode.javase.array;
    
    public class ArrayTest01 {
        public static void main(String[] args) {
        //1.静态初始化
           int[] a1 = {1,3,5,7,9};
            //所有的数组对象都有length属性,而不是方法!
            System.out.println("数组元素的个数是:"+a1.length);
            //取第一个元素
            System.out.println(a1[0]);
            //取最后一个元素
            System.out.println(a1[a1.length-1]);
            //改数据
            a1[a1.length-1] = 0;
            //遍历数据
            for(int i=0;i< a1.length;i++){
                System.out.println(a1[i]);
            }
            //数据下标越界异常,例如:访问下面为6的数据元素
            //System.out.println(a1[6]);// ArrayIndexOutOfBoundsException
    
    
        //2.动态初始化
            int[] a2 = new int[5]; //默认值是0
            for(int i=0;i< a2.length;i++){
                System.out.println(a2[i]);
            }
            //初始化一个Object类型的数组,
              //1.采用静态初始化方式
            Object o1 = new Object();
            Object o2 = new Object();
            Object o3 = new Object();
            Object[] object = {o1,o2,o3};
            //上面就等价于:Object[] object = {new Object(),new Object(),new Object()};
            for(int i=0;i

    动态存储内存图

    Java中数组定义和使用实例分析

    方法的参数是数组

    当传递的是一个数组,方法也用数组的形式进行接收;这个数组可以是静态的,也可以是动态创建的;并且我们把方法写成写成静态的,这样不需要new对象就可以调用!

    例1:

    package com.bjpowernode.javase.array;
    
    public class ArrayTest02 {
        //也可以采用C++的风格,写成String args[]
        public static void main(String args[]) {
            System.out.println("HelloWorld");
            // 1.方法的参数传数组---静态初始化方式
            int[] a = {1,2,3,4,5};
            printArray(a);
            // 2.方法的参数传数组---动态初始化方式
            int[] arr = new int[5];
            printArray(arr);
            //   直接一步完成
            printArray(new int[3]);
    
        }
        //静态方法进行打印
        public static void printArray(int[] arr){
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    
    }

    例2:(掌握)

    (1)一种特殊情况传递静态数组;如果直接传递一个静态数组的话,语法必须这样写!

    (2)我们先看一个例子:int[] arr = {1,2,3};我们传递数组的参数时候,一般就是传递数组名arr,例如:printArray(arr);但是另一种方法就是传过去,去掉数组名arr剩余的组成部分:

    int[]{1,2,3},但是要加上new关键字,例如: printArray(new int[]{1,2,3});

    package com.bjpowernode.javase.array;
    
    public class ArrayTest03 {
        public static void main(String[] args) {
         //----------1.动态初始化一位数组(两种传参方式)
            //第一种传参方式
            int[] a1 = new int[5];//默认是5个0
            printArray(a1);
            System.out.println("-------------");
            //第二种传参方式
            printArray(new int[3]);
            System.out.println("-------------");
         //----------2.静态初始化一位数组(两种传参方式)
            //第一种传参方式
            int[] a2 = {1,2,3};
            printArray(a2);
            System.out.println("-------------");
            //第二种传参方式----直接传递一个静态数组
            printArray(new int[]{4,5,6});
    
        }
        //调用的静态方法----静态方法比较方便,不需要new对象
        public static void printArray(int[] arr){
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }

    main方法中的String数组

    (1)对于main(String[] args);分析一下:谁负责调用main方法(JVM)
         JVM调用main方法的时候,会自动传一个String数组过来,长度为0。

    例1:

    package com.bjpowernode.javase.array;
    
    public class ArrayTest04 {
        // 这个方法程序员负责写出来,JVM负责调用。JVM调用的时候一定会传一个String数组过来。
        public static void main(String[] args) {
            // JVM默认传递过来的这个数组对象的长度?默认是0
            // 通过测试得出:args不是null。
            System.out.println("JVM给传递过来的String数组参数,它这个数组的长度是?"
            + args.length); //0
    
            // 以下这一行代码表示的含义:数组对象创建了,但是数组中没有任何数据。就等价于:
            String[] strs = new String[0]; //动态的方式
            //String[] strs = {}; // 静态初始化数组,里面没东西。
            printLength(strs); //调用printLength静态方法
    
    /*
         既然传过来的“String[] args”数组里什么都没有;那么这个数组什么时候里面会有值呢?
         其实这个数组是留给用户的,用户可以在控制台上输入参数,这个参数自动会被转换为“String[] args”
         例如这样运行程序:java ArrayTest04 abc def xyz;相当于在编译时进行传参
         那么这个时候JVM会自动将“abc def xyz”通过空格的方式进行分离,分离完成之后,自动放到“String[] args”数组当中。
         所以main方法上面的String[] args数组主要是用来接收用户输入参数的。
         把abc def xyz 转换成字符串数组:{"abc","def","xyz"}
    */
            // 遍历数组
            for (int i = 0; i < args.length; i++) {
                System.out.println(args[i]);
            }
            //既然是编译时进行传参,对于编译运行一体的IDEA怎么使用呢?
            //Run--->EditConfiguration--->Program Arguments里面进行传参,然后在从后重新运行
    
        }
    
        public static void printLength(String[] args){
            System.out.println(args.length); // 0
        }
    }

    例2:

    (1)main方法上面的“String[] args”有什么用?

    可以用来模拟一个登陆系统!请看下面这个有趣的例题:

    package com.bjpowernode.javase.array;
    /*
       模拟一个系统,假设这个系统要使用,必须输入用户名和密码。
    */
    public class ArrayTest05 {
        public static void main(String[] args) {
            //先判断长度,是不是两个字符串长度,不是2直接终止程序
            if(args.length != 2){
                System.out.println("请输入用户名和密码");
                return;
            }
    
            //取出用户名和密码
            String username = args[0];
            String password = args[1];
            // 假设用户名是admin,密码是123的时候表示登录成功。其它一律失败。
            // 判断两个字符串是否相等,需要使用equals方法。
            // if(username.equals("admin") && password.equals("123")){ //这样有可能空指针异常
            // 下面这种编写方式,也可以避免空该指针异常!
            if("admin".equals(username) && "123".equals(password)){ 
                System.out.println("恭喜你,登录成功");
                System.out.println("您可以继续使用该系统");
            }else{
                System.out.println("账户或密码错误,请重新输入");
            }
        }
    }

    数组中存储引用数据类型(重点)

    (1)一维数组的深入:数组中存储的类型为:引用数据类型;对于数组来说,实际上只能存储java对象的“内存地址”。数组中存储的每个元素是“引用”。下面这个例题重点理解!

    (2)数组要求数组中元素的类型统一;但是也可以存储它的子类型!

    package com.bjpowernode.javase.array;
    public class ArrayTest06 {
        public static void main(String[] args) {
            //1.静态创建一个Animal类型的数组
            Animal a1 = new Animal();
            Animal a2 = new Animal();
            Animal[] animals = {a1,a2};
    
            //对Animal数组进行遍历
            for (int i = 0; i < animals.length; i++) {
                //方法1
                /*Animal a = animals[i];
                a.move();*/
                //方法2
                animals[i].move();
            }
    
            //2.动态初始化一个长度为2的animal类型的数组
            Animal[] ans = new Animal[2];
            ans[0] = new Animal();
            //ans[1] = new Product(); //err,Product和Animals没有任何关系
            //Animal数组中只能存放Animal类型,不能存放Product类型
    
            //3.Animal数组中可以存放Cat类型的数据,因为Cat是Animal一个子类
           ans[1] = new Cat();
            for (int j = 0; j < ans.length; j++) {
                ans[j].move();
            }
    
            //4.创建一个Animal类型的数据,数组当中存储Cat和Bird
              //4.1静态创建
            Cat cat = new Cat();
            Bird bird = new Bird();
            Animal[] anim = {cat,bird};
            for (int i = 0; i < anim.length; i++) {
                //直接调用子类和父类都有的move()方法
                //anim[i].move();
                
                //这里想要调用子类Bird里面特有的方法,需要向下转型
                if(anim[i] instanceof Bird){
                    Bird b = (Bird)anim[i]; //向下转型
                    b.move();
                    b.sing(); //调用子类特有的方法
                }else{
                    anim[i].move();
                }
    
            }
    
    
        }
    }
    //动物类
    class Animal{
        public void move(){
            System.out.println("Animals move.....");
        }
    }
    //商品类
    class Product{
    
    }
    
    //有一个猫类继承动物类
    class Cat extends Animal{
        public void move(){
            System.out.println("Cat move.....");
        }
    }
    
    //有一个鸟类继承动物类
    class Bird extends Animal{
        public void move(){
            System.out.println("Bird move.....");
        }
    
        //鸟特有的方法
        public void sing(){
            System.out.println("鸟儿在歌唱!");
        }
    }

    数组扩容和拷贝

    在Java开发中,数组长度一旦确定不可变,那么数组满了,需要扩容怎么办?
    (1)java中对数组的扩容是:先创建一个大容量的数组,然后将小容量数组中的元素一个个拷贝到大数组当中,小容量会被释放。
    (2)结论:数组扩容效率较低。因为涉及到拷贝的问题。所以在以后的开发中请注意:尽可能少的进行数组的拷贝。可以在创建数组对象的时候预估计以下多长合适,最好预估准确,这样可以减少数组的扩容次数。提高效率。

    (3)利用System.arraycopy进行拷贝,总共5个参数;System.arraycopy(源头数组,下标,目的地数组,下标,要拷贝的个数)

    package com.bjpowernode.javase.array;
    public class ArrayTest07 {
        public static void main(String[] args) {
            //java中的数组是怎样拷贝的呢?System.arraycopy(5个参数)
            //System.arraycopy(源,下标,目的地,下标,个数)
    
            //拷贝源---把3、5、7拷贝过去
            int[] src = {1,3,5,7,9};
            //拷贝目的地---拷贝到下标为5的地方
            int[] dest = new int[20];
            //调用拷贝函数
            System.arraycopy(src,1,dest,5,3);
            //打印验证
            for (int i = 0; i < dest.length; i++) {
                System.out.println(dest[i]+" ");
            }
    
            //拷贝引用数据类型
            String[] str = {"hello","world"};
            String[] strs = new String[10];
            System.arraycopy(str,0,strs,3,2);
            for (int i = 0; i < strs.length; i++) {
                System.out.println(strs[i]);
            }
            System.out.println("--------------");
            
            //采用动态开辟的时候拷贝的是地址
            Object[] objs = {new Object(),new Object(),new Object()};
            Object[] objects = new Object[5];
            System.arraycopy(objs,0,objects,0,3);
            for (int i = 0; i < objects.length; i++) {
                System.out.println(objects[i]);
    
            }
    
        }
    }

    内存图

    Java中数组定义和使用实例分析

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    精品专题 更多
    装机必备

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

    Windows

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

    PDF教程

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

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    IntelliJ IDEA macOS版
    IntelliJ IDEA macOS版

    IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

    PyCharm macOS版
    PyCharm macOS版

    JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

    WebStorm macOS版
    WebStorm macOS版

    JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

    After Effects macOS版
    After Effects macOS版

    Adobe After Effects 是面向动态图形、影视特效与视频合成的专业创作软件。它提供关键帧动画、遮罩抠像、运动跟踪、三维空间、文字动画和表达式等工具,并可与 Premiere Pro、Photoshop、Illustrator

    Audition macOS版
    Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Bridge macOS版
    Bridge macOS版

    Adobe Bridge 是面向摄影师、设计师及内容团队的免费数字资产管理工具,可集中预览照片、视频和 Adobe 项目文件,并利用评级、标签、关键词、元数据、筛选与收藏集完成分类检索。它还支持批量重命名、格式导出、相机导入及 Camera

    Illustrator macOS版
    Illustrator macOS版

    Adobe Illustrator 是 Adobe 推出的专业矢量图形设计软件,适合在 Mac 上制作标志、图标、插画、包装、信息图及印刷版面。它以路径和锚点构建可无损缩放的图形,并提供钢笔、形状、文字、图像描摹、渐变、画板及生成式功能。

    InDesign macOS版
    InDesign macOS版

    Adobe InDesign 是面向印刷品与数字出版物的专业版面设计软件,可在 Mac 上制作书籍、杂志、宣传册、海报、报告及交互式文档。它提供精细的文字样式、网格、母版、长文档管理和印前输出能力。

    Lightroom Classic macOS版
    Lightroom Classic macOS版

    Adobe Lightroom Classic 是面向桌面摄影工作流的照片管理与后期处理软件,可将原始照片保存在本地硬盘,通过目录、关键词、评分和收藏夹高效整理图库,并提供 RAW 冲印、蒙版、镜头校正、批量同步及多格式导出等功能。

    Media Encoder macOS版
    Media Encoder macOS版

    Adobe Media Encoder 是 Adobe 推出的专业音视频编码与转码工具,可通过队列、预设和监视文件夹批量完成格式转换、代理文件创建及多平台成片输出,并与 Premiere Pro、After Effects 等软件紧密协作。

    Photoshop macOS版
    Photoshop macOS版

    Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理软件,提供图层、蒙版、选区、修复、调色、文字排版、智能对象及生成式编辑等能力。Mac 版支持 Intel 与 Apple Silicon 处理器。

    Premiere Pro macOS版
    Premiere Pro macOS版

    Adobe Premiere Pro 是面向专业视频制作的非线性剪辑软件,提供多轨时间线、调色、音频处理、字幕、代理工作流和多格式输出能力,并可与 After Effects、Audition、Photoshop 及 Frame.io 协同

    WINDOWS 更多
    IntelliJ IDEA Windows版
    IntelliJ IDEA Windows版

    JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

    PhpStorm Windows版
    PhpStorm Windows版

    PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

    PyCharm Windows版
    PyCharm Windows版

    PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

    WebStorm Windows版
    WebStorm Windows版

    WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

    Photoshop Windows版
    Photoshop Windows版

    Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许

    InDesign Windows版
    InDesign Windows版

    Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator

    Illustrator Windows版
    Illustrator Windows版

    Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。

    Bridge Windows版
    Bridge Windows版

    Adobe Bridge 是 Adobe 推出的创意资产管理工具,可集中预览、分类和查找照片、视频、PDF及多种设计文件,并支持元数据、关键词、评级、批量重命名和格式导出。它可与 Photoshop、Illustrator 等应用衔接,

    Lightroom Classic Windows版
    Lightroom Classic Windows版

    Adobe Lightroom Classic 是面向 Windows 桌面摄影工作流的照片管理与无损编辑工具,可通过目录集中整理大型图库,并完成 RAW 显影、局部蒙版、批量调整、打印和多格式导出。它强调本地文件管理与精细控制,

    Acrobat Pro Windows版
    Acrobat Pro Windows版

    Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

    After Effects Windows版
    After Effects Windows版

    Adobe After Effects 是面向动态图形、动画与影视视觉特效制作的专业工具,可完成关键帧动画、图层合成、遮罩跟踪、抠像、文字动画和二维三维元素整合。Windows 版通过 Adobe Creative Cloud 安装及更新,

    Media Encoder Windows版
    Media Encoder Windows版

    Adobe Media Encoder 是 Adobe 面向视频与音频制作流程提供的专业编码和转码工具,可批量处理媒体文件、创建代理、套用输出预设并监控文件夹自动执行任务。它与 Premiere、After Effects、Audition