zoukankan      html  css  js  c++  java
  • 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 = {1,2,3}
    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("查找失败");
    		}
    	}
    }
    
  • 相关阅读:
    断开/删除 SVN 链接(.svn)的几种方法
    Android 中 ListView 常用属性合集
    Android 中 GridView 常用属性合集
    LeetCode-387-字符串中的第一个唯一字符
    LeetCode-374-猜数字大小
    LeetCode-290-单词规律
    LeetCode-278-第一个错误的版本
    LeetCode-383-赎金信
    LeetCode-367-有效的完全平方数
    LeetCode-350-两个数组的交集 II
  • 原文地址:https://www.cnblogs.com/DL50/p/15754014.html
Copyright © 2011-2022 走看看