一、数组基础知识
1、定义:用于存储同种数据类型数据的容器。
0开始编号。
格式:运算类型[] 数组名= new 元素类型[元素个数或数组长度];
示例:int [] arr=new int [5];
格式2
元素类型[] 数组名=new 元素类型 [] {元素,元素,元素....}
int [] arr=new int[] {3,5,1,7};
int [] arr={3,5,1,7};
而arr是数组类型,是一个指针。
2、内存结构
程序在运行时,一共开辟了五片空间区域。需要在内存中的分配空间,为了提高运算效率,有对空间进行了不可区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
栈内存
用于存储局部变量,当数据使用完,所占空间会自动释放。(先进后出的特点)
例如int [] x=new int[3];
读到 左边,就在栈内存中存放数组类型x
读到右边,new 里面读出来的数据都存放在堆里面。
堆内存
1) 凡是堆里面,都存放的是实体,实体包括数组和对象,通过new 建立的实例都存放在堆内存中。
2) 每一个实体都有内存地址值。可以用于和栈内存中的数据联系。
所以,上例中,new的一个作用是,把首个数组元素在内存中的地址值赋值给X
X中存放的是地址值。我们就称X指向了这个数组,或者说是X引用了这个数组。
内存图例:
这就是引用数据类型。
3) 实体中的变量都有默认初始化值
类型,默认是0 double类型,默认是0.0 float 类型,默认是0.0f boolean类型,默认是false
4) 实体不会被使用,会在不确定的时间内被垃圾回收器回收。
释放引用类型数据的方法:x=null;
这样,当一个引用类型数据不再存放任何堆内存数据地址值时,这个引用数据及堆内存中的数组数据就变为垃圾,这些垃圾,虚拟机会不定时地清理它们。
Java的内存优化要比c++做的好,c++是需要程序员手动调用一个函数来清除。如果程序员忘记了,他写的程序运行时间越长,运行时间越慢。
而java不需要程序员手动,只要这个数据变为垃圾,虚拟机会自动启动垃圾回收器。
3、数组中常出现的异常
Arrayindexoutofboundexception 这个错误叫做数组脚标越界异常
例如
int [] arr=new int[3];
System.out.println(arr[3]);
数组长度是3。数组元素为: arr[0] arr[1] arr[2]
不会有arr[3],编译只编译语法错误,而arr[3]语法正确,运行就会出错了。
2)NullPointerexception 这个错误叫做空指针异常,当引用没有任何指向值为null的情况,该引用还在用于指向实体。
例如
int arr[]=new int [3];
arr=null;
System.out.println(arr[1]);
arr 已经不再指向数组,还在访问数组元素,就会出现错误。
4、二维数组
可以称为数组中的数组
格式:int [][] arr=new int[3][2]; int [][]y; int y[ ][ ]; int[ ]y[ ];
一维数组的名称为arr[0],arr[1],arr[2]
格式二, int [][]arr=new int[3][];
说明
二维数组中有三个一维数组。
每个一维数组都是默认初始化值null,说明默认的三个一维数组是不指向任何数组的
可以对这三个一维数组分别进行初始化
arr[0]=new int[3];
arr[1]=new int[1];
arr[2]=new int[2];
arr.length 二维数组的长度 是3
arr[0].length 二维数组中第一个元素,也就是第一个一维数组的长度
int [][] arr={{3,5,1,7},{2,3,5,8},{6,1,8,2}};
二维数组内存图例
二、数组应用操作
1、 获取数组中的元素
通常会用到遍历,数组中有一个属性可以直接获取到数组元素个数,叫做length。数组作为形参
例如 定义功能,用于打印数组中的元素
public static void printArray(int [] arr)
{
System.out.println(arr);
}
public static void main(String[]args)
{
int []arr=new int[3];
arr[0]=1;arr[1]=2;arr[2]=3;
printArray(arr);
}
运行结果
[i@dc6ccd
是一个数组实体的引用给直接打印了。int类型的数据dc6ccd就是数组的地址值。是由哈希算法算出来的哈希值。是十六进制的。
程序代码:
应用二 获取最值
思路
1 获取最值需要进行比较。每一次比较都会有一个较大的值,因为该值不确定。通过一个变量进行临时存储
2 让数组中的每一个元素都和这个变量中的值进行比较。如果大于变量中的值,就用该变量记录较大值。
3 当所有的元素都比较完成,那么该变量中存储的就是最大值了。
步骤
1 定义变量,初始化为数组中任意一个元素即可。
2 通过循环语句对数组进行遍历。
3 在变量过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给该变量。
需要定义一个功能来完成,以便提高复用性。
1 明确结果,数组中的最大元素int。
2 有未知内容:一个数组,int []
另外一种方式
可不可以将临时变量初始化为0呢?
可以,这种方式其实是在初始化为数组中任意一个脚标。
代码
Public static int getMax(int [] arr)
{
int max=0;
for(int x=1;x<arr.length;x++)
{
if(arr[x]>arr[max])
max=x;
}
return arr[max];
}
获取double类型数组的最大值,因为功能一致,所以可以重载
public static double getMax(double [] arr)
应用三 排序
1、选择排序
最值最先出现在第一个位置。
代码
运行结果
2、冒泡排序
代码:
运行结果:
3、快速排序
代码
运行结果:
应用四 查找
折半查找代码
运行结果
应用四:进制转换
代码:
运行结果: