JAVA中数组的基本概念与用法

1. 数组的定义与特点

  • 数组的一种引用数据类型
  • 数组中可以同时存放多个数据,但是数据的类型必须统一
  • 数组的长度在开始时就需要确定,在程序运行期间是不可改变的
    • 虽然可以使用数组的扩容机制来扩充数组的长度,但是这个方法也比较麻烦

2. 数组的初始化

  • 数组的初始化方式有两种

    1. 动态初始化
    2. 静态初始化

    动态初始化特点:

    ​ 在创建数组的时候,直接指定数组当中的数据元素个数。

    动态初始化数组的格式:

    数据类型[] 数组名称 = new 数据类型[数组长度];

    解析含义:

    左侧数据类型:也就是数组当中保存的数据,全都是统一的什么类型

    左侧的中括号:代表是一个数组

    左侧数组名称:给数组取一个名字

    右侧的new:代表创建数组的动作

    右侧数据类型:必须和左边的数据类型保持一致

    右侧中括号的长度:也就是数组当中,到底可以保存多少个数据,是一个int数字

    • 动态创建数组的示例代码:
    // 数据类型[] 数组名称 = new 数据类型[数组长度];
    // 定义一个int类型的数组,可以存放10个数据
    int[] arrayA = new int[10]; // 给创建的数组赋值
    for (int i = 0; i < 10; i ++){
    arrayA[i] = i;
    } // 输出数组中的值
    for (int i = 0; i < 10; i ++){
    System.out.print(arrayA[i]);
    }
    • 静态初始化数组

      • 静态初始化数组的特点:

        ​在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。

      • 静态初始化基本格式:

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

      • 注意事项:

        ​虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度

      • 静态初始化数组示例代码

        // 数据类型[] 数组名称 = new 数据类型[] { 元素1, 元素2, ... };
        // 创建一个数组,一开始数组中就有1,2,3,4,5 这些值
        int [] arrayA = new int[] {1, 2, 3, 4, 5,};
        // 输出数组中的使用元素
        for (int i = 0; i < arrayA.length; i ++){
        System.out.print(arrayA[i]);
        }

  • 数组初始化的省略格式

    • 标准格式:

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

    • 省略格式:

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

    • 注意事项:

    1. 静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
    2. 静态初始化标准格式可以拆分成为两个步骤。
    3. 动态初始化也可以拆分成为两个步骤。
    4. 静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。
    • 使用建议:

      如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。

    • 示例代码

// 省略格式的静态初始化
int[] arrayA = { 10, 20, 30 }; // 静态初始化的标准格式,可以拆分成为两个步骤
int[] arrayB;
arrayB = new int[] { 11, 21, 31 }; // 动态初始化也可以拆分成为两个步骤
int[] arrayC;
arrayC = new int[5]; // 静态初始化的省略格式,不能拆分成为两个步骤。(错误写法,编译器直接报错)
// int[] arrayD;
// arrayD = { 10, 20, 30 };
}

3. 获取数组中的元素

  • 使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:

    如果是整数类型,那么默认为0;

    如果是浮点类型,那么默认为0.0;

    如果是字符类型,那么默认为'\u0000';

    如果是布尔类型,那么默认为false;

    如果是引用类型,那么默认为null。

  • 注意事项:

    静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。

  • 对于数组而言,数组的下标是从0开始的,访问的时候需要注意。

 // 创建一个数组
int[] arrayA = new int[10];
// 给数组中添加元素,数组的下标从0开始;
arrayA[0] = 1;
arrayA[1] = 2;
arrayA[2] = 3; // 直接定义数组的名称,将输出数组在内存中经过哈希得到的地址值
System.out.println(arrayA); // 使用Arrays中的toString()方法输出数组,
// 从得到的结果中会发现没有赋值的位置会自动使用0补齐。
System.out.println(Arrays.toString(arrayA)); // 获取数组中一个指定位置的元素值
// 例如:获取下标为0的元素值
System.out.println(arrayA[0]);

4.Java中的内存划分(图片来自网络)

5. 假设一个数组的内存图

  • 栈中的变量地址指向堆中的内存地址

6. JAVA中的浅拷贝

  • 如果在JAVA中发生了如下代码的赋值方式,那么整个就是浅拷贝,即arrayB数组修改数组中的元素值之后会影响arrayA中的数组的元素值。

    int[] arrayA = new int[3];
    System.out.println(arrayA); // 地址值
    System.out.println(arrayA[0]); // 0
    System.out.println(arrayA[1]); // 0
    System.out.println(arrayA[2]); // 0
    System.out.println("=============="); arrayA[1] = 10;
    arrayA[2] = 20;
    System.out.println(arrayA); // 地址值
    System.out.println(arrayA[0]); // 0
    System.out.println(arrayA[1]); // 10
    System.out.println(arrayA[2]); // 20
    System.out.println("=============="); // 特别注意这个地方
    // 将arrayA数组的地址值,赋值给arrayB数组
    int[] arrayB = arrayA;
    System.out.println(arrayB); // 地址值
    System.out.println(arrayB[0]); // 0
    System.out.println(arrayB[1]); // 10
    System.out.println(arrayB[2]); // 20
    System.out.println("=============="); arrayB[1] = 100;
    arrayB[2] = 200;
    System.out.println(arrayB); // 地址值
    System.out.println(arrayB[0]); // 0
    System.out.println(arrayB[1]); // 100
    System.out.println(arrayB[2]); // 200
    }
    • 内存示例图

7. 数组越界的异常信息

  • 示例代码

    // 数据类型[] 数组名称 = new 数据类型[数组长度];
    // 定义一个int类型的数组,可以存放10个数据
    int[] arrayA = new int[10];
    // 给创建的数组赋值
    for (int i = 0; i < 10; i ++){
    arrayA[i] = i;
    }
    // 想要定义下标为10的对应元素值,但是数组的最大长度只是9,
    // 因为数组的下标是从0开始的,虽然在编译器不会报错,
    // 但是在运行期会直接抛出数组越界异常信息。
    System.out.println(arrayA[10]);
    • 异常信息截图

8. 数组中的空指针异常

int[] arrayA = null;
System.out.println(arrayA[0]);

9. 获取数组的长度

// 数据类型[] 数组名称 = new 数据类型[数组长度];
// 定义一个int类型的数组,可以存放10个数据
int[] arrayA = new int[10];
// length可以获取数组的长度
System.out.println(arrayA.length);

JAVA中数组的基本概念与用法的更多相关文章

  1. JAVA中数组Arrays类的常见用法

    import java.util.Arrays; int[] array1={7,8,3,2,12,6,5,4}; 1.  //克隆clone  int[] array2=array1.clone() ...

  2. Java中数组的特性

    转载:http://blog.csdn.net/zhangjg_blog/article/details/16116613 数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具 ...

  3. Java 中数组的内存分配

    Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...

  4. Android中Cursor类的概念和用法[转]

    首页 > 程序开发 > 移动开发 > Android > 正文   Android中Cursor类的概念和用法 2011-09-07      0个评论       收藏    ...

  5. Java中数组在内存中的存放原理?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyong0717/article/details/79165685Java中数组被实现为对象, ...

  6. java中数组的相关知识

      1. 2.数组的命名方法 1)int[]ages=new int[5]; 2) int[]ages; ages=new int[5]; 3)int[]ags={1,2,3,4,5}; 4)int[ ...

  7. 在java 中,数组与 List<T> 类型的相互转换

    在java中,数组与List<T> 之前进行互相转换,转换方法可总结为以下几种: 一. 将 数组转换成List<T> 1. 使用 Collections 的addAll 方法 ...

  8. Java中数组的初始化方式

    Java中数组的初始化方式    初始化方式有两种: 1.静态初始化:初始化时由程序猿显式指定每一个数组元素的初始值,由系统指定数组长度 2.动态初始化:初始化时由程序猿仅仅指定数组长度,由系统为数组 ...

  9. JAVA中的break[标签]continue[标签]用法

    原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...

随机推荐

  1. 【做题记录】[NOIP2016 普及组] 魔法阵

    P2119 魔法阵 2016年普及组T4 题意: 给定一系列元素 \(\{X_i\}\) ,求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 . \[\begin{cases}X_ ...

  2. Git 极速上手(超简单)

    前言:本文主要介绍了一种快速入门使用Git的方法,通过四步完成本地仓库构建和推送到远程仓库(Github.Gitee码云),简单说明最常用的命令,不需要明白Git的原理即可使用,本文不介绍具体原理. ...

  3. dubbo 配置 loadbalance 不生效?撸一把源码

    背景 很久之前我给业务方写了一个 dubbo loadbalance 的扩展(为了叙述方便,这个 loadbalance 扩展就叫它 XLB 吧),这两天业务方反馈说 XLB 不生效了 我心想,不可能 ...

  4. cesium制作自己的骑行轨迹

    制作自己的骑行轨迹 马上国庆节了,计划骑车回家,突然想到把所有的骑行线路汇总一下,无奈码表和APP不支持这样的操作,出于职业病,在此操作一下. 我用的是黑鸟码表,可以导出fit运动轨迹,但是fit还需 ...

  5. Docker 制作Nginx镜像

    参考文章:https://www.jianshu.com/p/dc4cd0547d1e 镜像的制作方式有两种,一种是下载别人的镜像之后再制作成自己的镜像,一种是从头开始制作自己的镜像 第一种,下载别人 ...

  6. Linux 权限控制

    权限管理概述 为什么要进行权限管理? 因为在生产服务器上,如果要让普通用户登录,就要给他分配合理的权限,在服务器上需要为用户严格定义权限等级,否则如果所有人都是roσt权限,权限过高容易导致岀现误操作 ...

  7. Linux ns 5. IPC Namespace 详解

    文章目录 1. 简介 2. 源码分析 2.1 copy_ipcs() 2.2 ipcget() 2.3 ipc_check_perms() 2.4 相关系统调用 参考文档: 1. 简介 进程间通讯的机 ...

  8. 深入理解Spring IOC容器及扩展

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  9. 使用bs4中的方法爬取星巴克数据

    import urllib.request # 请求url url = 'https://www.starbucks.com.cn/menu/' # 模拟浏览器发出请求 response = urll ...

  10. 不可忽视的Dubbo线程池

    问题描述 线上突然出现Dubbo超时调用,时间刚好为Consumer端设置的超时时间. 有好几个不同的接口都报超时了 第1次调用超时,第2次(或第3次)重试调用非常快(正常水平) Dubbo调用超时的 ...