JavaSE(5)_数组、算法的选择(未掌握)

本文介绍了Java中数组的使用,包括一维和多维数组的内存解析,以及数组涉及的常见算法,如赋值、查找、排序。重点讨论了各种排序算法,如冒泡排序、快速排序,分析了它们的性能和适用场景。此外,还提到了Arrays工具类的使用及其在排序和异常处理中的应用。
摘要由CSDN通过智能技术生成

目录

数组概述

 (前置知识)JVM内存_方法区、堆、虚拟机栈的简单介绍 

一维数组的使用

一维数组内存解析

多维数组的使用

 二维数组JVM内存解析

数组中涉及到的常见算法

数组元素的赋值

求数值型数组中元素的最大值、最小值、平均数、总和等

数组的深复制和浅复制、冒泡排序法

数组的反转、查找、快速排序法

Arrays 工具类的使用

数组使用中的常见异常 

数组元素的排序算法

十大内部排序算法

算法的 5 大特征

排序算法性能对比分析

各种内部排序方法性能比较

排序算法的选择


数组概述

  • 数组(Array),是多个相同类型数据按照以一定顺序排序的集合体,并使用一个名字命名(用变量存储指向堆内存的内存地址),并通过下标从0开始对集合体里面按照顺序存储相同类型的数据进行统一管理.
  • 因此数组内的名词有:
    • 数组名
    • 元素
    • 角标(最初最末下标)、下标、索引
    • 数组长度==元素个数
  • 数组特点:
    • 数组属于引用类型变量,用变量存储指向堆内存的内存地址。
    • 数组元素可以是相同的基本数据类型,也可以是相同的引用类型
    • 数组元素会在内存中开辟一条连续的内存空间,是有序排列的,目的是方便查找
    • 数组的长度一旦确认,就不能更改。后面我们学习数组拓展数组时都是将旧数组元素提取出来放到新数组中,然后丢弃旧数组。
  • 数组分类:
    • 维数分类:一维数组、二维数组等
    • 按照元素数组类型分类:基本数据类型数组、引用数据类型数组

 (前置知识)JVM内存_方法区、堆、虚拟机栈的简单介绍 

一维数组的使用

package javase5;

import java.util.Scanner;

public class Array1 {
    static char c1;
    public static void main(String[] args) {
        int[] intArray = null;//一维数组声明
        int[] intArray1 = new int[]{0, 1, 2, 3, 4};//一维数组静态初始化方法1:数组初始化和赋值一同完成
        int[] intArray2 = {0, 1, 2, 3, 4};//一维数组静态初始化方法2:数组初始化和赋值一同完成

        int[] intArray3 = new int[5];//以为数组静态初始化方法:数组初始化和赋值分开
        intArray3[0] = 0;
        intArray3[1] = 1;
        int length1 = intArray3.length;//5
        intArray3[2] = 2;
        intArray3[3] = 3;
        intArray3[4] = 4;
        int length2 = intArray3.length;//5
//        intArray3[5] = 5;//超过了数组角标,运行时数组下标越界异常java.lang.ArrayIndexOutOfBoundsException: 5

        //遍历数组
        //普通for循环
        for (int i = 0; i < intArray3.length; i++) {
            System.out.print(intArray3[i]);//01234
        }
        //高效for循环for(遍历出来的数据类型 遍历出来的数据的变量名 : 被遍历的对象){
        //              循环体,循环次数为被遍历对象的长度
        //              }
        for (int i : intArray3) {
            System.out.print(i);//01234
        }
        System.out.println('\n' + "----------分割线------------");

        /*各种类型数组动态初始化时自身的默认值*/
        //int[]
        int[] arr1 = new int[4];
        for (int i : arr1) {
            System.out.print(i);//0000
        }
        System.out.println('\n' + "----------分割线------------");
        //short[]
        short[] arr2 = new short[4];
        for (int i : arr2) {
            System.out.print(i);//0000
        }
        System.out.println('\n' + "----------分割线------------");
        //byte[]
        byte[] arr3 = new byte[4];
        for (int i : arr3) {
            System.out.print(i);
        }
        System.out.println('\n' + "----------分割线------------");
        //float[]
        float[] arr4 = new float[4];
        for (float i : arr4) {
            System.out.print(i);//0.00.00.00.0
        }
        System.out.println('\n' + "----------分割线------------");
        //double
        double[] arr5 = new double[4];
        for (double i : arr5) {
            System.out.print(i);//0.00.00.00.0
        }
        System.out.println('\n' + "----------分割线------------");
        //char[]
        char[] arr6 = new char[4];
        for (char i : arr6) {
            System.out.print(i);//4个都是空串
        }
        /*char值默认就是空字符,空字符不能直接对比,在用==于基本数据类型对比时空串会转换成0来对比*/
//        if(''==0) System.out.println("不能直接对比");//编译错误,空字符文字
        if (arr6[0] == 0)System.out.println("char数组里面的元素默认为空串");
        System.out.println('\n' + "----------分割线------------");

        //String[]
        String[] arr7 = new String[4];
        for (String i : arr7) {
            System.out.print(i);//nullnullnullnull
        }

        /*
         * 2. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
         * 成绩>=最高分-10    等级为’A’   
         * 成绩>=最高分-20    等级为’B’
         * 成绩>=最高分-30    等级为’C’   
         * 其余等级为’D’
         * 提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
         */
        //1.使用Scanner,读取学生的个数
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入学生人数:");
        int num = scan.nextInt();

        //2.创建数组,存储学生成绩,动态初始化
        int[] str = new int[num];
        System.out.println("请输入" + num + "个学生成绩");

        //3.给数组中的元素赋值
        int maxnum = 0;
        for(int i = 0;i < str.length;i++){
            str[i] = scan.nextInt();
            //4.获取数组元素中的最大值:最高分
            if(maxnum < str[i]){
                maxnum = str[i];
            }
        }

        //5.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级和成绩
        char Grade;	//成绩等级
        for(int i = 0;i < str.length;i++){
            if(maxnum - str[i] <= 10){
                Grade = 'A';
            }else if(maxnum - str[i] <= 20){
                Grade = 'B';
            }else if(maxnum - str[i] <= 30){
                Grade = 'C';
            }else{
                Grade = 'D';
            }

            System.out.println("student " + i + "score is" + str[i] +
                    " grade is " + Grade);
        }
    }
}

一维数组内存解析

int[] arr = new int[]{1,2,3};
String[] arr1 = new String[4];
arr1[1] = “刘德华”;
arr1[2] = “张学友”;
arr1 = new String[3];
System.out.println(arr1[1]);//null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值