• 【Java进阶篇】第二章 Java数组(上篇) 一维数组


    1、Array通识

    • Java中,数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object

    • 数组实际是个容器,可以同时容纳多个元素

    • 数组,即一组数据,是个数据集合

    • 数组当中可以存储基本数据类型,也可以存储引用数据类型的数据

    • 数组存储在堆当中
      在这里插入图片描述

    • 数组中如果存储的是Java对象的话,实际上存储的是引用(对象的内存地址)

    • 数组一旦创建,Java中规定长度不可变

    2、数组的分类

    Java中,数组分为一维数组、二维数组、三维数组、多维数组……

    Java中的数组对象都有length属性,用于获取数组中元素的个数

    Java中的数组,要求数组中元素类型要统一,如int数组则只能存int类型的数据

    3、一维数组的内存结构

    在这里插入图片描述

    • Java中,一维数组在内存中存储的时候,数组中元素的内存地址是连续的
    • 所有数组都是以首元素的内存地址做为整个数组对象的内存地址
    • 数组中每一个元素都是有下标的,从0开始,最后一个下标为length-1

    数组这种数据结构的优缺点:

    优点:

    • 查询检索某个下标上的元素效率极高(首先每个元素的内存地址连续,其次元素类型相同即占用的空间大小一样,直白说就是偏移量一样,这样一个数学表达式就能算出某个下标上元素的内存地址),是效率最高的一个数据结构

    缺点:

    • 为了保证元素内存地址的连续,在数组上随机增删元素时效率较低,因为会导致后面的元素统一向前向后位移(最后一个元素无影响,然而时间复杂度按照最坏的情况算)
    • 不能存储大量数据(不容易找到一块很大的连续的内存空间)

    4、一维数组的定义与初始化

    定义:

    //定义
    int[] array1;
    boolean[] array2;
    Object[] array3;
    
    • 1
    • 2
    • 3
    • 4

    初始化:

    静态初始化一维数组:
    int[] array = {100,200,300};
    
    动态初始化一维数组:
    int[] array = new int[5]; //5表示元素个数是5,元素值默认是0
    String[] names = new String[6]; //6个元素,默认值null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    5、一维数组中元素的访问

    //测试数组
    int[] a = {1,2,3,4,5};
    
    
    • 1
    • 2
    • 3

    (1)查

    通过数组名[下标]

    System.out.println("元素个数:"+ a.length); //数组对象的length属性
    System.out.println(a[0]); //首位元素
    System.out.println(a[a.length-1]); //末尾元素
    
    • 1
    • 2
    • 3

    (2)改

    数组名[下标] = values;

    a[0] = 111;
    a[a.length-1] = 9527;
    
    • 1
    • 2

    (3)遍历

    //正序遍历
    for(int i=0;i<a.length;i++){
    	System.out.println(a[i]);
    }
    
    //倒叙遍历
    for(int i=a.length-1;i>=0;i--){
    	System.out.println(a[i]);
    }
    
    //下标越界
    System.out.println(a[100]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    下标越界异常:ArrayIndexOutBoundException

    在这里插入图片描述

    6、动态初始化一维数组

    关于静态和动态初始化数组,静态即创建数组时,已确定个元素的值,如

    Object[] objects = {new Object(),new Object(),new Object(),new Object()};
    
    • 1

    动态初始化即后期再a[0]=xx;a[1]=xx;如:

    int[] a = new int[4];
    
    • 1

    举例:

    public static void printArray(String[] args){
            for(int i=0;i<args.length;i++){
                System.out.println(args[i]);
            }
        }
    
        public static void main(String[] args) {
        	//等价于String[] a = new String[3];
        	//再printArray(a);
            printArray(new String[3]);
    
            //直接传递静态数组是错误写法
            printArray({"1", "2", "3"});
    
            //这样是允许的
            printArray(new String[]{"1", "2", "3"});
    
            //或者改成这样也行
            String[] a = {"1", "2", "3"};
            printArray(a);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    部分截图:

    在这里插入图片描述

    7、main方法的传参是String数组

    到此,main方法中的传参也就明晰了,即一个String数组String[] args,数组名args

    
    public static void mian (String[] args){
    	System.out.println("JVM传的String数组的长度是:" + args.length);
    }
    
    • 1
    • 2
    • 3
    • 4

    结果:
    在这里插入图片描述
    分析:

    args做为一个引用,我们引用.length属性没有空指针异常,说明args不是null。即String[] args = {};
    或者说String[] args = new String[0]; ,就是说数组对象创建了,但里面没有数据。


    🍁那么String[] args数组何时会有值?

    String[] args数组是留给用户的,用户可以再控制台上输入参数,这些参数会被转化为String[] args

    关于这一点,举例如下: 细品!!
    在这里插入图片描述
    在这里插入图片描述

    8、数组中存储引用数据类型

    对于存引用数据类型的数组来说,实际上存的是Java对象的内存地址,数组中每个元素都是引用。
    在这里插入图片描述
    在这里插入图片描述

    9、数组的扩容

    Java中,数组长度一旦确定则不可变,当数组满了的时候,就需要扩容:

    • 先新建一个大容量的数组,然后将小容量数组中的数据一个个拷贝到大数组中(扩容效率很低)
    • 拷贝使用System类中的静态方法arrayCopy()
    //源代码
    public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);
    
    四个传参为:
    拷贝源数组、源数组的起点下标、目标数组(大数组)、目标的起点下标、拷贝长度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    Excel-VBA 快速上手(十三、日期的常见用法)
    unity编辑器报错Microsoft Visual C# Compiler version
    怎么参与场外期权?场外期权交易要注意什么?
    Spread for ASP.NET 15.2 个性化需求中文版
    addIdleHandler代码不执行
    node.js下载安装环境配置以及快速使用
    LVS负载均衡群集之原理叙述
    Vue2 +Element-ui实现前端页面
    Java Web——JavaScript运算符与流程语句
    【面试经典150 | 矩阵】矩阵置零
  • 原文地址:https://blog.csdn.net/llg___/article/details/127778104