介绍数组
- Java 中的数组是用来存储固定大小的同类型元素。
- 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
- 数组属引用类型,数组型数据是对象,数组中的每个元素相当于该对象的成员变量。
- 数组是多个相同类型数据的组合,实现对这些数据的统一管理。
- 数组主要解决多变量多数据存储的问题,方便程序后期统一维护操作数据。
- 数组就是一系列空间大小相等且地址连续的一片存储空间。
- 数组变量存的就是数组在堆内存中首元素的地址。
- 数组存在于堆内存中,但凡在堆内存中存储的数据都称之为对象,但凡在堆内存中创建的对象都会有默认初始值,整数类型默认0,浮点类型默认0.0,布尔类型默认false,引用数据类型(对象)默认null.
声明数组
-
元素类型[] 数组名; // 建议使用的方式
-
元素类型 数组名[];
int[] score = null; // null表示引用数据类型的默认值
int socre[] = null;
注意:
- 首先必须声明数组变量,才能在程序中使用数组。
- “数组名”是用来统一这组相同数据类型的元素的名称,建议使用有意义的名称为数组命名。
开辟空间
数组名 = new 元素类型[元素的个数];
score = new int[3];
如图所示:
注意:
数组操作中,在栈内存中保存的永远是数组的名称,只开辟了栈内存空间数组是永远无法使用的,必须有指向的堆内存才可以使用,要想开辟新的堆内存则必须使用new关键字,之后只是将此堆内存的使用权交给了对应的栈内存空间,而且一个堆内存空间可以同时被多个栈内存空间指向,即:一个人可以有多个名字,人就相当于堆内存,名字就相当于栈内存。
数组的初始化(创建数组时必须明确规定大小或内容)
元素类型 数组名 = new 元素类型[数组大小];
元素类型 数组名[] = new 元素类型[]{1,2,3,4};
元素类型 [] 数组名={值0,值1,值2....}
int[] score = new int[10];
double[]myList=new double[10];
double []myList={1.9,2.9,3.4,3.5};
在Java中,由于整数数据类型所占用的空间为4个bytes,而整型数组score可保存的元素有10个,所以上例中占用的内存共有4 * 10 = 40个字节。
public class ArrayTest {
public static void main(String[] args) {
// 对各元素进行初始化,但没有赋值。
String[] stringArray = new String[3]; // 各元素的值默认为String类型的初始值null
// 数组没有length()这个方法,有length的属性。
for (int i = 0; i < stringArray.length; i++) {
System.out.println(stringArray[i]); // null null null
}
}
}
数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。
数组中元素的表示方法
Java的数组索引编号由0开始,以一个的score[10]的整形数组为例,score[0]代表第1个元素,score[1]代表第2个元素,score[9]为数组中第10个元素(也就是最后一个元素).数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小
注意:数组下标越界的错误提示:java.lang.ArrayIndexOutOfBoundsException。NullPointerException 空指针异常.
数组的基本操作
1.使用随机数初始化数组
for(int i=0;i<myList.length;i++){
myList[i]=Math.random()*100;
}
2.显示数组
for(int i=0;i<myList.length;i++){
System.out.print(myList[i]+" ");
}
3.对所有元素求和
double total=0;
for(int i=0;i<=myList.length;i++){
total+=myList[i];
}
4.找出最大元素
double max =myList[0];
for(int i=1;i<myList.length;i++){
if(myList[i]>max){
max=myList[i];
}
}
5.找出最大元素的最小下标值
double max =myList[0];
int indexOfMax=0;
for(int i=1;i<myList.length;i++){
if(myList[i]>max){
max=myList[i];
indexOfMax=i;
}
}
数组的查找操作(线性查找,二分查找)
1.二分查找
public static void binarySearch(){
/*
最好情况 查46 1次就出来了
最坏情况 查12/60 O(logn)
*/
int[] arr={12,17,21,32,38,41,46,49,50,50,51,59,60};
int key=46;
int index=-1;
int min_index=0;
int max_index=arr.length-1;
int mid_index=(min_index+max_index)/2;
while(arr[mid_index]!=key){
if(key<arr[mid_index]){
max_index=mid_index-1;
}
if(arr[mid_index]<key){
min_index=mid_index+1;
}
if(min_index>max_index){
index=-1;
break;
}
mid_index=(min_index+max_index)/2;
}
System.out.println(mid_index);
}
注意:二分查找有个前提 数组必须有序。
2.线性查找
public static void linearSearch(){
/*
最好情况 查10 1次就出来了
最坏情况 查5 10次才出来
当数组的长度越大的话 最坏情况越差
时间复杂度(最坏情况) O(n) 线性阶
*/
int[] arr={10,2,8,3,1,6,4,7,9,5};
int key=11;
int index=-1; //key元素不存在
for(int i=0;i<arr.length;i++){
if(arr[i]==key){
index=i;
break;
}
}
System.out.println(index);
}
二维数组
- 就是一个由行和列组成的一个表格而已,矩阵Matrix.
- 在矩阵中访问元素的的话,是根据元素的行角标和列角标所确定的。
- 尤其对于二维数组而言,无非就是一个一维数组,只不过该一维数组中的每一个元素是另一个一维数组罢了!
二维数组中数据的存储:
这个图中共有四个数组,分别是matrix, matrix[0], matrix[1], matrix[2]。 matrix.length;表示二维数组的行数为三,matrix[1].length;表示二维数组中第二行数组的长度。
二维数组的创建
1. int[][] matrix=new int[3][4];---------------创建一个3行4列的二维数组,元素默认都是0
2. int[][] matrix=new int[][]{ ---------------创建个指定元素的二维数组
{1,2,3,4} ,
{5,6,7,8} ,
{9,10,11,12}
};
3. int[][] matrix={
{1,2,3,4} ,
{5,6,7,8} ,
{9,10,11,12}
};
4. 锯齿矩阵/二维数组
int[][] matrix={
{1,2,3,4} ,
{5,6,7} ,
{8,9},
{10}
};