为什么要有数组?
之前在定义数据的时候,大部分都是用变量来存储数据。如果我们的程序中出现大量的数据怎么办?连续输入多个数字,连续输入多个坐标点,一般而言会创建多个变量存储这些数据,显得比较麻烦。如果变量基本上类型是一样的,那我们就可以用一个容器将所有的数字进行管理。类似于字符串,字符串其实就是若干个字符的容器而已,“abc”可以通过索引/角标来获取其中某一个字符。[1,2,3,4,5]类似字符串能够也可以通过索引/角标来获取其中某一个数字呢?那么这个容器我们称之为数组。
数组的优点:
数组主要解决多变量多数据的存储问题,方便程序后期统一维护操作数据。
数组的定义:
数组就是一系列空间大小相等且地址连续的一片存储空间。
空间大小相同的原因:就是为了方便统一维护我们的数据,必须得保证数据之间的类型是一样的。(多个同类型的变量空间连在一起组成的结构叫数组)
地址连续:就是为了方便统一操作我们的数据。(见数组内存图)
数组的特征:
- 数组存在于堆内存中,但凡在堆中存储的数据都称之为 对象(整数类型默认0 浮点类型默认0.0 布尔类型默认false 引用数据类型(对象)默认null)
- 数组提供角标来访问数组当中的元素(下标从0开始)
- 数组变量存的就是数组在堆内存中首元素的地址
- 数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小
- 数组一旦定义下来,其长度不可改变;数组中有几个地址?就看数组有几个元素空间<==>数组的长度
数组内存图
数组的创建:
- 数据类型[] 数组名=new 数据类型[长度];
- 数据类型[] 数组名=new 数据类型[]{1,2,3,4,5};
- 数据类型[] 数组名={1,2,3,4,5};
数组的常见错误:
- ArrayIndexOutOfBoundsException 数组角标越界
- NullPointerException 空指针异常
数组的基本操作:
- 遍历
class demo1{
public static void main(String[] args){
int []array1={1,2,3,4,5,6};
for(int i=0;i<array1.length){
System.out.println(array1[i]);
}
}
}
- 赋值
import java.util.*;
class demo2{
public static void main(String[] args){
Scanner str=new Scanner(System.in)
int array1=new int[10];
for(int i=0;i<array1.length;i++){
int num=str.nextInt();
array1[i]=num;
}
}
}
- 查找最值
/**查找数组里面的最大值 */
class demo1{
public static void main(String[] args){
int[] arr={10,9,7,5,99};
int max=arr[0];
int min=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
System.out.println("最大值是:"+max);
}
}
数组的查找:
- 线性查找
import java.util.*;
class demo2{
public static void main(String[] args){
Scanner str=new Scanner(System.in)
int array1=new int[10];
for(int i=0;i<array1.length;i++){
int num=str.nextInt();
array1[i]=num;
}
System.out.println("请输入要查找的数:");
int s=str.nextInt();
for(int j=0;j<array1.length;j++){
if(s==array1[j]){
System.out.println("这是这个数组中的第"+(j+1)+"个数")
}
}
}
}
- 二分查找
/**二分查找法 */
import java.util.Scanner;
class demo2{
public static void main(String[] args){
Scanner str=new Scanner(System.in);
System.out.println("请输入要查找的数:");
int num=str.nextInt();
int []array={12,17,21,32,38,41,46,49,50,51,59,60};
int left=0;
int right=array.length-1;
boolean flag=false;
while(right>=left){
int mid=(left+right)/2;
if(num==array[mid]){
System.out.println("这是数组里面的第"+(mid+1)+"数!");
flag=true;
break;
}else if(num<array[mid]){
right=mid-1;
}else{
left=mid+1;
}
}
if(flag==false){
System.out.println("没有查找到这个数!");
}
}
}
- 斐波那契查找