概述:
数组是相同数据类型的多个数据的容器。
这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素。(简单理解就是:一个跟一个顺序排列)
新技术:动态扩容算法<面向数组的扩容>(了解)。
创建格式:
常用格式1:创建数组,并指定长度,不指定数组中的内容。
数据类型[] 数组名称 = new 数据类型[数组长度];
常用格式2:创建数组的同时,指定数组中的内容。
数据类型[] 数组名称 = {数组内容1,数组内容2,...,数组内容n};
数组常用的创建方式示例:
public class Demo1{
public static void main(String[] args){
//创建数组的格式
//常用格式1.创建数组的同时,制定数组中的内容。
// 数据类型[] 数组名称 = {数据1,数据2,数据3,...,数据n};
int[] ages1 = {10,11,12,13,14};
//常用格式2.创建数组,并指定长度,不指定数组中的内容。
// 数据类型[] 数组名称 = new 数组类型[数组长度];
// 数据长度通过int数据指定
int[] ages2 = new int[10];
//通过下标操作数组数据的方式:
//1. 给数组某个下标对应的空间赋值:数组名称[下标] = 值;
ages1[0] = 100;
//2. 从数组某个下标取值:数组名称[下标]。
System.out.println(ages1[0]); //100
ages2[0] = 99;
System.out.println(ages2[0]); //99
System.out.println("-----------------"); //华丽的分割线
//如何获取数组的长度:数组名称.length
for(int i = 0;i < ages1.length;i++){
System.out.println(ages1[i]);
}
}
}
数组不常用的创建方式示例:
public class Demo2{
public static void main(String[] args){
//数组不常用的创建方式:
//1. 创建数组,不初始化
//格式:数组类型[] 数组名称;
int[] nums1;
//2. 创建数组,并指定数组中的内容
//格式:数据类型[] 数组名称 = new 数据类型[]{内容1,内容2,内容3,...,内容n};
int[] nums2 = new int[]{11,12,13,14,15};
}
}
1、数组常见问题
-
数组下标越界和空指针问题
示例:
public class Demo3{ public static void main(String[] args){ //常见问题: //1. 数组下标越界问题: //int[] num1 = {10,11,12,13,14}; //System.out.println(num1[5]); //执行此行将产生数组下标越界异常 //2.空指针问题 //int[] num2; //System.out.println(num2); //此行直接报错(空指针异常),整个程序无法运行 //解决方案: int[] num2 = null; System.out.println(num2); } }
2、数组常用算法
-
寻找最大值或最小值
示例:
public class Demo4{ //寻找数组中的最大值 | 最小值 public static void mian(String[] args){ int[] nums = {10,30,40,33,22,20,11,0}; //1. 创建一个变量,用于存储遍历数组时发现的最大值 int max = nums[0]; //2. 循环取出数组中的每一个内容,从下标1开始 for(int i = 1;i < nums.length;i++){ //将数组中的每一个内容与max比较,如果比max大,则将nums[i]的值赋给max;相反,不变。 max = max < nums[i] ? nums[i] : max; } System.out.println("max = " + max); //max = 40 //1. 创建一个变量,用于存储遍历数组时发现的最小值 int min = nums[0]; //2. 循环取出数组中的每一个内容,从下标1开始 for(int i = 0;i < nums.length;i++){ //将数组中的每一个内容与min比较,如果比min小,则将nums[i]的值赋给min;相反,不变。 min = min > nums[i] ? nums[i] : min; } System.out.println("min = " + min); //min = 0 } }
-
冒泡排序
原理: - 比较相邻的元素。如果第一个比第二个大,就交换它们两个。 - 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 - 针对所有的元素重复以上的步骤,除了最后一个。 - 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
名字由来: 因最小(或最大)的元素会经由交换慢慢“浮”到数列的顶端(降序或升序),就如同水中的气泡最终会浮到水的顶端一样,故名“冒泡排序”。
升序排列的口诀: N个数字来排队, 两两相比小靠前。 外层 循环length - 1, 内层 循环length - i - 1。 降序排列的口诀: N个数字来排队, 两两相比大靠前。 外层 循环length - 1, 内层 循环length - i - 1。
示例:
public class Demo5{ /** *冒泡排序 */ public static void main(String[] args){ int[] nums1 = {20,15,18,13,30,60}; //外层循环控制的是比较的轮数。 //外层循环次数:length - 1 for(int i = 0;i < nums1.length - 1;i++){ //内层循环控制的是每轮比较的次数。 //第i轮(i从0开始计算),比较次数为:length - i - 1 for(int j = 0;j < nums1.lenght - i - 1;j++){ if(nums1[j] > nums1[j + 1]){ //两两相比,满足移动条件(交换),小靠前 nums1[j] += nums1[j + 1]; nums1[j + 1] = nums1[j] - nums1[j + 1]; nums1[j] -= nums1[j + 1]; } } } //排序已经完成,以下是遍历打印查看的过程 for(int i = 0;i < nums1.length;i++){ System.out.print(nums1[i]); } } }
-
二分查找(折半查找)
概述:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,/*二分查找要求数组数据必须采用顺序存储结构有序排列。*/
原理:
首先,假设数组中元素是按升序排列,将数组中间位置的数据与查找数据比较,如果两者相等,则查找成功,否则利用中间位置记录将 数组分成前、后两个子数组,如果中间位置数据大于查找数据,则进一步查找前子数组,否则进一步查找后子数组。 重复以上过程,直到找到满足条件的数据,则表示查找成功。 直到子数组不存在为止,表示查找不成功。
示例:
public class Demo6{ /** *二分查找(折半查找) */ public static void main(String[] args){ int[] nums = {10,20,30,40,50,60,70,80,90}; //要查找的数据 int num = 30; //关键的三个变量: //1. 最小范围下标 int minIndex = 0; //2. 最大范围下标 int maxIndex = nums.length; //3. 中间数据下标 int centerIndex = (minIndex + maxIndex) / 2; while(true){ if(nums[centerIndex] > num){ //中间数据较大 > num maxIndex = centerIndex - 1; }else if(nums[centerIndex] < num){ //中间数据较小 < num minIndex = centerIndex + 1; }else{ //找到了数据 数据位置:centerIndex break; } if(minIndex > maxIndex){ //未找到数据 centerIndex = -1; break; } //当边界发生变化,需要更新中间下标 centerIndex = (minIndex + maxIndex) / 2; } if(centerIndex != -1){ System.out.println("找到了" + num + "的数据,位于nums数组的第" + centerIndex + "个下标"); }else{ System.out.println("未找到" + num + "的数据"); } } } /** *1. 确定查找的范围 最小~最大 * *2. 计算中间的下标 (最小+最大)/ 2 * *3. 比较中间下标数据,中间下标较大,则最大下标等于中间下标 - 1 * 比较中间小标数据,中间下标较小,则最小下标等于中间下标 + 1 * *4. 当最小下标 > 最大小标时,说明数据是不存在的。 */
4、多维数组(了解)
-
二维数组
示例:
public class Demo7{ /** *多维数组(了解),因平时常用一、二维数组 * *创建格式: * 数据类型[] 数组名称 = new 数据类型[长度]; * int[][] 二维数组名称 = new 数据类型[长度][]; //int[]:二维数组数据类型。 */ public static void main(String[] args){ int[][] nums = new int[10][]; nums[0] = new int[]{1,2,3}; System.out.println(nums[0][2]); //3 } }
-
二维及以上的多维数组
略。