首页 > 其他分享 >第五章 数组

第五章 数组

时间:2023-06-04 18:45:01浏览次数:56  
标签:arr int 元素 数据类型 存储 第五章 数组

1. 数组的概述

1.1 概念

概念:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

简称:多个数据的组合

数组中的概念

  • 数组名
  • 下标(或索引)
  • 元素
  • 数组的长度

image

数组的特点:

  • 数组本身是引用数据类型​,而数组中的元素可以是任何数据类型​,包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间​。占据的空间的大小,取决于数组的长度和数组中元素的类型。
  • 数组中的元素在内存中是依次紧密排列的,有序的。
  • 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改​。
  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
  • 数组名中引用的是这块连续空间的首地址。

1.2 数组的分类

1、按照元素类型分:

  • 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
  • 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)(在面向对象部分讲解)

2、按照维度分:

  • 一维数组:存储一组数据
  • 二维数组:存储多组数据,相当于二维表,一行代表一组数据,只是这里的二维表每一行长度不要求一样。

image

2. 数组的使用

一维数组的使用: ​

  • 数组的声明和初始化
  • 调用数组的指定元素
  • 数组的属性:length,表示数组的长度
  • 数组的遍历
  • 数组元素的默认初始化值
  • 一维数组的内存解析(难)

2.1 一维数组的声明

格式:

//推荐
元素的数据类型[] 一维数组的名称;

//不推荐
元素的数据类型  一维数组名[];

数组的声明,需要明确:

(1)数组的维度:在 Java 中数组的符号是[],[]表示一维,[][**]表示二维。**

(2)数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的 Java 的数据类型。例如:int、String、Student 等。

(3)数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据。

2.2 一维数组的初始化

静态初始化 :

  • 如果数组变量的初始化和数组元素的赋值操作同时进行,那就称为静态初始化。

  • 静态初始化,本质是用静态数据(编译时已知)为数组初始化。此时数组的长度由静态数据的个数决定。

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

动态初始化:

  • 数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。

  • 动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值。

    数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];
    
    或
    
    数组存储的数据类型[] 数组名字;
    数组名字 = new 数组存储的数据类型[长度];
    

2.3 数组元素的默认值

image

3. 一维数组内存分析

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

java 虚拟机架构图:

image

区域名称 作用
虚拟机栈 用于存储正在执行的每个 Java 方法的局部变量表等。局部变量表存放了编译期可知长度 的各种基本数据类型、对象引用,方法执行完,自动释放。
堆内存 存储对象(包括数组对象),new 来创建的,都存储在堆内存。
方法区 存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据。
本地方法栈 当程序中调用了 native 的本地方法时,本地方法执行期间的内存区域
程序计数器 程序计数器是 CPU 中的寄存器,它包含每一个线程下一条要执行的指令的地址

3.1 一维数组在内存中的存储

与目前数组相关的内存结构: 比如:int[] arr = new int[]{1,2,3};

  • 虚拟机栈:用于存放方法中声明的变量。比如:arr
  • 堆:用于存放数组的实体(即数组中的所有元素)。比如:1,2,3

一个一维数组内存图:

public static void main(String[] args) {
  	int[] arr = new int[3];
  	System.out.println(arr);//[I@5f150435
}

image

数组下标为什么是 0 开始的 :

  • 因为第一个元素距离数组首地址间隔 0 个单元格

两个一维数组内存图:

两个数组独立

public static void main(String[] args) {
    int[] arr = new int[3];
    int[] arr2 = new int[2];
    System.out.println(arr);
    System.out.println(arr2);
}

image

两个变量指向一个一维数组

两个数组变量本质上代表同一个数组。

public static void main(String[] args) {
    // 定义数组,存储3个元素
    int[] arr = new int[3];
    //数组索引进行赋值
    arr[0] = 5;
    arr[1] = 6;
    arr[2] = 7;
    //输出3个索引上的元素值
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);
    //定义数组变量arr2,将arr的地址赋值给arr2
    int[] arr2 = arr;
    arr2[1] = 9;
    System.out.println(arr[1]);
}

image

4. 数组的常用算法

  • 数值型数组的特征值的计算:最大值、最小值、总和、平均值等

  • 数组元素的赋值。比如:杨辉三角;彩票随机生成数(6 位;1-30;不能重复);回形数

  • 数组的复制、赋值

  • 数组的反转

  • 数组的扩容、缩容

  • 数组的查找

    • 线性查找
    • 二分法查找(前提:数组有序)
  • 数组的排序

    • 冒泡排序:最简单
    • 快速排序:最常用

5. Arrays 工具类的使用

熟悉一下内部的常用的方法

  • toString() / sort() / binarySearch()

5. 数组中常见的异常

  • ArrayIndexOutOfBoundsException
  • NullPointerException

标签:arr,int,元素,数据类型,存储,第五章,数组
From: https://www.cnblogs.com/NorthPoet/p/17456071.html

相关文章

  • 数组的均值分割
    给定你一个整数数组 nums我们要将 nums 数组中的每个元素移动到 A 数组或者 B 数组中,使得 A 数组和 B 数组不为空,并且 average(A)==average(B)首先将问题转化为求目标和为特定值将所有数乘以n减去总和,转化成为求目标值为为0的数组,同时避免出现小数情况1.折......
  • 树状数组的思想复习
    树状数组的复习前言:学树状数组的时候第一没理解透彻,第二还没写博客用于复习,所以这里写一下用于复习树状数组:作用:lognlogn时间实现单点修改区间查询;区间修改单点查询;区间修改区间查询。但是区间修改区间查询还是线段树好,因为扩展性很强特点:父子节点关系例如当前节点为x,那么......
  • [USACO07JAN] Balanced Lineup G(树状数组)
    题目大意:给出长度为n的数组和q个询问,每次问(x,y)区间内最大值和最小值的差是多少思路:1.适合用树状数组做此区间求值,首先要明白普通的树状数组的tree[x]表示区间(x-(x&-x),x]的区间和,现在改为求最值,则tree[x]表示为区间(x-(x&-x),x]的最值,建树部分稍作改变即可,询问部分......
  • 交换数组
    #include<iostream>#include<iomanip>usingnamespacestd;intmain(intargc,char**argv){ inta[10][10],c,d; for(inti=1;i<=5;i++){ for(intj=0;j<5;j++){ cin>>a[i][j]; } } cin>>c>>d; for(inti=0;i<=5;......
  • 二维数组
    //两个矩阵的乘积之和#include<iostream>usingnamespacestd;intmain(){inta[5][5],b[5][5],sum=0;for(inti=0;i<5;i++){for(intj=0;j<5;j++){cin>>a[i][j];}}for(inti=0;i<5;i++){......
  • 6.6 数组排序案例分析
    冒泡排序classArrayUtil{publicstaticvoidsort(intdata[]){for(intx=0;x<data.length;x++){for(inty=0;y<data.length-x-1;y++){//注意这里的-x-1含义;if(data[y]<data[y+1]){......
  • 数组去重
    数组去重是前端开发中比较常见的问题,有多种方法可以实现:使用Set去重(ES6)constarr=[1,1,2,3,4,4,5];constuniqueArr=[...newSet(arr)];console.log(uniqueArr);//[1,2,3,4,5]使用filter去重constarr=[1,1,2,3,4,4,5];constuniqueArr=......
  • 一维数组名的sizeof计算大小
    intmain(){ //数组名是首元素地址 //1,sizeof(数组名)——数组名表示整个数组 //2,&数组名——表示整个数组 //除这两种情况外,都是首元素地址 // inta[]={1,2,3,4}; printf("%d\n",sizeof(a));//szieof(数组名),计算的是数组的总大小—单位字节—16 printf("%d\n",sizeof(a......
  • 6.4 二维数组
    定义一个静态的二维数组,并用2种循环语句给输出publicclassHelloWorld{publicstaticvoidmain(String[]args){intdata[][]=newint[][]{{1,2,3,4,5},{4,5,6},{7,8,9,10}};for(intx=0;x<data.length;x++)......
  • 6.5 数组与方法
    demo1publicclassHelloWorld{publicstaticvoidmain(String[]args){//对于引用数据类型而言,主要的特点是可以与方法进行引用传递//而数组本身也是引用数据类型//demo:实现一个数组的引用传递intdata[]=newint[]{1,2......