比如:班上有32个同学,如果我要统计所有同学的年龄,计算平均年龄,最高年龄等等 定义32个变量分别保存每个同学的年龄,然后再进行操作,这样会显得很麻烦 所有java就提供了数组,解决这种问题 数据就是用来存储多个变量(元素)的东西(容器) 变量的数据类型要一致 数组即可以存储基本数据类型也可以存储引用数据类型
数组的定义格式: 1.数据类型[] 数组名; int[] a; 定义了一个int类型的数组a变量
2.数据类型 数组名[]; int b[]; 定义了一个int类型的b数组变量
格式1和格式2的效果是一样的,没有什么区别,只是读法上有不同,推荐使用格式一,因为第一张其他语言也有使用
java中数组必须进行初始化,所谓初始化就是为了数组中数组元素分配内存空间,并为每个数组元素赋值
动态初始化:初始化时只只定数组长度,由系统为数组分配初始化值
格式:数组类型[] 数组名 = new 数据类型[数组长度] 数组长度其实就是数组中元素的个数 new:分配内存空间 通过数组名访问数据的格式:数组名[索引]
静态初始化:初始化时只定每个数组元素的初始值,由系统决定数组长度 格式:数据类型[] 数组名 = new 数组类型[]{元素1,元素2,…} 举例:int[] arr = new int[]{1,2,3}
解释:定义了一个int类型的数据,数组名是arr,这个数组可以存放3个int类型的值,值分别是1,2,3 简写int[] arr = {1,2,3}; 一般使用静态初始化
Java程序再运行时,需要再内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分,每一篇区域都有特定的处理数据的方式和内存管理方式 1.栈:存储局部变量 栈内存 的数据使用完就释放(脱离了作用域的时候就释放) 局部变量:方法定义中或者方法申明上上的变量都成为局部变量
2.堆:存储new出来的东西 使用完毕就变成垃圾,会在垃圾回收器空闲的时候回收 每一个new出来的东西都有地址值 每个变量都有默认值 byte,short,int,long默认值0 float,double默认值:0.0 char默认值是’\u0000’ boolean默认值:false 引用类型 默认值:null 3.方法区:
4.本地方法区:和系统相关
5.寄存器:给cpu使用
总结:栈内存的两个引用指向同一个堆内存
我们在很多时候,数组的元素不能看人去数 这个时候数据给我们提供了一个属性:length专门用来获取数组的长度 格式:数组名.length返回数组的长度 基础遍历:
for (int x = 0; x < arr.length; x++) { System.out.println(arr[x]); }改进:
for (int x = 0; x < arr.length; x++) { if(x == arr.length-1){ System.out.print(arr[x]); }else{ System.out.print(arr[x]+","); } }用方法改进: /* * 遍历数组的方法 * * 参数列表:int[] arr * 返回值类型:void */
public static void printArray(int[] arr) { for (int x = 0; x < arr.length; x++) { if (x == arr.length - 1) { System.out.print(arr[x]); } else { System.out.print(arr[x] + ","); } } System.out.println(); }数组获取最大值 package com.yige.array;
/*
需求:数组获取最大值分析:a.定义一个数组,并对数组的元素进行静态初始化b.从数组中任意的找一个元素作为参照物(一般取第一个),默认他就是最大值c.然后遍历其他的元素,依次获取和参照物进行比较,如果大就是擂主 ,如果小就离开d.最后参照物保存的就是最大值*/ public class ArrayTest2 { public static void main(String[] args) { // a.定义一个数组,并对数组的元素进行静态初始化 int[] arr = { 12, 45, 78, 11, 78 }; // b.从数组中任意的找一个元素作为参照物(一般取第一个),默认他就是最大值 int max = arr[0]; // c.然后遍历其他的元素,依次获取和参照物进行比较,如果大就是擂主 ,如果小就离开 for (int x = 1; x < arr.length; x++) { if (arr[x] > max) { max = arr[x]; } } System.out.println("max:" + max); } }数组元素逆序 package com.yige.array;
/*
需求:数组元素逆序分析:a.定义一个数组,并对数组的元素进行静态初始化b.把0索引和arr.length-1进行交换把1索引和arr.length-2进行交换到arr.length/2的时候就停止*/ public class ArrayTest3 { public static void main(String[] args) { // a.定义一个数组,并对数组的元素进行静态初始化 int[] arr = { 12, 45, 78, 11, 78 }; System.out.println("逆序前:"); printArray(arr); // int temp = arr[0]; // arr[0] = arr[arr.length-1-0]; // arr[arr.length-1] = temp; // // int temp1 = arr[1]; // arr[1] = arr[arr.length-1-1]; // arr[arr.length-1-1] = temp; reverse(arr); System.out.println("逆序后:"); printArray(arr); } /* * 数组逆序方法 * * 参数列表:int[] arr * 返回值类型:void * */ public static void reverse(int[] arr){ for(int x=0;x<arr.length/2;x++){ int temp = arr[x]; arr[x] = arr[arr.length-1-x]; arr[arr.length-1-x] = temp; } } /* * 遍历数组的方法 * * 参数列表:int[] arr * 返回值类型:void */ public static void printArray(int[] arr) { for (int x = 0; x < arr.length; x++) { if (x == arr.length - 1) { System.out.print(arr[x]); } else { System.out.print(arr[x] + ","); } } System.out.println(); } }数组元素查找 基本查找 package com.yige.array;
import java.util.Scanner;
/*
需求:数组元素查找(查找指定元素第一次在数组中出现索引)基本查找:从头找到尾分析:a.定义一个数组,并对数组的元素进行静态初始化b.遍历数组,依次获取数组中每一个元素,和要找的数据进行比较如果相等:就返回当前索引*/ public class ArrayTest4 { public static void main(String[] args) { // a.定义一个数组,并对数组的元素进行静态初始化 int[] arr = { 12, 45, 78, 11, 78 }; Scanner sc = new Scanner(System.in); System.out.println("请输入你要查找的数据:"); int value = sc.nextInt(); int index = -1; // b.遍历数组,依次获取数组中每一个元素,和要找的数据进行比较 // for (int x = 0; x < arr.length; x++) { // if (arr[x] == value) { // index = x; // break; // } // } System.out.println("index:" + getIndex(arr,value)); } /* * 数组元素查找(查找指定元素第一次在数组中出现索引) * * 参数列表:int[] arr,int value * 返回值类型:int */ public static int getIndex(int[] arr, int value) { // 定义一个索引,如果找不到数据,我们一般直接返回一个负数 int index = -1; for (int x = 0; x < arr.length; x++) { if (arr[x] == value) { index = x; break; } } return index; } }二分查找(折半查找) package com.yige.array;
import java.util.Scanner;
/*
二分数组查找分析:a.定义最大索引,最小索引b.计算出中间索引 最大索引+最小索引/2c.拿中间值和要查找的值进行比较 相等:就返回当前中间索引 大于:左边找,max = mid-1 小于:右边找,min = mid+1 重写计算中间索引,回到b*/ public class ArrayTest5 { public static void main(String[] args) { int[] arr = { 12, 45, 54, 65, 87 }; Scanner sc = new Scanner(System.in); System.out.println("请输入你要查找的数据:"); int value = sc.nextInt(); System.out.println("mid:" + getIndex(arr,value)); } /* * 二分数组查找 * * 参数列表:int[] arr,int value * 返回值类型:int * */ public static int getIndex(int[] arr,int value){ // a.定义最大索引,最小索引 int max = arr.length - 1; int min = 0; // b.计算出中间索引 最大索引+最小索引/2 int mid = (max + min) / 2; while (arr[mid] != value) { // false if (arr[mid] > value) { max = mid - 1; } else if (arr[mid] < value) { min = mid + 1; } if(min>max){ return -1; } mid = (max + min) / 2; } return mid; } }