数组
数组的定义:
数组概念:是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们,数组主要解决多变量多数据的存储问题,方便程序后期统一维护操作数据;
数组的基本特点
- 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。元素的类型可以是 java 支持的任意类型
- 数组类型可以是任何数据类型,包括基本类型和引用类型。
- 数组的元素在堆内存中被分配空间,并且是连续分配的
- 使用new 关键字对数组进行 内存的分配。每个元素都会被 jvm 赋予默认值。默认规则:整数:0, 浮点数:0.0, 字符:\u0000, 布尔:false, 引用数据类型:null。
- 数组的元素都是有序号的,序号从0开始,0序的。称作数组的下标、索引、角标
- 数组的本质:数组就是一系列空间大小相等且地址连续的一片存储空间;
- 空间大小:空间大小是相等的,是为了方便统一维护我们的数据,必须得保证数据之间的类型是一样的。(多个同类型的变量空间连在一起组成的结构叫数组);
- 变量的空间地址:变量空间的地址是连续的,是为了方便统一操作我们的数据。
总结:
1.数组就是一片地址连续且空间大小一致的存储空间;
2.数组存在于堆内存中,但凡在堆中存储的数据都称之为对象,但凡在堆内存中创建的对象都会有默认初始值;
3.数组提供角标来访问数组当中的元素;
4.数组变量存的就是数组在堆内存中首元素的地址;
5.数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小;
6.数组一旦定义下来,其长度不可改变;数组中有几个地址?就看数组有几个元素空间<==>数组的长度;
7.创建数组时必须明确规定大小或内容
- 数据类型[] 数组名=new 数据类型[长度] 创建数组只指定长度但不指定内容
- 数据类型[] 数组名=new 数据类型[]{1,2,3,4,5};创建数组指定内容(指定长度)
- 数据类型[] 数组名={1,2,3,4,5}; 创建数组指定内容(指定长度)
- []表示是一维数组;
- [][]表示二维数组
数组内存图
数组常见错误
(1)ArrayIndexOutOfBoundsException 数组角标越界
(2)NullPointerException 空指针异常
如下:
class Test{
public static void main(String[] args){
int[] arr=new int[5];
System.out.println(arr[3]);
System.out.println(arr[0]);
System.out.println(arr[2]);
String[] strArr=new String[5];
System.out.println(strArr[0]);//System.out.println(arr[10]);
//ArrayIndexOutOfBoundsException 角标越界
int[] arr2=arr;
//此时此刻 数组还是那个数组对象
//只不多有两个变量引用到了而已
arr2[0]=10;
System.out.println(arr[0]);
arr2=null;
//System.out.println(arr2[0]);
//NullPointerException 空指针异常
arr=null;
}
}
基本数据操作
(1)遍历
(2)赋值
(3)最大值/最小值
介绍如下:
import java.util.Scanner;
class Test05{
public static void main(String[] args){
maxormin();
}
public static void maxormin(){//最大值最小值
int[] arr={10,2,8,3,1,6,4,7,9,5};
int max=arr[0];
int min_index=0;
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<arr[min_index]){
min_index=i;
}
}
System.out.println("最大值"+max);
System.out.println("最小值角标"+min_index);
}
public static void fuzhi(){//赋值
Scanner scanner=new Scanner(System.in);
// System.out.print("请输入10个数字:");
int[] arr2=new int[10];
for(int i=0;i<arr2.length;i++){
System.out.print("请输入1个数字:");
arr2[i]=scanner.nextInt();
}
for(int i=0;i<arr2.length;i++){
System.out.print(arr2[i]+" ");
}
}
public static void bianli(){//遍历
int[] arr={1,2,3,4,5,6,7,8,9};//[0,8]
//数组只有一个唯一的属性 length 数组的长度
System.out.println(arr.length);
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
查找操作
- 线性查找
- 二分查找
- 斐波那契查找
二分查找应用:
class Test06{
public static void main(String[] args){
//线性查找
//linearSearch();
//二分查找
binarySearch();
}
public static void binarySearch(){
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);
}
public static void linearSearch(){
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);
}
}