带你学习java的数组军队列

简介: 带你学习java的数组军队列

一、数组概述

1.1、数组概念

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

1.2、 数组的特点:
  • 1 数组是序排列的
  • 2 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
  • 3 创建数组对象会在内存中开辟一整块连续的空间
  • 4 数组的长度一旦确定,就不能修改。
1.3、数组的定义
  • 数组的创建:

元素类型[] 数组名 = new 元素类型[元素个数或数组长度];

  • 声明数组变量
    必须在程序中声明数组,并指定数据类型;声明数据类型为int,容器使用数组那么如何标识数组呢?在java中我们使用[]符号标识,然后接着是定义数组的名称为arr,格式为 int[] arr。注意:int x[] 也是一种创建数组的格式。推荐使用int[] x 的形式声明数组。
  • 创建数组
    要使用一个新的关键字叫做new,new 用来在内存中产生一个容器实体,数据要存储是需要有空间的,存储很多数据的空间用new 操作符来开辟,new int[5]; 这个5是元素的个数。右边这部分就是在内存中定义了一个真实存在的数组,能存储5个元素。注意:new int[5] 做了两件事情,首先使用new int[3] 创建了一个数组,然后把这个数组的引用赋值给数组变量x。

思考: arr是属于什么数据类型?

任何一个变量都得有自己的数据类型。注意这个arr不是int 类型的 。int 代表的是容器里边元素的类型。那么x 是数组类型的,数组是一种单独的数据类型。数据类型分为2大派,分为基本数据类型和引用数据类型。 第二大派是引用数据类型。那么大家现在已经接触到了引用数据类型三种当中的一种。就是数组类型 [] 中括号就代表数组。

思考: int[] arr = new int[5];在内存中发生了什么?

内存任何一个程序,运行的时候都需要在内存中开辟空间.int[] arr = new int[5]; 这个程序在内存中是什么样?这就涉及到了java虚拟机在执行程序时所开辟的空间,那么Java开辟启动了多少空间呢?在后面我们会深入介绍。

定义数组主要有两种格式:

格式一:

元素类型[] 数组名 = new 元素类型[元素个数或数组长度]; 
示例:int[] arr1 = new int[5];
示例:float[] arr2 = new float[5];

格式二:

元素类型[] 数组名 = new 元素类型[]{元素,元素,……}; 
int[] arr1 = new int[]{3,5,1,7}; 
float[] arr2 = {1.3,1.5,1.1,1.7};

注意: 给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小,体现了数组长度固定的特点;创建数组之后不能修改数组的大小。可以使用length 属性获取数组的大小。

1.4、数组的初始化
  • 数组的声明与赋值
int[] arr = new int[2];
a[0] = 10;
a[1] = 20;

另一种方式也可以直接明确数组的长度,以及数组中元素的内容:

int[] arr = new int[]{20,30,40};
int[] arr = {20,30,40};

如果数组初始化中不使用运算符new。需要注意:下列写法是错误的:

int[] arr; 
arr = {20,30,40};

初始化数组,必须将声明,创建,初始化都放在一条语句中个,分开会产生语法错误。

二、一维数组

2.1、一维数组的声明与初始化

正确的方式:

int num;//声明
    num = 10;//初始化
int id = 1001;//声明 + 初始化
int[] ids;//声明
//1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行
  ids = new int[]{1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];
int[] arr4 = {1,2,3,4,5};//类型推断

错误的方式:

int[] arr1 = new int[];
int[5] arr2 = new int[5];
int[] arr3 = new int[3]{1,2,3};
2.2、一维数组元素的引用

通过角标的方式调用。

//数组的角标(或索引从0开始的,到数组的长度-1结束。
    names[0] = "王铭";
    names[1] = "王赫";
    names[2] = "张学良";
    names[3] = "孙居龙";
    names[4] = "王宏志";//charAt(0)
2.3、数组的属性:length
System.out.println(names.length);//5
System.out.println(ids.length);

说明:

数组一旦初始化,其长度就是确定的。arr.length

数组长度一旦确定,就不可修改。

2.4、一维数组的遍历
for(int i = 0;i < names.length;i++){
  System.out.println(names[i]);
}
2.5、数组元素的默认初始化值

数组元素是整型:

0 数组元素是浮点型:0.0

数组元素是char型:0或’\u0000’,而非’0’

数组元素是boolean型:false

数组元素是引用数据类型:null

三、二维数组

数组属于引用数据类型数组的元素也可以是引用数据类型

一个一维数组A的元素如果还是一个一维数组类型的,则此数组A称为二维数组。

3.1、二维数组的声明与初始化

正确的方式:

int[] arr = new int[]{1,2,3};//一维数组
    //静态初始化
    int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
    //动态初始化1
    String[][] arr2 = new String[3][2];
    //动态初始化2
    String[][] arr3 = new String[3][];
  //也是正确的写法:
    int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
    int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//类型推断
3.2、如何调用二维数组元素:
System.out.println(arr1[0][1]);//2
  System.out.println(arr2[1][1]);//null
    
  arr3[1] = new String[4];
  System.out.println(arr3[1][0]);
  System.out.println(arr3[0]);//
3.3、二维数组的属性:
System.out.println(arr4.length);//3
  System.out.println(arr4[0].length);//3
  System.out.println(arr4[1].length);//4
3.4、遍历二维数组元素
for(int i = 0;i < arr4.length;i++){
      
    for(int j = 0;j < arr4[i].length;j++){
        System.out.print(arr4[i][j] + "  ");
      }
      System.out.println();
  }
    
3.5、二维数组元素的默认初始化值

规定:二维数组分为外层数组的元素,内层数组的元素 int[][] arr = new int[4][3];

外层元素:arr[0],arr[1]等 内层元素:arr[0][0],arr[1][2]等 ⑤ 数组元素的默认初始化值

针对于初始化方式一:比如:int[][] arr = new int[4][3]; 外层元素的初始化值为:地址值

内层元素的初始化值为:与一维数组初始化情况相同 针对于初始化方式二:比如:int[][] arr = new int[4][];

外层元素的初始化值为:null 内层元素的初始化值为:不能调用,否则报错。

四、数组算法

了解以上数组的使用之后,我们需要手写出一下问题:

  • 数组的创建与元素赋值:
    杨辉三角(二维数组)、回形数(二维数组)、6个数,1-30之间随机生成且不重复。
  • 针对于数值型的数组:
    最大值、最小值、总和、平均数等
  • 数组的赋值与复制
  • 数组元素的反转
  • 数组中指定元素的查找:搜索、检索
  • 数组的排序算法

五、总结- 为什么数组的索引从0开始?

1、为什么索引是从0开始的,而不是从1开始呢?这是继承了汇编语言的传统,从0开始更利于计算机做二进制的运算和查找。

2、数组长度使用length属性获得,但实际上这个属性只能表示一个一维数组的长度。二维数组length属性呢

3、数组会发生哪些异常呢

相关文章
|
3天前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1天前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
3天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
18 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
5天前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
15 2
|
7天前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
13 3
|
8天前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
24 1
|
8天前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
16 1
|
8天前
|
算法 Java API
【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)
16 1
|
4天前
|
Java 大数据 开发工具
java学习——环境准备(1)
java学习——环境准备(1)
15 0
|
8天前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
21 0