一、数组二、数组的分类
1.一维数组2.多维数组 三、数组的使用
一、数组数组: 是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是 这块连续空间的首地址。数组的长度一旦确定,就不能修改。我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。分类:按维度分为一维、二维等;按照元素的数据类型分为基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)。 二、数组的分类 1.一维数组
①如何对一维数组进行声明和初始化?
–首先指明数组元素类型,由于数组本身是引用数据类型,所以需要new。如
int[] ids;//声明为int型数组
ids = new int[]{21,22,23};//初始化
以上为静态初始化过程(数组元素为基本数据类型,数组初始化和数组元素的赋值操作同时进行);
对于动态初始化(数组初始化和数组元素的赋值操作分开进行),则写法为
String[] names = new String[5];
②如何获取数组长度及遍历数组?
String[] names = new String[3]; names[0] = "张三"; names[1] = "李四"; names[2] = "王五"; System.out.println(names.length); //打印出该数组长度 for(int i = 0;i③对数组的内存解析
2.多维数组
内存的简化: 简单分为栈和堆,栈中存的局部变量(放方法中的变量均为局部变量),堆中存的new出来的结构,如图(参考尚硅谷学习)。
理解分析: 右上角为示例部分代码,以第一行为例分析,arr在main方法中,是局部变量,存入栈中;右侧new出了长度为3的数组,存入堆中;三个连续的单元有首地址值,假设为0x34ab(十六进制),会将其赋给栈空间中的arr,则其会通过此地址值找到堆中的数组,从而联系起来;然后进行赋值为1 2 3(因为默认为0 0 0)。
分析二维数组:可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。
①声明与初始化
静态初始化:int[][] arr1 = new int[][]{{2,3,4},{2,5},{1,2,3,4}};动态初始化:
int[][] arr2 = new int[3][2];②长度与遍历
//获取数组长度 int[][] arr3 = new int[][]{{2,3,4},{2,5},{1,2,4}}; System.out.println(arr3[].length);//3 System.out.println(arr3[0].length); //3 System.out.println(arr3[1].length); //2 for(int i = 0;i三、数组的使用 1.数组元素的赋值
例: 创建一个长度为6的int型数组,要求随机生成数组元素的值,且都在1~30之间。同时,要求元素的值各不相同。补充: 生成随机数的方法是通过java.Math包的random方法得到。
公式是:(数据类型)(最小值+Math.random()*(最大值-最小值+1))
如1~30之间的写法是**(int)( 1 + (Math.random() * 30))**方法1:
public class Array { public static void main(String[] args) { int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31) arr[i] = (int)( 1 + (Math.random() * 30)); boolean flag = false;//标志位 while (true) { for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { flag = true; break; } } if (flag) { arr[i] = (int)( 1 + (Math.random() * 30)); flag = false; continue; } break; } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }方法2:
public class Array { public static void main(String[] args) { int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31) arr[i] = (int)( 1 + (Math.random() * 30)); for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { i--; break; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }2.求最大和最小值
在main中写法:int[] arr; arr=new int[]{1,2,3,4,5,6}; int maxValue = 0; for(int i = 0; i < arr.length;i++) { if(maxValue < arr[i]) { maxValue = arr[i]; } } int minValue =arr[0];//初始设最小为数组第一个元素 for(int i = 1; i < arr.length;i++) { if(minValue > arr[i]) { minValue = arr[i]; } } System.out.println("最大为:"+maxValue +"最小为:"+minValue); }3.数组的查找(线性、二分法查找)
3.1 线性查找int[] arr; arr=new int[]{3,22,32,44,13,64}; int cha=64; for(int i = 0;i3.2 二分法查找
前提:所要查找的数组必须有序
int[] arr= new int[]{3,4,6,8,13,24}; int cha=13; int head = 0;//初始首索引 int end = arr.length-1;//初始末索引 boolean isFlag=true; while( head <= end) { int middle = (head + end)/2; if(cha == arr[middle]) { System.out.println("找到了所查找元素,位置为:"+middle); isFlag=false; break; } else if(cha < arr[middle]) { end = middle-1; } else { head = middle+1; } } if(isFlag) { System.out.println("没有找到!"); }3.3 冒泡排序与快速排序
待更新



