Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容

2021-04-22 00:00:00 java 基础

数组:可以存储多个相同数据类型元素的容器

定义格式:

1.数据类型[] 数组名=new 数据类型[元素个数/数组长度];
int[] arr=new int[3]; //指定长度
数据类型 名称=初始化; //定义变量

class ArrayDemo{ 
	public static void main(String[] args) { 

		//1,定义数组
		int[] arr=new int[3];
		//声明
		int[] arr1;
		//初始化
		arr1=new int[5];
		//输出数组名
		System.out.println(arr);//结果:[I@2a139a55
		
		结果分析:
		[I@2a139a55:整形数组的内存地址值
		[:当前区域代表的对象的类型--[(代表对象是数组类型)
		I:当前区域代表的就是对象身上元素类型--I(元素类型是int类型)
		@:代表后面是具体的地址
		2a139a55:哈希码值十六进制的表现形式
		

变量的定义分为声明和初始化两个过程
数组也可以分为声明和初始化两个过程

通过唯一的内存地址值来确定数组,java自动给数组的元素进行编号(下标),从零开始,由内存地址值和小标就能唯一确定数组里的元素-数组名[下标]。

2.数据类型[] 数组名=new 数组类型[]{元素值1,元素值 2,…};
int[] arr=new int[]{1,2,3}//给定数组元素值来确定长度不用给定长度值

        //2.定义数组
		int[] arr=new int[]{ 1,2,3};
		//声明
		int[] arr1;
		//初始化
		arr1=new int[]{ 3,4,5};

可以分为声明和初始化两个过程

3.数据类型[] 数组名={元素值1,元素值 2,…};
int[] arr={1,2,3};//给定元素值长度确定

		//3.定义数组
		//底层默认开辟空间
		int[] arr={ 1,2,3};
		//声明
		int[] arr1;
		//初始化---报错:没有开辟内存空间无法存储元素
		arr1={ 3,4,5};

new功能:开辟堆内存空间

栈:存储的是变量(暂且),当存储内容使用完毕之后立即清除。
堆:存储的是对象,当存储内容使用完毕之后等到某个时刻来进行回收。
方法区(面对对象)
本地方法栈
寄存器(程序计数器)
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
演示:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》

《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
系统默认初始值
(byte、short、int-0)、(char–’\u0000’ \u代表以u16进行编码)、(long–0L)、(float–0.0F)、(double–0.0)、(boolean-false)、(引用数据类型–null)

数组的应用

1.遍历-依次把数组元素进行输出
import java.util.Arrays;
class ArrayBianLi{ 
	public static void main(String[] args) { 
		//定义数组
		int[] arr={ 1,2,3,4,5};
		
		//1.普通for循环实现遍历
		//数组名.length--返回数组长度值
		for(int i=0;i<arr.length;i++){ //下标范围
			System.out.println(arr[i]);


		//2.增强for循环
		//(元素类型 变量名:要去遍历的数组名)
		//把数组元素拷贝赋值给新变量来输出新变量的值
		for(int i:arr){ 
			System.out.println(i);
			
		}
		//3.展示数组元素内容--遍历输出
		System.out.println(Arrays.toString(arr));
		
	}
	}
}
2.最值-求出数组元素最大/小值
class ArrayZuiZhi{ 
	public static void main(String[] args) { 
		//定义数组
		int[]arr={ 3,4,6,2,7};
		//选取第一个元素作为参照物
		int max=arr[0];
		//遍历数组
		for(int i=0;i<=arr.length;i++){ //下标范围
			//判断大小
			if(arr[i]>max){ 
				max=arr[i];
			}
		}
		System.out.println(max);
		
	}
}
*最重要 3.查找–给定查找数返回(二分查找)
public class ArrayChaZhao{ 
	public static void main(String[] args) { 
		//定义数组
		int[] arr={ 1,4,6,3,7};
		//给定查找数
		int num=7;
		/*//遍历数组,依次比较 for(int i=0;i<arr.length;i++){ //判断数组元素是否和查找数相等 if(arr[i]==num){ System.out.println(i); //已经查找下标--结束循环 break;*/


				//二分查找(二分算法在查找上的应用)
				//提供三个下标
				int min=0;
				int max=arr.length-1;
				int mid=(min+max)/2;

				//循环范围不确定
				while(arr[mid]!=num){ //中间下标对应的元素值和查找数不相等进循环
					//如果num大于中间下标对应的元素值
					if(num>arr[mid]){ 
						min=mid+1;
					}else{ 
					//如果num大于中间下标对应的元素值
						max=mid-1;
					}
					//查找数不在数组判断条件
					if(min>max){ 
						System.out.println("查无此数");
						//结束循环
						break;	
					}
					//重新计算中间下标
					mid=(min+max)/2;
				}
				//输出
				if(max>=min)
				System.out.println(mid);
				
				}
			}
4.排序–给元素值排列顺序(冒泡、选择)

将元素6、1、7、3、9、2升序排列

1)冒泡排序

分析:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
这里只演示前两轮
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》

第1轮 0~arr.length-1
第2轮 0~arr.length-2
第3轮 0~arr.length-3
第4轮 0~arr.length-4
第5轮 0~arr.length-5

代码:

import java.util.Arrays;
class MaoPao{ 
	public static void main(String[] args) { 
		//定义数组
		int[] arr={ 6,1,7,3,9,2};
		//通过嵌套循环实现
		for(int i=1;i<arr.length;i++){ //外层循环--控制轮数
			for(int j=1;j<=arr.length-i;j++){ //内层循环--控制参与比较的元素范围(比较次数)
				//两两比较 j和j+1 j-1和j(都可以)
				//升序排序--小的在前面
				if(arr[j-1]>arr[j]){ 
					//交换值
					int temp=arr[j-1];
					arr[j-1]=arr[j];
					arr[j]=temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
		
	}
}

执行结果:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
2)选择排序

分析:

第1轮 0~length-1
第2轮 1~length-1
第3轮 2~length-1
第4轮 3~length-1
第5轮 4~length-1

代码:

import java.util.Arrays;
class XuanZe{ 
	public static void main(String[] args) { 
		//定义数组
		int[] arr={ 6,1,7,3,9,2};
		//通过嵌套循环实现
		for(int i=1;i<arr.length;i++){ //外层循环,控制轮数
			for(int j=i;j<arr.length;j++){ //内层循环,控制参与比较的元素范围
				//选择定点元素和后续元素进行比较
				if(arr[i-1]>arr[j]){ 
					//交换值
					int temp=arr[i-1];
					arr[i-1]=arr[j];
					arr[j]=temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
		
	}
}

执行结果:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》

注意:输出数组时需要导包

import  java.util.Arrays;
5.扩容

代码演示:

import java.util.Arrays;
class ArrayKuo{ 
	public static void main(String[] args) { 
		//定义原数组
		int[] arr={ 1,2,3,4,5};
		
		//根据新数组之间的复制来实现扩容
		//新数组
		int[] arr1=new int[2*arr.length];
		//数组复制(原数组,原数组的起始下标,新数组的起始位置,元素个数)
		System.arraycopy(arr,0,arr1,0,arr.length);
		//新数组地址值覆盖原数组的地址值
		arr=arr1;
		System.out.println(Arrays.toString(arr));
		
		
	}
}

执行结果:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
快速扩容:

import java.util.Arrays;
class ArrayKuo{ 
	public static void main(String[] args) { 
		//定义原数组
		int[] arr={ 1,2,3,4,5};
		//(原数组,新数组长度)
		arr=Arrays.copyOf(arr,2*arr.length);//由上述三步实现的
		System.out.println(Arrays.toString(arr));
		
	}
}

两种扩容方法的优缺点:
扩容:复制灵活(给定起始位置),可以从任意位置开始复制,但是使用麻烦
快速扩容:使用简单,但是只能默认从头(下标0)开始复制

二维数组:

存储元素是一维数组的数组

定义格式:

1.数据类型[][] 数组名=new 数据类型[二维数组的长度(相当于存储的一维数组的个数)][每个一维数组的长度];
Int[][] arr=new int[2][3];

代码演示:

/* 定义格式 */
class Array2Demo{ 
	public static void main(String[] args) { 
		//1.定义格式
		//int[] arr=new int[2];
		int[][] arr=new int[2][3];
		//数组名 ---(二维数组地址值- [[I@2a139a55)
		System.out.println(arr);
		//二维数组的第一个元素(一维数组的地址值- [I@15db9742)
		System.out.println(arr[0]);
		//第一个一维数组的第一个元素
		System.out.println(arr[0][0]);
		
		
		
	}
}

执行结果:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》
2.数据类型[][] 数组名=new 数据类型[二维数组的长度][];
Int[][] arr=new int[3][];//声明3个一维数组
//初始化
arr[0]=new int[4];
arr[1]=new int[]{1,2,3};
arr[2]={2,3,5};//错误:没有开辟空间无法存储数据

代码演示:

//2.定义数组
		int[][] arr=new int[2][];//声明两个一维数组

		//第一个一维数组
		System.out.println(arr[0]);//null--不指向任何内存区域
		//从地址值为null的引用里获取信息就会报错
		System.out.println(arr[0][0]);//NullPointerException--空指针异常

3.数据类型[][] 数组名={ {元素值1,元素值2,…},{元素值1,元素值2,…}…};
int[][] arr={ {1,2,3},{3,4}};

代码演示:

//3.定义格式
		int[][] arr={ { 1,2,3},{ 3,4}};
		//第一个一维数组的第四个元素
		System.out.println(arr[0][3]);//ArrayIndexOutOfBoundsException--数组下标越界异常(给定下标超过下标范围报错)

二维数组的内存图:
《Java基础(三)-数组及数组的应用-遍历、最值、查找、排序、扩容》

    原文作者:张艳霞zhangyx
    原文地址: https://blog.csdn.net/acsdds/article/details/107815995
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章