zoukankan      html  css  js  c++  java
  • Java数组学习

    数组

    1、数组概述

    数组是相同类型数据的有序集合,按照一定的先后次序排列组合而成。

    其中每一个数据成为一个数组元素,可通过下表访问他们。

    2、数组声明创建

    2.1 数组的声明

    首先必须声明数组变量,才能使用。

    首选的方法:dataType[] arrayRe; 例如: int[] nums;

    另外一种方法(效果相同,并不首选):dataType arrayRe[];

    2.2数组的创建

    2.2.3数组的创建

    Java数组的创建使用new操作符。

    dataType[] arrayRe =new dataType[size];

    数组元素是通过索引访问,数组索引从0开始。

    获取数组长度:arrays.length;

    给数组赋值时候,没有复制的话:int默认为0,string默认null

    2.2.4三种初始化及内存分析

    Java内存(主要):堆、栈、方法区

    堆:存放new的对象和数组、可以被所有的线程共享,不会存放别的对象引用。

    栈:存放基本变量类型(会包含这个基本类型的具体数值)、引用对象的变量(会存放这个引用在堆里面的具体地址)

    方法区:可以被所有的线程共享,包含了所有的class和static变量。

    声明:int[]=nums;

    创建:nums=new int[10];(动态初始化:默认值全部是0)

    静态初始化:创建+赋值(一旦定义了大小,数组长度不可变。)int[] a={1,2,3,4,5,6};

    2.2.5下标越界及小结

    数组的四个基本特点:

    1、长度是确定的,数组一旦被创建,大小不会改变。

    2、其元素必须是相同类型,不能出现混合类型。

    3、数组中的元素可以是任何数据类型(基本类型和引用类型)

    4、数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。

    5、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组本身就是在在堆中的。

    数组边界

    数组下标的合法区间:[0,length-1],越界会报错误:ArrayIndexOutOfBoundsException:数组下标越界异常

    3、数组使用

    3.1 For-Each循环

    增强for循环:取不到下标

    int[] a={1,2,3,4,5};
    for(int a1:a){
        System.out.println(a1);
    }
    

    3.2数组作方法入参

    public static  void printArray(int[] array){
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
    

    3.3数组作返回值

    反转数组:

    public static void main(String[] args) {
    int[] a={1,2,3,4,5};
    int[] reverse1=reverse(a);
    printArray(reverse1);
    }
    public static void printArray(int[] array){
    for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
    }
    }
    //反转数组
    public static int[] reverse(int[] array){
    int[] reverse=new int[array.length];
    for (int i = 0,j=reverse.length-1; i < array.length; i++,j--) {
    reverse[j]=array[i];
    }
    return reverse;
    }

    4、多维数组

    多维数组可以看成是数组的数组。例如二维数组中的每一个元素都是一个一维数组。

    二维数组的定义:

    int a[][]=new int [2][5];

    输入二维数组:

    public static void main(String[] args) {
        int [][] array={{1,2},{2,3}};//两行两列  第一行{1,2},第二行{2,3}
        /*
        * array[0]:{1,2}
        * array[1]:{2,3*/
        print(array[0]);
        System.out.println(array[0][0]);
    }
    public static  void print(int [] array){
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
    

    5、Arrays类

    数组的工具类java.util.Arrays;Arrays类本身都是static修饰的静态方法。在使用的时候可以直接调用,也可以用对象来使用。

    具有以下功能:

    给数组赋值:fill方法

    对数组排序:sort方法升序

    比较数组:equals方法比较数组元素是否相等

    查找数组元素:binarySearch方法可以对排序好的数组进行二分查找法操作。

     public static void main(String[] args) {
            int[] a={1,2,6,3,8};
            System.out.println(a);//输出结果:[I@85ede7b  这是对象的hashcode
            System.out.println(Arrays.toString(a));//输出结果:[1, 2, 6, 3, 8]
            //排序
            Arrays.sort(a);
            System.out.println(Arrays.toString(a));//输出结果:[1, 2, 3, 6, 8]
            //比较数组 :输出结果:a和b数组元素不一样
            int[] b={1,2,3,4,5};
    //        for (int i = 0; i < a.length; i++) {
                if(Arrays.equals(a,b)){
                    System.out.println("a和b数组元素一样");
                }else{
                    System.out.println("a和b数组元素不一样");
            }
                //查找数组元素
            System.out.println(Arrays.binarySearch(a,3));//2(3在a数组中下标为2)
            //填充数组 输出结果:[7, 7, 7, 7, 7]
            Arrays.fill(a,7);
            System.out.println(Arrays.toString(a));
        }
    

    6、冒泡排序

    冒泡排序是八大排序中最出名的算法,其时间复杂度是O(n^2)。

    思想:从后往前,或者从前往后,依次比较相邻的两个元素,进行排序

    代码实现思想:两层循环,外层冒泡轮数,里层依次比较。

    1、比较数组中,两个相邻元素,如果第一个比第二个大,交换位置

    2、每一次比较都会产生一个最大或者最小的数字

    3、下一轮比较,可以少一次排序。

    public static void main(String[] args) {
        int[] arrays={1,3,4,2,6};
        sort(arrays);
        System.out.println(Arrays.toString(arrays));//输出结果:[6, 4, 3, 2, 1]
    }
    public static int[] sort(int[] array){
        int temp=0;
        for (int i = 0; i < array.length-1; i++) {
            for (int i1 = 0; i1 < array.length - 1-i; i1++) {
                if(array[i1+1]>array[i1]){
                    temp=array[i1];
                    array[i1]=array[i1+1];
                    array[i1+1]=temp;
                }
            }
        }
        return array;
    }
    

    优化:如果数组一开始就是一个有序数组,元素没有进行交换,则直接退出。

    public static void main(String[] args) {
        int[] arrays={1,3,4,2,6};
        sort(arrays);
        System.out.println(Arrays.toString(arrays));//输出结果:[6, 4, 3, 2, 1]
    }
    public static int[] sort(int[] array){
        int temp=0;
        for (int i = 0; i < array.length-1; i++) {
            boolean flag=false;
            for (int i1 = 0; i1 < array.length - 1-i; i1++) {
                if(array[i1+1]>array[i1]){
                    temp=array[i1];
                    array[i1]=array[i1+1];
                    array[i1+1]=temp;
                    flag=true;
                }
            }
            if(flag==false){
                break;
            }
        }
        return array;
    }
    

    7、稀疏数组

    稀疏数组是一种重要的数据结构。当一个数组的大部分元素为0或者为同一个值,可以用稀疏数组保存该数组。

    稀疏数组的处理方式是:

    记录数组有多少行列,多少个不同值;

    把具有不同值的元素和行列以及值记录在一个小规模的数组中,从而缩小程序的规模。

    例如:

    六行七列八个不同的值。

    练习:编写一个五子棋游戏,要求有存盘退出和续盘的功能。

        public static void main(String[] args) {
            int[][] array=new int[11][11];
            //输出原始数组
            array[1][2]=1;
            array[2][3]=2;
            for(int[] ints:array){
                for(int i:ints){
                    System.out.print(" "+i);
                }
                System.out.println();
            }
            //转换成稀疏数组保存
            //获取有效值
            int sum=0;
            for (int i = 0; i < 11; i++) {
                for (int j = 0; j < 11; j++) {
                    if(array[i][j]!=0){
                        sum++;
                    }
                }
            }
            System.out.println(sum);
            //创建一个稀疏数组的表示数组
            int[][] array2=new int[sum+1][3];
            //为其赋值
            array2[0][0]=11;
            array2[0][1]=11;
            array2[0][2]=sum;
            //遍历原来的二维数组,将非零数字存在稀疏数组中
            int cnt=0;
            for (int i = 0; i <array.length ; i++) {
                for (int j = 0; j < array[i].length; j++) {
                    if(array[i][j]!=0){
                        cnt++;
                        array2[cnt][0]=i;
                        array2[cnt][1]=j;
                        array2[cnt][2]=array[i][j];
                    }
                }
            }
            for (int i = 0; i <array2.length ; i++) {
                System.out.println(array2[i][0]+"	"+array2[i][1]+"	"+array2[i][2]);
            }
    //        for (int i = 0; i <array2.length ; i++) {
    //            for (int j = 0; j <3 ; j++) {
    //                System.out.print(array2[i][j]+"	");
    //            }
    //            System.out.println();
    //        }
            System.out.println("=============还原稀疏数组============");
            //读取稀疏数组
            int[][] array3=new int[array2[0][0]][array2[0][1]];
            for (int i = 1; i < array2.length; i++) {
                array3[array2[i][0]][array2[i][1]]=array2[i][2];
            }
            for(int[] ints:array3){
                for(int i:ints){
                    System.out.print(" "+i);
                }
                System.out.println();
            }
    
        }
    }
          
    
  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/yunxiaoqian/p/13849473.html
Copyright © 2011-2022 走看看