数组
1 数组的定义
数组是存储相同类型的多个元素的连续空间。
2 数组的分类
- 类型:基本类型数组 引用类型数组(对象数组)
- 维度:一维 二维 三维 多维
3 数组的特点
- 数组所存储的元素的类型必须的同种类型。
- 数组的长度是有限的,是固定的,一旦声明,则不能修改。
- 数组的空间是连续的。
- 数组中的元素是通过索引(下标/角标)来进行引用。
4 数组的声明和初始化
public static void main(String[] args) {
//声明数组 数据类型[] 数组的名称(标识符) = new 数据类型[数组的长度];;
int[] arr2 = new int[5];
// 数据类型[] 数组的名称 = {数组中的元素,元素和元素之间使用逗号分割}
int[] arr3 = {1,2,5,7,8,9};
//数组的动态初始化
//此时 该数组只是分配了空间
int[] arr1 = new int[5];// 声明了一个长度为5的整型数组 数组的名称为arr1
//数组中元素的引用
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[3]);
System.out.println(arr1[4]);
}
```java
//数组的取值赋值
//数组中的元素的操作是通过索引(角标)来完成的,索引(角标)是从0开始的
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
//数组的静态初始化方法
public static void main(String[] args) {
int[] arr1 = new int[5];
// 数组的静态初始化方式1:在数组声明的同时,就初始化了数组
int[] arr2 = {10,20,30,40,22,36};
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
// 数组的静态初始化方式2
int[] arr3 = new int[]{21,11,31,41,51};
System.out.println(arr3[2]);
System.out.println(arr3[3]);
System.out.println(arr3[4]);
}
```java
//通过循环来操作数组:赋值或遍历
//数组的循环赋值,普通for循环
for(int i = 0 ; i < 5 ;i++){
arr3[i] = i + 50;
}
// 数组的遍历
for(int i = 0 ; i < 5;i++){
System.out.println(arr3[i]);
}
//增强for循环
for(int j : arr){
System.out.println(j);
}
/*
这两种循环的区别:
普通for循环可以精确的去控制每一个元素
增强for没法去精确的控制每一个元素,只能遍历所有元素
*/
//获取数组的长度:使用数组的length属性
System.out.println("========================"+arr1.length);
for(int i = 0 ; i < arr1.length;i++){
System.out.println(arr3[i]);
}
5 数组的默认值
数组元素类型 | 元素默认初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | 0或’\u0000’ |
boolean | false |
引用类型 | null |
6 jvm的内存
区域名称 | 作用 |
---|---|
程序计数器(寄存器) | 给CPU使用,与开发无关 |
本地方法栈 | JVM在使用操作系统时使用,与开发无关 |
方法区 | 存储可以运行的class文件。对象 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。当申请不到空间时会抛出OutOfMemoryError,是垃圾回收的重点区域。 |
虚拟机栈 | 栈里面是一个一个“栈帧”,每个栈帧对应一次方法调用。栈帧中存放了局部变量表(基本数据类型变量和对象引用)、操作数栈、方法出口等信息。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误。栈里面是一个一个“栈帧”,每个栈帧对应一次方法调用。栈帧中存放了局部变量表(基本数据类型变量和对象引用)、操作数栈、方法出口等信息。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误。 |
7 数组使用中的两个问题
7.1 数组下标越界
在进行数组元素获取时
例:
public class test {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
//因数组arr的角标最大为5,故6存在数组下标越界的情况
System.out.println(arr[6]);
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 6
at test.main(test.java:4)
7.2 空指针异常
public class test {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
arr = null;
System.out.println(arr[3]);
}
}
Exception in thread "main" java.lang.NullPointerException
at test.main(test.java:5)
这种问题产生的原因在于,数组类型的变量未指向任何对象
解决方案:让该变量指向一个明确的对象即可
public class test {
public static void main(String[] args) {
int[] arr3 = new int[]{21,11,31,41,51};
int[] arr4 =null;
arr3 = arr4;
System.out.println(arr4[2]);
System.out.println(arr4[3]);
System.out.println(arr4[4]);
}
}
8 数组的常见操作
8.1 遍历数组
public class test {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6,7,8};
//输出数组中下标是偶数的元素
//使用普通for循环
for(int i = 0;i < arr.length - 1;i++){
if(i % 2 == 0){
System.out.println(arr[i]);
}
}
System.out.println("-----------------");
//使用增强for循环,输出数组中的全部元素
for(int x : arr){
System.out.print(x + " ");
}
}
}
1
3
5
7
------------------
1 2 3 4 5 6 7 8
从中不难看出增强for循环只能遍历所有元素,无法精准的控制每一个元素
8.2 数组的拷贝
public class test {
public static void main(String[] args) {
//将arr中的元素拷贝到数组arr1中
int[] arr = {1,2,3,4,5,6};
int[] arr1 = new int[arr.length];
//普通for循环
for(int i = 0;i < arr.length;i++){
arr1[i] = arr[i];
}
//增强for循环
for(int x : arr1){
System.out.println(x);
}
}
}
1
2
3
4
5
6
8.3 数组的最值
//找数组中元素的最大值
public class max {
public static void main(String[] args) {
int[] arr = new int[]{5,4,7,8,9,3,2};
int max1 = arr[0];
for(int i = 0;i < arr.length - 1;i++){
if(max1 < arr[i]){
//交换max1与arr[i]的值
max1 = arr[i];
}
}
System.out.println("The max number is " + max1);
}
}
The max number is 9
//找数组中元素的最小值
public class min {
public static void main(String[] args) {
int[] arr1 = {5,7,4,8,9,1,3};
int min1 = arr1[0];
for(int i = 0;i < arr1.length;i++){
if(min1 > arr1[i]){
min1 = arr1[i];
}
}
System.out.println("The min number is " + min1);
}
}`在这里插入代码片`
The min number is 1
9 递归算法
public class DiGui {
public static void main(String[] args) {
//计算5!
int sum = sum1(6);
System.out.println(sum);
}
public static int sum1(int p) {
if(p == 1){
return 1; //递归的出口
}else{
return p * sum1(--p);
}
}
}
720