1.数组的概述
数组英文:array。数组是多个相同类型数据的组合,实现对这些数据的统一管理
数组中的元素可以是任何数据类型,包括基本类型和引用类型。数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量。
2.数组的基本要素
- 数组名
- 数组类型
- 数组下标(索引):下标是从0开始计算的
- 数组元素(存储的类型相同元素)
3.数组的分类
- 一维数组
- 二维数组
- 多维数组
4.一维数组
4.1一维数组的声明
type var[] 或 type[] var;
例如:
int a[];
int[] a1;
double b[];
Mydate[] c; //对象数组
Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
4.2 一维数组初始化、赋值
Java中使用new关键字来初始化数组
1、先声明,再初始化 , 再赋值
int[] a;
a = new int[5];//这是真正为数组分配空间。一但分配,就不能再改变大小。
a[0]=11; a[1]=3; a[2]=8;a [3]=7; a[4]=5; //这种赋值方式叫做动态赋值
上面的代码可以写成 int[] a = new int[5];
a[0]=11;a[1]=3;a[2]=8;a[3]=7;a[4]=5;
2、声明,初始化,赋值,一个语句完成(静态赋值)
int[] a = new int[]{6,2,5,1,4};//注意:这种方式不能指定长度
甚至可以写成
int[] a = {6,2,5,1,4};
4.3 一维数组的使用
1、获得数组长度
数组名.length
2、访问数组元素
数组名[index]
index为数组下标,从0开始,到数组长度-1结束
4.4 一位数组遍历
for(int i=0;i<数组引用变量名.length;i++){System.out.println(数组引用变量名[i]);
}
例如
for(int i=0;i<s.length;i++){
System.out.println(s[i]);
}
增强型for循环(foreach循环)
4.5 数组的默认值:
- 数组定义好之后,如果对应的下标没有被赋值,那么数组将会使用其默认值。
- 数组默认值:
double类型的数组默认值: 0.0
int类型、short类型、byte类型、long类型:默认值0
boolean类型数组默认值是 false;
float类型数组默认值是: 0.0
char类型的数组默认值是: 空白字符
String类型的数组默认值是: null
4.6 案例1:
- 将以下的数组的元素值逆序输出
int[] numbers={100,10,45,56,77,88,99,10000};
public static void main(String[] args) {
// 最大下标是7
int[] numbers = { 100, 10, 45, 56, 77, 88, 99, 10000 };
for (int i = numbers.length - 1; i >= 0; i--) {
System.out.println(numbers[i]);
}
}
}
4.7案例2:
- 查询数组中是否包含某个数,如果包含输出这个数所在的下标,如果不包含输出提示文字。
int[] numbers={18,23,2,100,23,344,102}
Scanner input=new Scanner(System.in);
int[] numbers = { 18, 23, 2, 100, 23, 344, 102 };
System.out.print("请输入一个数字:");
int number=input.nextInt();
boolean flag=false; //默认false
for (int i = 0; i < numbers.length; i++) {
if(numbers[i]==number){
System.out.println("找到啦,下标是:"+i);
flag=true; //做一个标记 代表找到了
break; //找到了之后就退出
}
}
if(flag==false){
System.out.println("这个数组不包含这个元素!");
}
}
4.8案例3:
public static void main(String[] args) {double[] moneys = new double[5];
Scanner input = new Scanner(System.in);
System.out.println("请输入会员消费记录:");
double sum = 0.0;
for (int i = 0; i < moneys.length; i++) {
System.out.print("请输入第" + (i + 1) + "笔购物金额:");
double m = input.nextDouble();
moneys[i] = m; // 将每个值顺序存入数组中
sum = sum + m; // 累加和
}
System.out.println("序号 金额(元)");
for (int i = 0; i < moneys.length; i++) {
System.out.println((i + 1) + " " + moneys[i]);
}
System.out.println("总金额是:" + sum);
}
5.数组内存分析
6.数组基本算法
6.1求数组中最大值和最小值
/** 01-数组中查找最大值和最小值
*/
public class Demo1 {
public static void main(String[] args) {
int[] numbers = { 213, 34, 54, 657, 8, 78, 789, 3243, 56, 9, 1 };
int max = numbers[0]; // 初始值 放第一个元素
int min = numbers[0]; // 初始值 放第一个元素
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
System.out.println("最大值是:" + max);
System.out.println("最小值是:" + min);
}
}
6.2数组的插入算法
- 数组开始的时候是有顺序的,插入一个元素后,使得这个数组保持原来的顺序。
* 02-数组的插入算法
*/
public class Demo2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] numbers = new int[6]; // 待插入的数组
numbers[0] = 99;
numbers[1] = 85;
numbers[2] = 82;
numbers[3] = 63;
numbers[4] = 60;
System.out.print("请输入要插入的数字:");
int num = input.nextInt(); // 80
int index = numbers.length-1; // 初始值,认为最后一个是插入的位置
// 1.寻找要插入的位置
for (int i = 0; i < numbers.length-1; i++) {
if (numbers[i] < num) {
index = i; // 记录下标
break;
}
}
System.out.println("插入的下标是:"+index);
// 2.数组的元素移动
for (int i = numbers.length - 1; i > index; i--) {
numbers[i] = numbers[i - 1];
}
numbers[index] = num; // 把数字插入到指定的下标中
// 3. 输出插入完毕后的数组
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + "\t");
}
}
}
6.3数组的删除算法
- 数组开始的时候是有顺序的,指定删除其中的某一个元素,删除完毕之后。还能保证数组有序。
* 03-数组中删除元素
*/
public class Demo3 {
public static void main(String[] args) {
int[] numbers = { 100, 78, 45, 44, 30, 20, 10 };
Scanner input = new Scanner(System.in);
System.out.print("请输入要删除的元素:");
int num = input.nextInt(); // 44
// 1.寻找要删除的位置
int index = -1; // 默认值 存储删除的位置
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == num) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("输入的元素不存在!!无法删除!!");
} else {
System.out.println("要删除元素的下标是:" + index);
// 依次移动数组
for (int i = index + 1; i < numbers.length; i++) {
numbers[i - 1] = numbers[i];
}
numbers[numbers.length - 1] = 0; // 最后空白的位置归0
// 输出
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + "\t");
}
}
}
}
6.4 交换两个变量的值
/** 交换两个变量的值
*/
public class Demo5 {
public static void main(String[] args) {
int a = 1000;
int b = 10;
int temp; //中间变量
temp = a; // temp=1000 a=1000 b=10
a = b; // temp=1000 a=10 b=10
b = temp; // temp=1000 b=1000 a=10
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}
6.5 数组排序算法-冒泡排序
/** 04-冒泡排序算法
*/
public class Demo4 {
public static void main(String[] args) {
int[] numbers = { 213, 34, 54, 657, 8, 78, 789 }; // 升序排列
for (int i = 0; i < numbers.length - 1; i++) {
for (int j = 0; j < numbers.length - 1 - i; j++) {
if (numbers[j] > numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + "\t");
}
}
}
- 排序中如果是 if (numbers[j] > numbers[j + 1]) 那么就是升序
- 排序中如果是 if (numbers[j] < numbers[j + 1]) 那么就是降序
6.6 选择法排序
6.7 二分查找法(折半查找法)
1.二分查找又称折半查找,它是一种效率较高的查找方法。
2.二分查找要求(前提):
(1)必须采用顺序存储结构
(2).必须按关键字大小有序排列
3.原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。
4.代码实现
int[] array = { 1, 4, 7, 9, 10, 44, 78, 101, 203, 500 };
int index = binarySearch(array,78);
System.out.println(index);
}
/*
* 循环实现二分查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据
*/
public static int binarySearch(int[] arr, int x) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int middle = (low + high) / 2;
if (x == arr[middle]) {
return middle;
} else if (x < arr[middle]) {
high = middle - 1;
} else {
low = middle + 1;
}
}
return -1;
}
7.二维数组
7.1 二维数组定义
二维数组其实就是数组的数组。
二维数组中的每个元素又是一个数组。
- 二维数组的定义:
- 二维数组的声明和赋值
- 二维数组的注意事项:
创建二维数组的时候,一定要定义第一维的长度。
7.2 二维数组定义-定义并赋值
- 写法一
注意不能定义长度:
注意不能定义长度: - 写法二
存储的结构:
7.3 二维数组的遍历
/** 循环遍历二维数组
*/
public class Demo3 {
public static void main(String[] args) {
int[][] scores = new int[][] { { 90, 85, 92, 78, 54 }, { 76, 63, 80 },{ 87, 70 } };
for (int i = 0; i < scores.length; i++) {
for (int j = 0; j < scores[i].length; j++) {
System.out.print(scores[i][j] + "\t");
}
System.out.println("");
}
}
}
7.4 二维数组案例
/** 使用二维数组存储数据
*/
public class Demo4 {
public static void main(String[] args) {
int[][] scores=new int[3][5]; //定义一个二维数组
Scanner input=new Scanner(System.in);
//动态从键盘上输入所有数组的值
for (int i = 0; i < scores.length; i++) {
System.out.println("***********第"+(i+1)+"个班*************");
for (int j = 0; j < scores[i].length; j++) {
System.out.print("请输入第"+(j+1)+"个学生成绩:");
int num=input.nextInt();
scores[i][j]=num; //动态从键盘输入值 按顺序存入数组
}
}
//计算每个班的总成绩
for (int i = 0; i < scores.length; i++) {
int sum=0; //求和 每个班的成绩
for (int j = 0; j < scores[i].length; j++) {
sum=sum+scores[i][j];
}
System.out.println((i+1)+"班的总成绩是:"+sum);
}
}
}
例如
0出现3次
1出现4次
2出现 ?次
……
int score[]={0,0,1,2,3,5,4,5,2,8,7,6,9,5,4,8,3,1,0,2,4,8,7,9,5,2,1,2,3,9,2,2,5,1};
public static void main(String[] args) {
int[] score = { 0, 0, 1, 2, 3, 5, 4, 5, 2, 8, 7, 6, 9, 5, 4, 8, 3, 1,
0, 2, 4, 8, 7, 9, 5, 2, 1, 2, 3, 9, 2, 2, 5, 1 };
for (int i = 0; i <= 9; i++) {
int count = 0;
for (int j = 0; j < score.length; j++) {
if (score[j] == i) {
count++;
}
}
System.out.println(i+"出现"+count+"次!");
}
}
}
3、现在有如下一个数组:int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
要求将以上数组中的0项去掉,将不为0的值存入一个新的数组,生成新的数组为:
int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5};
int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5, 1 }; //原来数组
int count=0;
for (int i = 0; i < oldArr.length; i++) {
if(oldArr[i]!=0){
count++;
}
}
System.out.println("非0的数字个数为:"+count);
int[] newArr=new int[count]; //创建一个新的新数组
int index=0; //作为新数组的下标
for (int i = 0; i < oldArr.length; i++) {
if(oldArr[i]!=0){
newArr[index]=oldArr[i];
index++;
}
}
//------------------输出-----------------------
for (int i = 0; i < newArr.length; i++) {
System.out.print(newArr[i]+"\t");
}
}
4、编写一个程序,从键盘输入10个数字。求这个整数数组的最大值、最小值、平均值和所有数组元素的和。
public static void main(String[] args) {int[] numbers = new int[10];
Scanner input = new Scanner(System.in);
for (int i = 0; i < numbers.length; i++) {
System.out.print("请输入第" + (i + 1) + "个数:");
int num = input.nextInt();
numbers[i] = num;
}
int max = numbers[0];
int min = numbers[0];
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] > max) {
max = numbers[i];
}
if (numbers[i] < min) {
min = numbers[i];
}
}
System.out.println("最大值是:" + max);
System.out.println("最大值是:" + min);
}
8.数组工具类
- 在Java中JDK开发库提供了一个专门进行数组操作的工具类Arrays类,方便开发人员对数组进行一些常见操作。
- 在Java中一个类如果有s结尾,那么这个类一般都是工具类。
- Arrays类位于 java.util包提供的工具类
- java.util.Arrays类包含了用来操作数组(比如排序和搜索)的各种方法。
8.1 数组工具类使用
- boolean equals(array1,array2):比较两个数组中的内容是否相同
- sort(array) : 将数组进行升序排列
- String toString(array) :将数组中的元素拼接成一个字符串
- void fill(array,val) :把数组中的所有元素替换成一个新的元素
- copyOf(array,length) 复制一个原数组,得到一个新的数组
- int binarySearch(array, val) 二分查找法 查询一个元素在数组中所在的下标