数组的概念:
数组是一组类型相同的数据的集合;
也就是说,数组中可以存储多个数据,但是这些数据的类型必须相同;
数组能够作为数据的容器使用,把多个数据集中存储;
存储在数组中的数据,都有相应的索引值,可以方便获取或修改;
当需要同时保存多个类型相同的变量并进行处理时,可以考虑用数组,例如:多个人的成绩、多个员工的薪资……
数组的特点:
Java的数组与类、接口、枚举、注解并列,是引用类型的一种;
Java的数组长度一经确定不能改变;
例如:一个数组的长度是10,那么最多能存10个数据,如果保存第11个就会出错;数组在内存中是连续分配,所以读取速度快
注意:数组本身是引用的数据类型,但是数组中可以存储基本的数据类型和引用的数据类型
注意:数组中的元素都有索引。索引是从0开始的。
一维数组的声明:
数组元素类型[ ] 变量名称;(推荐)
或
数组元素类型 变量名称[ ] ;
//声明数组方式1(推荐) int[] scores; //声明数组方式2 int scores2[];数组的初始化:
第一种:数组元素类型[ ] 变量名称=new 数组元素类型[数组长度];
第二种:数组元素类型[ ] 变量名称=new 数组元素类型[]{用逗号隔开元素的具体值};
第三种:数组元素类型[ ] 变量名称= {用逗号隔开元素的具体值};
//数组的初始化方式1 int[] nums1 = new int[5]; //数组的初始化方式2 int[] nums1 = new int[]{1,2,3,4,5,6}; //数组的初始化方式3 int[] nums1 = {11,12,13,14,15};数组的内存存放方式:
int[] a= new int[5];
一维数组长度的访问方式:
数组对象.length; 注意:数组的长度是属性 ;一维数组的for循环遍历方式:
public class Test1 { public static void main(String[] args) { //数组的初始化方式1 int[] nums1=new int[5]; //数组的初始化方式2 int[] nums2 = new int[]{1,2,3,4,5,6}; //数组的初始化方式3 int[] nums3 = {11,12,13,14,15}; //数组的长度的访问方式 int len= nums1.length; System.out.println("数组的长度是:"+len); //数组中某一个值的访问方式:索引 System.out.println(nums1[2]); //数组元素默认值为0 System.out.println("================"); //遍历数组的方式1:使用for循环 idea快捷键:数组名.fori for (int i = 0; i < nums2.length; i++) { System.out.println(nums2[i]); } System.out.println("================"); //修改数组数据 nums2[0]=999; for (int i = 0; i < nums2.length; i++) { System.out.println(nums2[i]); } } }增强for循环
public class Test2forPro { public static void main(String[] args) { int[] nums=new int[3]; nums[0]=1; nums[1]=2; nums[2]=3; /* num[3]=4; //数组越界异常 */ //遍历数组方式1 for (int i = 0; i < nums.length; i++) { System.out.println(nums[i]); } System.out.println("================"); //数组遍历方式2 for (int num : nums) { //num:临时变量 System.out.println(num); } System.out.println("================"); //遍历数组方式3 for (int i = nums.length - 1; i >= 0; i--) { //反向遍历,逆序输出 System.out.println(nums[i]); } } }选择排序
选择排序的主要思想是寻找未排序中最小的元素加入到已有序列,直到未排序序列为空。选择排序的特点是查询次数较多,元素位置变换较少,比较适合易于查询而移动较复杂的数据。实例:
有一无序数组,如下,现按照选择排序的规则进行升序排序:
现将该数组分为两个部分,第一部分为有序部分,第二部分为无序部分,在初始时,有序部分的元素数量为0,全部为无序部分:
首先在无序部分中寻找最小元素所在的位置,然后将其与无序部分的第一位元素交换位置:
剩余元素按上述方式继续执行,直到最后一个元素:
排序完成:
实例代码:
public class Test3selectSort { public static void main(String[] args) { int[] nums={4,6,5,3,7,1,8,2}; //选择排序,升序排序 for (int i = 0; i < nums.length-1; i++) { int smaller=i; //假设最小值的位置是第i项 for (int j = i+1; j < nums.length; j++) { //找到无序部分中的最小值的位置 if (nums[smaller]>nums[j]){ //寻找到更小的值所在的位值 smaller=j; } } if (smaller!=i){ //最小值的位置不是第i项,需要交换两个数据的位置 int temp=nums[smaller]; nums[smaller]= nums[i]; nums[i]=temp; } } for (int i = 0; i < nums.length; i++) { System.out.println(nums[i]); } } }冒泡排序
主要的思想是进行相邻的两个元素之间比较并且交换,有利于利用原有元素在集合中的位置优势;冒泡排序的原则是大的下沉小的上浮(跟最终的排序要求保持一致);实例:
有一无序数组,如下,现按照冒泡排序的规则进行升序排序:
第一轮的排序,首先比较前两个元素,如果顺序与升序相反,则交换,否则什么也不做:
然后,依次比较第二位与第三位,第三位与第四位,…
第一轮排序:第一轮排序完毕,它能够使最大数沉到最底端,然后进行第二轮排序。每一轮排序能够确保其最大数沉到相应位置,经过元素个数减一的排序会生成有序数组。
实例代码:
public class Test4bubbleSort { public static void main(String[] args) { int[] nums={4,6,5,3,7,1,8,2}; //冒泡排序,升序排序 for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums.length-i-1; j++) { if (nums[j]>nums[j+1]){ //比较相邻数据大小 int temp=nums[j+1]; //交换元素位置 nums[j+1]=nums[j]; nums[j]=temp; } } } for (int i = 0; i < nums.length; i++) { System.out.println(nums[i]); } } }插入排序
插入排序与选择排序类似,需要将数组分为有序与无序两部分。但插入排序不会去无序部分选择,而是随意选取一个无序部分元素,到有序部分中寻找它所在的位置,进行插入,保持有序部分仍然有序。
实例:
有一无序数组,如下,现按照插入排序的规则进行升序排序:
首先认为第一个元素部分为有序部分:
选取无序部分的第一个元素,到有序部分中寻找位置插入:
其后依次进行:
实例代码:
public class Test5insertSort { public static void main(String[] args) { int[] nums={4,6,5,3,7,1,8,2}; //插入排序,升序排序 for (int i = 1; i < nums.length; i++) { int temp=nums[i]; for (int j = i-1; j >=0; j--) { //与前面有序部分元素比较 if (temp<nums[j]){ nums[j+1]=nums[j]; //有序部分向后移位 }else{ nums[j+1]=temp; //插入 break; } if (j==0){ nums[j]=temp; } } } for (int i = 0; i < nums.length; i++) { System.out.println(nums[i]); } } }二维数组
二维数组的声明创建形式如下:
数组元素类型 [ ] [ ] [ ][ ] [][] 变量名称=new 数组元素类型[一维长度] [二维长度];
数组元素类型 [ ] [ ] [ ][ ] [][] 变量名称=new 数组元素类型[一维长度] [];
其他多维数组的声明创建方式类似,区别就是多增加[];
如果同时确定一维和二维的长度,则表示数组的元素是等长的一维数组;
如果数组元素不是等长的一维数组,可以不指定二维长度;
一维长度 数组名.length
二维长度 数组名[i].length
二维数组的内存存储方式:
实例代码:
public class Test6twoArray { public static void main(String[] args) { //二维数组的声明方式1(推荐) int[][] nums1; //二维数组的声明方式2 int nums2[][]; //二维数组的声明方式3 int[] nums3[]; //二维数组长度的访问方式: int[][] nums4=new int[3][2]; System.out.println("一维数组的长度"+nums4.length); //3 System.out.println("二维数组的长度"+nums4[0].length); //2 System.out.println("============================"); //二维数组元素的访问方式 int nums5[][] = {{1,2,3,7},{4,5,6,4},{7,8,9,10}}; System.out.println(nums5[1][2]); System.out.println("============================"); //遍历二维数组 for (int i = 0; i < nums5.length; i++) { for (int j = 0; j < nums5.length; j++) { System.out.println(nums5[i][j]); } } } }API中提供的数组工具:
静态类Arrays:词静态类专门来操作array,提供搜索、排序、复制等静态方法;
sort():用来对array进行排序;binarySearch():在排好序的array中寻找元素;equals():比较两个array是否相等;array拥有相同元素个数,且所有对应元素两两相等;Arrays.asList(array):将数组array转化为List(此方法不太正规); import java.sql.Array; import java.util.Arrays; public class Test6ArrayTool { public static void main(String[] args) { int[] nums={4,7,21,9,5,9,24}; for (int num : nums) { System.out.println(num); } System.out.println("==============="); //使用API中的Arrays类的sort方法可以排序 Arrays.sort(nums); for (int num : nums) { System.out.println(num); } } }