一维数组定义
连续输入多个数字,连续输入多个坐标点,一般而言会创建多个变量存储这些数据,显得比较麻烦。
这些变量基本上类型是共通的,那我们就可以用一个容器将所有的数字进行管理。类似于字符串,字符串其实就是若干个字符的容器而已,“abc”可以通过索引/角标来获取其中某一个字符。[1,2,3,4,5]类似字符串能够也可以通过索引/角标来获取其中某一个数字呢?那么这个容器我们称之为数组。
数组其实就是系统为多个相同类型的变量开辟一系列大小相同,地址连续的储存空间。
这些储存空间的物理地址呈等差数列模式增加或者减少。定义一个数组变量其中储存第一个元素的地址
数组的定义方式
第一种:
int [] arr=new int[4];
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[4]=5;
第2种方式:
int [] arr={1,2,3,4};
第三种方式
int [] arr=new int{1,2,5};
数组中需要注意的地方
- 数组就是一片地址连续且空间大小一致的存储空间(但是每个空间存的还是其他数据的地址)。
- 数组存在于堆内存中。(目前学到三种内存:堆,栈,常量池)
- 数组提供下标来访问数组当中的元素。
- 数组变量存的就是数组在堆内存中首元素的地址。
- 数组通过角标来访问元素的具体计算方式是 所要访问数据的地址=首元素地址+角标*数据类型大小。
- 数组一旦定义下来,其长度不可改变。数组有多少元素就看数组长度是多少(a[0]~a[length-1])。
数组在内存中的图解
数组一般储存地方为内存的栈
下图主要是数组中变量的储存图解,虽然在数组中存储数据,单数数组中的变量和一般常量一样都是通过获取常量池中常量的位置来存储数据的。
常见数组中的2种错误
- ArrayIndexOutOfBoundsException 数组角标越界--角标越界指的是,它的角标超过已有角标的范围
class Test04{
public static void main(String[] args){
int[] arr=new int[5];
System.out.println(arr[10]);
}
}
- NullPointerException 空指针异常
class Test04{
public static void main(String[] args){
int[] arr=new int[5];
int[] arr2=arr;
arr2[0]=10;
System.out.println(arr[0]);
arr2=null;
System.out.println(arr2[0]);
arr=null;
//此时此刻 数组对象没有任何变量引用它
//数组对象在堆内存中就没有存在的意义了
//所以该对象变成垃圾,由【垃圾回收器gc】处理
//【垃圾回收期】是JVM中的一个程序 专门用于负责处理堆内存中垃圾数据的
//垃圾的处理并不是及时的,有【gc】来控制,当垃圾堆攒到一定程度时由【gc】来处理
//特殊的 在C/C++中 如果出现对象垃圾 必须由程序员手动处理 free()及时处理
}
}
常见数组的操作
赋值操作和取最大值和最小值
import java.util.Scanner;
class Test05{
public static void main(String[] args){
//遍历操作
// bianli();
//赋值操作
// fuzhi();
//最大值/最小值
maxormin();
}
public static void maxormin(){
//计算最大值或最小值的 值
//计算最大值或最小值的 角标
//需求 获取最大的值10 获取最小值的角标4
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(){
//二分查找有个前提 数组必须有序
/*
最好情况 查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);
}
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);
}
}
二分法查找图解