1- 数组概述

需求:现在需要统计某公司员工的工资情况,例如计算平均工资、找到最高工资等。假设该公司有80名员工,用前面所学的知识,程序首先需要声明80个变量来分别记住每位员工的工资,然后在进行操作,这样做会显得很麻烦。为了解决这种问题,Java就提供了数组供我们使用。

那么数组到底是什么呢?有什么特点呢?通过上面的分析:我们可以得到如下两句话:

  1. 数组是存储多个变量(元素)的东西(容器)
  2. 这多个变量的数据类型要一致

2- 数组的定义格式

2.1- 数组概念

数组是存储同一种数据类型多个元素的容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。

2.2- 数组的定义格式

格式1:数据类型[] 数组名;
格式2:数据类型 数组名[];
注意:这两种定义做完了,数组中是没有元素值的。

3- 数组的初始化

3.1- 数组初始化概述:

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

3.2- 数组的初始化方式

  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值

格式:数据类型[] 数组名 = new 数据类型[数组长度];
注意:数组长度其实就是数组中元素的个数。
举例:
int[] arr = new int[3];
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。

代码示例一:

/** 数组:存储同一种数据类型的多个元素的容器。* * 定义格式:*        A:数据类型[] 数组名;*      B:数据类型 数组名[];* 举例:*      A:int[] a; 定义一个int类型的数组,数组名是a*       B:int a[]; 定义一个int类型的变量,变量名是a数组* * 数组初始化:*        A:所谓初始化,就是为数组开辟内存空间,并为数组中的每个元素赋予初始值*      B:我们有两种方式对数组进行初始化*          a:动态初始化 只指定长度,由系统给出初始化值*             b:静态初始化 给出初始化值,由系统决定长度* * 动态初始化:*         数据类型[] 数组名 = new 数据类型[数组长度];*/
public class ArrayDemo {public static void main(String[] args) {//数据类型[] 数组名 = new 数据类型[数组长度];int[] arr = new int[3];/** 左边:*      int:说明数组中的元素的数据类型是int类型*        []:说明这是一个数组*        arr:是数组的名称* 右边:*         new:为数组分配内存空间*      int:说明数组中的元素的数据类型是int类型*        []:说明这是一个数组*        3:数组的长度,其实就是数组中的元素个数*/}
}
  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度

代码示例二:

/** 静态初始化的格式:*        数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};* *       简化格式:*           数据类型[] 数组名 = {元素1,元素2,...};* *         举例:*             int[] arr = new int[]{1,2,3};* *       简化后:*            int[] arr = {1,2,3};*/
public class ArrayDemo2 {public static void main(String[] args) {//定义数组int[] arr = {1,2,3};//输出数组名和元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);}
}

4- 数组内存的分配

4.1- JVM内存划分

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

  1. 栈 存储局部变量
  2. 堆 存储new出来的东西
  3. 方法区 (面向对象进阶讲)
  4. 本地方法区 (和系统相关)
  5. 寄存器 (给CPU使用)

4.2- 一个数组的内存图

定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素

/** 需求:定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。*/
public class ArrayTest {public static void main(String[] args) {//定义一个数组int[] arr = new int[3];//输出数组名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);//给数组中的元素赋值arr[0] = 100;arr[2] = 200;//再次输出数组名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);}
}

图解

4.3- 两个数组的内存图

定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素

/** 需求:定义两个数组,分别输出数组名及元素。然后分别给数组中的元素赋值,分别再次输出数组名及元素。*/
public class ArrayTest2 {public static void main(String[] args) {//定义两个数组int[] arr = new int[2];int[] arr2 = new int[3];//分别输出数组名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr2);System.out.println(arr2[0]);System.out.println(arr2[1]);System.out.println(arr2[2]);//然后分别给数组中的元素赋值arr[1] = 100;arr2[0] = 200;arr2[2] = 300;//再次输出数组名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr2);System.out.println(arr2[0]);System.out.println(arr2[1]);System.out.println(arr2[2]);}
}

图解

4.4- 两个数组指向同一个地址的内存图

定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。然后给第二个数组赋值,再次输出两个数组的名及元素

/** 需求:定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。* 然后给第二个数组赋值,再次输出两个数组的名及元素。*/
public class ArrayTest3 {public static void main(String[] args) {// 先定义一个数组,赋值,输出int[] arr = new int[3];arr[0] = 100;arr[1] = 200;arr[2] = 300;System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);// 然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组int[] arr2 = arr;// 然后给第二个数组赋值arr2[0] = 111;arr2[1] = 222;arr2[2] = 333;// 再次输出两个数组的名及元素System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr2);System.out.println(arr2[0]);System.out.println(arr2[1]);System.out.println(arr2[2]);}
}

图解

5- 数组的使用

5.1- 数组的元素访问

/** 数组:存储同一种数据类型的多个元素的容器。* * 定义格式:*        A:数据类型[] 数组名;*      B:数据类型 数组名[];* 举例:*      A:int[] a; 定义一个int类型的数组,数组名是a*       B:int a[]; 定义一个int类型的变量,变量名是a数组* * 数组初始化:*        A:所谓初始化,就是为数组开辟内存空间,并为数组中的每个元素赋予初始值*      B:我们有两种方式对数组进行初始化*          a:动态初始化 只指定长度,由系统给出初始化值*             b:静态初始化 给出初始化值,由系统决定长度* * 动态初始化:*         数据类型[] 数组名 = new 数据类型[数组长度];*/
public class ArrayDemo {public static void main(String[] args) {//数据类型[] 数组名 = new 数据类型[数组长度];int[] arr = new int[3];/** 左边:*      int:说明数组中的元素的数据类型是int类型*        []:说明这是一个数组*        arr:是数组的名称* 右边:*         new:为数组分配内存空间*      int:说明数组中的元素的数据类型是int类型*        []:说明这是一个数组*        3:数组的长度,其实就是数组中的元素个数*/`System.out.println(arr); //[I@3fa5ac,地址值//我们获取到地址值没有意义,我要的是数组中的数据值,该怎么办呢?//不用担心,java已经帮你想好了//其实数组中的每个元素都是有编号的,编号是从0开始的,最大的编号就是数组的长度-1//用数组名和编号的配合我们就可以获取数组中的指定编号的元素//这个编号的专业叫法:索引//格式:数组名[编号] -- 数组名[索引]System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);}
}

5.2- 数组使用的两个小问题

/** 两个常见小问题:*         A:java.lang.ArrayIndexOutOfBoundsException*             数组越界异常*             产生的原因:就是你访问了不存在的索引元素。*       B:java.lang.NullPointerException*           空指针异常*          产生的原因:数组已经不指向堆内存的数据了,你还使用数组名去访问元素。* 为什么我们要记住这样的小问题呢?*         编程不仅仅是把代码写出来,还得在出现问题的时候能够快速的解决问题。*/
public class ArrayDemo {public static void main(String[] args) {// 定义数组int[] arr = { 1, 2, 3 };//System.out.println(arr[3]);//引用类型:类,接口,数组//常量:空常量 null,是可以赋值给引用类型的//arr = null;System.out.println(arr[1]);}
}

6- 一维数组遍历示例:

/** 需求:数组遍历(依次输出数组中的每一个元素)* 获取数组中元素的个数:数组名.length*/
public class ArrayTest {public static void main(String[] args) {// 定义数组int[] arr = { 11, 22, 33, 44, 55 };// 原始做法System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr[3]);System.out.println(arr[4]);System.out.println("--------------------");// 用for循环改进for (int x = 0; x < 5; x++) {System.out.println(arr[x]);}System.out.println("--------------------");//为了解决我们去数数组中元素个数的问题,数组就提供了一个属性:length//用于获取数组的长度//格式:数组名.lengthSystem.out.println("数组共有:"+arr.length+"个");System.out.println("--------------------");for(int x=0; x<arr.length; x++) {System.out.println(arr[x]);}}
}

图解:数组操作之获取最值

代码示例:

/** 需求:数组获取最值(获取数组中的最大值最小值)*/
public class ArrayTest2 {public static void main(String[] args) {//定义数组int[] arr = {12,98,45,73,60};//定义参照物int max = arr[0];//遍历数组,获取除了0以外的所有元素,进行比较for(int x=1; x<arr.length; x++) {if(arr[x] > max) {max = arr[x];}}System.out.println("数组中的最大值是:"+max);}
}

7- 二维数组

7.1- 二维数组概述

每个班有很多个学生,所以,可以用数组来存储,而我们又同时有很多个班。这个也应该用一个数组来存储。如何来表示这样的数据呢?Java就提供了二维数组供我们使用。
由此可见:其实二维数组其实就是一个元素为一维数组的数组。

7.2- 二维数组格式

  1. 定义格式
    数据类型[][] 数组名;
    数据类型 数组名[][]; 不推荐
    数据类型[] 数组名[]; 不推荐
  2. 初始化方式
    数据类型[][] 变量名 = new 数据类型[m][n];
    数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
  3. 简化版格式:数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};

代码示例:

/** 二维数组:就是元素为一维数组的数组。* * 定义格式:*       A:数据类型[][] 数组名;*        B:数据类型 数组名[][]; 不推荐*        C:数据类型[] 数组名[]; 不推荐* * 如何初始化呢?*         A:动态初始化*            数据类型[][] 数组名 = new 数据类型[m][n];*            m表示这个二维数组有多少个一维数组*          n表示每一个一维数组的元素有多少个*      B:静态初始化*          数据类型[][] 数组名 = new 数据类型[][]{{元素...},{元素...},{元素...},...};*           简化格式:*           数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};*/
public class ArrayArrayDemo {public static void main(String[] args) {// 数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };System.out.println(arr); // [[I@104c575System.out.println(arr.length); // 二维数组中的一维数组的个数System.out.println(arr[0]);// [I@3fa5acSystem.out.println(arr[0].length);System.out.println(arr[1]);// [I@95cfbeSystem.out.println(arr[2]);// [I@179dce4//我如何获取到一个二维数组的元素呢?System.out.println(arr[0][0]);System.out.println(arr[1][1]);System.out.println(arr[2][0]);}
}

7.3- 二维数组的遍历

遍历思想:首先使用循环遍历出二维数组中存储的每个一维数组,然后针对每个遍历到的一维数组在使用循环遍历该一维数组中的元素

/** 二维数组遍历* * System.out.println():输出内容并换行* System.out.print():输出内容* System.out.println():换行*/
public class ArrayArrayTest {public static void main(String[] args) {// 定义二维数组int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };// 二维数组中的一维数组名称:二维数组名[索引]// arr[0] 其实就是二维数组中的第一个一维数组的名称// arr[1] 其实就是二维数组中的第二个一维数组的名称// arr[2] 其实就是二维数组中的第三个一维数组的名称// for (int x = 0; x < arr[0].length; x++) {// System.out.println(arr[0][x]);// }// System.out.println("hello");// System.out.println("world");// System.out.print("hello");// System.out.print("world");/*// 第一个一维数组的元素for (int x = 0; x < arr[0].length; x++) {System.out.print(arr[0][x] + "  ");}System.out.println();// 第二个一维数组的元素for (int x = 0; x < arr[1].length; x++) {System.out.print(arr[1][x] + "  ");}System.out.println();// 第三个一维数组的元素for (int x = 0; x < arr[2].length; x++) {System.out.print(arr[2][x] + "  ");}System.out.println();*///      for(int y=0; y<3; y++) {
//          for (int x = 0; x < arr[y].length; x++) {
//              System.out.print(arr[y][x] + "  ");
//          }
//          System.out.println();
//      }for(int y=0; y<arr.length; y++) {for (int x = 0; x < arr[y].length; x++) {System.out.print(arr[y][x] + "  ");}System.out.println();}}
}

JAVA笔记- JAVA一维、二维数组的遍历与使用详解相关推荐

  1. python画二维散点图-基于python 二维数组及画图的实例详解

    1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71 ...

  2. python画二维数组散点图_基于python二维数组及画图的实例详解

    基于python二维数组及画图的实例详解 下面小编就为大家分享一篇基于python 二维数组及画图的实例详解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.二维数组取值 注:不管 ...

  3. C++笔记 二维数组作为函数的参数详解 三种传参的方法总结 注意要点总结

    文章目录 1.C/C++ 二维数组作为函数的参数 2.不合法写法总结 3.测试案例 3.1 传参方式1 3.2 传参方式2 3.3 传参方式3 4.运行结果 5.总结 1.C/C++ 二维数组作为函数 ...

  4. python 二维数组心得_基于python 二维数组及画图的实例详解

    python中如何使用二维数组 在Python中,一个像这样的多维表格可以通过"序列的序列"实现.一个表格是行的序列.每一行又是独立单元格的序列.这类似于小编们使用的数学记号,在数 ...

  5. java二维数组的遍历

    java二维数组的遍历 /* * java二维数组的遍历 * 二维数组,数组座位数组元素类型的数组,数组的数组 * */ public class Test14 {public static void ...

  6. php 冒泡排序数组,php一维二维数组键之冒泡排序

    php一维二维数组键之冒泡排序 功能:对数组进行重新排序. 说明:冒泡排序 (一维数组)(二维数组某个健排序) 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据 ...

  7. 算法笔记-螺旋输出二维数组

    算法笔记-螺旋输出二维数组 1.思路:二维数组看做一个坐标,遍历者当成一个人,那么我们定义这个人的位置,以及当前面朝的方向,还有这个人转向次数.初始位置,人在(x,y)=(0,0)处,面向右方,右方的 ...

  8. 二维数组--二维数组的遍历

    二维数组的遍历 int[][] arr = {{1,2},{11,22,33},{100,200,300},{10,20,30,40}}; 分析: 1.先获取每一个一维数组 2.依次遍历每一个一维数组 ...

  9. 数组: 数组的遍历: 二维数组: 二维数组的遍历方式:

    数组:   变量: 存储单个数据 数组: 存储多个数据数组: 相同数据类型的有序集合一段连续的内存空间特点:1.引用数据类型2.长度一旦确定不可改变3.存储的多个数据要求数据类型一致4.数组是有序的索 ...

最新文章

  1. Python中的ThreadLocal变量
  2. [No0000119]什么是柳比歇夫的时间事件记录法
  3. 1070 结绳 (25 分
  4. mysql数据库语句分类_细数MySQL中SQL语句的分类
  5. Flume的Source
  6. 材料科学与工程考计算机,计算机在材料科学与工程中应用作业.pdf
  7. JVM调优总结:一些概念
  8. 阿里云云计算 16 块存储的概念
  9. idea中加入git版本控制
  10. 矩阵的 正定与半正定
  11. linux sz命令 二进制,ubuntu下rz/sz命令的安装与使用说明
  12. CardView-卡片布局
  13. 关于goole IO大会发布的android M和android studio1.3的更新
  14. 数组的entries()方法
  15. 大华摄像头WEB页面集成
  16. 少年,请多一些开疆拓土的勇气——写给在C和C++间犹豫的学生
  17. 苹果开发者账号申请 App IDs(应用身份证)
  18. [基本功]支持向量机(SVM)理论知识
  19. ivew 的offset用法
  20. vcs的加密protect

热门文章

  1. 虚拟机安装出现directory ezboot not found error loading image:CDMENU.EZB的问题解决方案
  2. 关于硕士研究生延毕的几问几答
  3. 面向气象灾害预警信息的5G网络切片技术研究
  4. 数列的组合及排列方式java_java数组排列组合
  5. MUI-list(列表),普通列表、带箭头列表、带数字角标列表、带图文列表
  6. 【回归预测-BP预测】基于灰狼算法优化BP神经网络实现数据回归预测附matlab代码
  7. html打开浏览器协议,通过私有协议在Chrome浏览器网页中打开本地程序
  8. UglifyJS和Uglifycss使用
  9. uniapp通过uni.addInterceptor实现路由拦截功能
  10. vue 打包失败问题UglifyJs Unexpected token: name