数组和算法
1.1.1 数组的概念
数组(Array)是相同类型数据的有序结合。
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来(index)访问它们.
数组的三个特点:
--其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
--其元素必须是相同类型,不允许出现混合类型。
--数组中的元素可以是任何数据类型,包括基本类型和引用类型。
--位置有顺序
1.1.2内存空间分类:
内存分为两类:
栈(stack)内存:基本数据类型分配在栈内存,栈内存空间不需要开发者回收,系统会自动回收。栈空间占整个内存空间的比例较小。
堆(heap)内存:引用数据类型分配在堆内存,堆内存一定要开发者通过new 来申请,开发者申请的内存使用完成后一定要回收。jvm中有专门的垃圾回收机制(gc)回收使用完的堆内存。堆空间占整个内存空间的比例较大。
1.2数组的声明
数组的声明有两种方式:
数据类型[] 变量 à推荐写法
数据类型 变量[] |
创建数组:
public class Test03{ public static void main(String[] args){ //声明数组变量 int[] a; //给数组变量分配空间; //给a申请了5个连续整型的int空间。 a = new int[5]; //给每个空间赋值 a[0] = 10; a[1] = 20; a[2] = 30; a[3] = 40; a[4] = 50; //访问元素 System.out.println(a[0]); System.out.println(a[1]); } } |
输出结果为:
1.2.1数组的内存空间
1.2.2 数组声明的其他方式
标准的声明和赋值方法过于复杂,可以使用简写的方式
数据类型[] arr = new int[]{值1,值2,…} |
jvm根据后面值的个数申请空间并把值赋值到对于空间。
public class Test04{ public static void main(String[] args){ //【1】数组声明方式 int[] arr = new int[5]; arr[0] = 10; arr[1] = 20; arr[2] = 30; System.out.println(arr); System.out.println(arr[2]); //【2】值声明 int[] arr1 = new int[]{10,20,30,40,50}; System.out.println(arr1); System.out.println(arr1[2]); //【3】数组的字面量声明 int[] arr2 ={10,20,30,40,50};
//字面量声明不支持分开赋值 /* int[] arr2; arr2 = {10,20,30,40,50}; */ System.out.println(arr2); System.out.println(arr2[2]); } } |
这三种方式返回的结果都是一样的:
1.2.3 数组的遍历
public class Test05{ public static void main(String[] args){ int[] arr = {10,20,30,40,50}; for (int i=0;i<arr.length;i++){ System.out.println("arr["+i+"]"+"="+arr[i]); } } } |
返回的值为:
拓展练习:
从控制台输入5位学生的成绩,请求平均分。
需求分析:
【1】从控制台输入需要调用Scanner;
【2】5位学生的成绩未知,需要先预留空间,等控制台赋值;
【3】需要先求和,才可以求平均分
import java.util.Scanner;
public class Test05{ public static void main(String[] args){
//从控制台输入5个学生的成绩,并求平均分。 float[] arr = new float[5]; Scanner input = new Scanner(System.in); float sum = 0.0f; for (int i=0;i<arr.length;i++){ System.out.println("请输入第"+(i+1)+"位学生的成绩:"); arr[i] = input.nextFloat(); sum += arr[i]; } float avg = sum / arr.length; System.out.println("平均分为"+avg);
} } |
返回结果为:
如何生成26个大写英文字母?
public class Test06{ public static void main(String[] args){ char[] arr = new char[26]; for (int i=0;i<26;i++){ arr[i] =(char)('A'+i); System.out.print(arr[i]+"\t"); } } } |
返回结果为:
有一个数列:8,4,2,1,23,344,12
--循环输出数列的值
--求数列中所有数值的和
--猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含次数
import java.util.Scanner; public class Test07{ public static void main(String[] args){ int[] arr = {8,4,2,1,23,344,12}; int sum = 0; for (int i=0;i<arr.length;i++){ System.out.println(arr[i]); sum += arr[i]; } System.out.println("sum ="+sum); System.out.println("请输入一个数字:"); Scanner sc = new Scanner(System.in); int j = sc.nextInt(); int i=0; for (;i<arr.length;i++){ if (j == arr[i]){
break; } } if (i >= arr.length){ System.out.println(j+"不存在"); }else { System.out.println(j+"存在"); } } } |
返回结果如下:
1.3数组的常用算法
1.3.1插入算法
一个数组有序,添加一个元素后,数组依然有序
public class Test08{ public static void main(String[] args){ int[] arr = {1,3,5,7,9,11,0}; int t = 8; //【1】找位置 int loc = -1; //表示应该添加到的位置 for(int i=0;i<arr.length-1;i++){ if(arr[i] >= t){ loc = i; break; } } System.out.println("loc="+loc); if(loc<0){ //没找到合适位置 arr[arr.length-1] = t; }else{ //【2】依次后移 for(int j=arr.length-1;j>loc;j--){ arr[j] = arr[j-1]; } //【3】添加插入的值 arr[loc] = t; } //验证 for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } } } |
返回结果如下:
1.3.2 删除算法
一个数组有序,删除一个元素后,数组依然有序
public class Test09{ public static void main(String[] args){ int[] arr = {1,3,5,7,9,11}; int t = 7; //【1】找位置 int loc = -1; for(int i=0;i<arr.length;i++){ if(t == arr[i]){ loc = i; break; } } //【2】移动元素 if(loc < 0){ System.out.println(t+"在数组中不存在"); }else{ for(int j = loc;j<arr.length-1;j++) arr[j] = arr[j+1]; } //[3]最后一个元素置0 arr[arr.length-1] = 0;
//验证 for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+"\t");
} } } |
返回结果为:
1.3.3冒泡排序算法
请将一组无序数组进行有序排序
分析图示例:
代码示例:
public class Test10{ public static void main(String[] args){ int[] arr = {5,3,4,2,1}; int a = 0; for(int i =0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ a = arr[j]; arr[j] = arr[j+1]; arr[j+1] = a; } } } for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } } } |
返回结果如下: