Java数组

数组介绍

数组可以存放多个同一类型数据数组也是一种数据类型,是引用类型

  • 即:数(数据)组(一组)就是一组数据;

数组快速入门

问题:一个养鸡场有 6 只鸡,它们的体重分别是 3kg,5kg,1kg,3.4kg,2kg,50kg 。请问这六只鸡的总体重是多少?平 均体重是多少?



public class Array01{
	
	public static void main(String[] args){
		 //定义一个数组
		 double average  = 0;
		 double totalWeight = 0;
		 //静态初始化 数据类型 []变量名 = {值1,值2,值3}
		 //他们的类型都是一样的,且是程序运行中可以更改的变量
 		 double [] hens = {3,5,1,3.4,2,50};
 		 //数组名.length 可以获取数组的长度
 		 System.out.println("数组的长度=" + hens.length);
 		 for (int i = 0; i < hens.length;i++ ) {
 		 	totalWeight +=hens[i];
 		 	System.out.println("第" + (i+1) + "个元素的值=" + hens[i] );
 		 }
 		 average = totalWeight / hens.length;
 		 System.out.println("平均重:" + average);
	}
} 

1.数组的使用方式

1.1动态初始化

使用方法1-动态初始化

数组的定义:

数据类型 a[] = new 数据类型[大小]
int a[] = new int[5];//创建了一个数组,名字a,存放5个int 默认值是0,double为0.0

使用方法2-动态初始化

先声明:

语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;

创建数组

语法: 数组名=new 数据类型[大小];
a=new int[10]

示例

import java.util.Scanner;

public class Array02{
	
	public static void main(String[] args){

		Scanner myScanner = new Scanner(System.in);
		int i;

		// double score [] = new double [5];
		
		double score [];//声明一个数组,这时是一个空值
		score = new double [5];
		for (i=0;i < score.length ;i++ ) {
			System.out.print("请输入第"+ (i+1) +"个成绩:");
			score[i] = myScanner.nextDouble();
		}
		for (i=0; i < score.length ; i++ ) {
			System.out.println("第"+ (i+1) +"个成绩为:" + score[i]);
		}
		System.out.println("程序运行结束!");

	}
} 

1.2静态初始化

语法:数据类型 数组名[] = {元素值,元素值.....}

  • 适用于元素的值不太多的情况下使用

例如:

int a[] = {1,2,3,4,5,6,7,8,9}
相当于:
int a[] = new a[9];
a[0]=1;
a[1]=2;
...

2.数组的注意事项

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用
  3. 数组创建后,如果没有赋值,有默认值
  • int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
  1. 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数
  2. 数组的下标是从 0 开始的
  3. 数组下标必须在指定范围内使用,否则报:下标越界异常
    • 索引最小为0,最大是数组的长度-1
  4. 数组属于引用类型,数组型数据是对象(object)

应用案例

题目:创建一个 char 类型的 26 个元素的数组,分别 放置'A'-'Z'。使用 for 循环访问所有元素并打印出来。提示:char 类型 数据运算 'A'+2 -> 'C' ArrayExercise01.java



public class ArrayExercise01{
	
	public static void main(String[] args){
		/*
			创建一个 char 类型的 26 个元素的数组,
			分别 放置'A'-'Z'。使用 for 循环访问所有元素并打印出来。
			提示:char 类型
			数据运算 'A'+2 -> 'C' ArrayExercise01.jav
		 */
		char letter[] = new char[26];
		char ch = 'A';
		for (int i = 0; i < letter.length ; i++,ch++ ) {
			//方法一
			// letter[i] = (char)('A' + i);
			//方法二
			letter[i] = ch;
		}
		for (int i = 0; i <letter.length ; i++ ) {
			System.out.print(letter[i] + " ");
		}
	}
} 

3.数组的赋值机制

1)基本数据类型赋值,这个值就是具体的数据,而且相互不影响

  • 赋值方式为值,拷贝

2) 数组在默认情况下是引用传递,赋的值是地址。

//数组在默认情况下是引用传递,赋的是地址
//是一个地址,arr2变化会影响arr1
int arr1[] = {1,2,3};
int arr2[] = arr1; // 把arr1赋值给arr2;

image-20211128171219515

示例

数组的拷贝

public class ArrayCopy{
	
	public static void main(String[] args){

		int arr1[] = {10,20,30};
		int arr2[] = new int [arr1.length];
		for (int i = 0; i<arr1.length ; i++) {
			arr2[i] = arr1[i];
		}
		for (int i = 0; i<arr2.length ; i++ ) {
			System.out.println(arr2[i]);
		}
	}
} 

4.数组的翻转

方法一:找规律

public class ArrayReverse{
	
	public static void main(String[] args){
		//方法一
		int arr1[] = {1,2,3,4,5,6};
		int i;
		for ( i = arr1.length-1; i >=0 ; i-- ) {
			System.out.print(arr1[i] + " ");
		}
		System.out.println();
		//方法二
		// int j;
		// System.out.println();
		// for ( i = 0, j= arr1.length-1;  i  < j; i++,j-- ) {
		// 	int tem = arr1[i];	
		// 	arr1[i] = arr1[j];
		// 	arr1[j] = tem;
		// }
		// for ( i = 0; i<arr1.length ; i++ ) {
		// 	System.out.print(arr1[i] + " ");
		// }

		// 老师的思路
		// 一共交换3次
		// 每次交换时,对应的下标是 arr1[i] 和 arr1[arr1.length - 1 - i];
		
		for ( i = 0;  i< arr1.length/2; i++) {
			int temp = arr1[arr1.length-1-i];
			arr1[arr1.length-1-i] = arr1[i];
			arr1[i] = temp;
		}
		 for ( i = 0; i<arr1.length ; i++ ) {
			System.out.print(arr1[i] + " ");
		}	
	}
} 

方法二:用另外一个数组来接受

int arr1[] = {10,20,30};
		int arr2[] = new int [arr1.length];
		for (int i = 0; i<arr1.length ; i++) {
			arr2[i] = arr1[i];
		}
		for (int i = 0; i<arr2.length ; i++ ) {
			System.out.println(arr2[i]);
		}

5.数组的扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容。ArrayAdd.java

  1. 原始数组使用静态分配 int[] arr =
  2. 增加的元素 4,直接放在数组的最后 arr = {1,2,3,4} 3)
  3. 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n ArrayAdd02.java
import java.util.Scanner;

public class ArrayAdd{
	
	public static void main(String[] args){
		Scanner myScanner = new  Scanner(System.in);
		char ch = ' ';
		int arr[] = {1,2,3};
		while(true){
			//这个数组是用来接收arr数组的值,长度位arr.length+1,最后的一个下标用于
			//存放新添加的元素
			int arrNew[] = new int[arr.length+1];
			System.out.println("请输入要添加的数字");
			int n = myScanner.nextInt();

			//把arr数组的元素copy到arrNew这个新的数组里面去
			for (int i = 0; i <arr.length ; i++ ) {
				arrNew[i] = arr[i];
			}
			//把新的值付给arrNew最后一个元素
			arrNew[arrNew.length-1] = n;
			//让arr指向arrNew,这时,arr原本指向的数组就没人引用了,会被销毁回收,
			//arr的地址变成了arrNew的地址
			arr = arrNew;
			for (int i = 0 ; i <arr.length ; i++ ) {
				System.out.print(arr[i]+" ");
			}
			System.out.println();
			System.out.println("添加成功,是否继续添加(y/n)");
			ch = myScanner.next().charAt(0);
			if ( ch == 'n') {
				break;
			}
		}
	}
} 

6.数组的排序

6.1内部排序

  • 指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法

6.2外部排序

  • 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法。

6.3冒泡排序

package ArrayList_Practice;

public class BubbleSort {
	
	public static void main(String[] args) {
		// 冒泡排序
		int a[] = {24,69,80,57,13};
		int i,j,temp;
		for(i = 0 ; i < a.length -1 ; i++) {
			for( j = 0 ; j < a.length - i -1 ; j++) {
				//在冒泡排序中第m趟循环比较n-m次
				//目的:每一趟都两两比较,如果第一个数比第二个数大,就让他们互换位置
				if(a[j]>a[j+1]) {
					//交换位置
					temp = a[j];
					a[j+1] = a[j];
					a[j] = temp;
				}
			}
		}
		//打印
		for (int k = 0; k < a.length; k++) {
			System.out.print(a[k]);
			if(k!=a.length-1) {
				System.out.print(",");
			}
		}
	}
}

7.查找

7.1顺序查找

int a[] = { 24, 69, 80, 57, 13 };
int key = 99;
System.out.println("{24,69,80,57,13}");
System.out.println("查找80的位置");
int i;
// 顺序查找
System.out.println("顺序查找");
for (i = 0; i < a.length; i++) {
    System.out.println("执行第" + i + "次");
    if (a[i] == key) {
        System.out.print("找到");
        System.out.println(key + "在第" + i + "位置上");
        break;
    }
}
if(i == a.length-1) {
    System.out.println("查找失败");
}

7.2二分查找

System.out.println("二分查找");

int low, height, mid, cnt;
low = 0;
cnt = 0;
height = a.length - 1;
while (low <= height) {
    cnt++;
    System.out.println("执行第" + cnt + "次");
    mid = (low + height) / 2;
    if (key == a[mid]) {
        System.out.print("找到了,");
        System.out.println(key + "在第二个" + mid + "位置上");
        break;
    } else if (key < a[mid]) {
        height = mid - 1;
    } else {
        low = mid + 1;
    }
}
if (low > height) {
    System.out.println("查找失败");
}

完整代码:

package ArrayList_Practice;

public class BinSearch {
	public static void main(String[] args) {
		int a[] = { 24, 69, 80, 57, 13 };
		int key = 99;

		System.out.println("{24,69,80,57,13}");
		System.out.println("查找80的位置");
		int i;
		// 顺序查找
		System.out.println("顺序查找");
		for (i = 0; i < a.length; i++) {
			System.out.println("执行第" + i + "次");
			if (a[i] == key) {
				System.out.print("找到");
				System.out.println(key + "在第" + i + "位置上");
				break;
			}
		}
		if(i == a.length-1) {
			System.out.println("查找失败");
		}
		
		System.out.println("======================");

		// 二分查找
		System.out.println("二分查找");

		int low, height, mid, cnt;
		low = 0;
		cnt = 0;
		height = a.length - 1;
		while (low <= height) {
			cnt++;
			System.out.println("执行第" + cnt + "次");
			mid = (low + height) / 2;
			if (key == a[mid]) {
				System.out.print("找到了,");
				System.out.println(key + "在第二个" + mid + "位置上");
				break;
			} else if (key < a[mid]) {
				height = mid - 1;
			} else {
				low = mid + 1;
			}
		}
		if (low > height) {
			System.out.println("查找失败");
		}
	}
}
posted @ 2021-12-31 17:47  DL50  阅读(59)  评论(0编辑  收藏  举报