美文网首页
JavaSE之数组

JavaSE之数组

作者: kim_liu | 来源:发表于2018-09-21 14:07 被阅读8次

一维数组:一条线


一维数组

二维数组:一个面


二维数组

三维数组:一个立方体,三维数组使用较少,这里不提及。

一维数组

数组的创建

声明方式:如int a[]; 或者 int [] a;
Java中使用new关键字创建数组对象,格式为
int [] s = new int[5];
那么创建数组时,内存中的情况如何呢?

首先是基本类型的数组的创建: 图片.png

然后是引用类型的数组的创建:看这样一段代码

class Date{
    int year,month,day;
    Date(int year,int month,int day){
        this.year = year;
        this.month = month;
        this.day = day;
    }
}
public class TestArray {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Date[] days ;
        days = new Date[3];
        for(int i = 0;i < 3;i++){
            days[i] =  new Date(2018,9,21);
        }
    }
}

这段代码执行时,内存是如何变化的呢?


图片.png

数组的初始化 (数组是:必须把空间分配好了,才可以往里面装值)

动态初始化

数组定义与数组元素分配空间和赋值的操作分开进行。
如:int[] a = new int[3];

静态初始化

在定义数组的同时就为数组元素分配空间并赋值。
如:int [] a = {3,9,8};

数组元素默认初始化

数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。也就是说int类型的初始化为0,引用类型初始化为null等。

数组元素的引用

定义并用运算符new为之分配空间后,才可以引用数组中的每个元素,数组元素的引用方式为:arrayName[index],index为数组元素下标,可以是整型常量或者整型表达式。如a[3],b[i],c[6*i]。数组元素的下标从0开始,长度为n的数组合法取值范围为:0~n-1。每个数组的length属性都能指明其长度。

冒泡排序:

冒泡排序的原理就是:(从小到大)将每一个元素与其之后的一个元素比较,即a[i]与a[i+1]进行比较,如果a[i] > a[i+1],定义一个中间变量temp,使temp = a[i];a[i] = a[i+1];a[i+1] = temp;将a[i]和a[i+1]的值交换。因为每一个数都要与其之后的每个数进行比较,因此,需要进行嵌套循环,代码如下:

 //冒泡排序
            int temp ;//中间变量
            for(int k = 0 ; k < arrays.length ; k++){
                for (int i = 0 ; i < arrays.length - 1 ; i++) {
                    if(arrays[i] > arrays[i+1]){
                        temp = arrays[i];
                        arrays[i] = arrays[i+1];
                        arrays[i + 1] = temp;
                    }
                }
            }

选择排序

从小到大排序,拿出第一个数,与后面的每个数进行比较,如果第一个数大于后面的数,就进行交换,这样下来就把最小的数找出了,再拿出第二个数与后面的每个数进行比较...依次类推,每一个数都与其后的每个数进行比较,如果大就交换,那么循环完成,排序就完成了,代码如下:

                int temp;
         for(int i= 0;i<arrays.length;i++){
             for(int j = i+1;j<arrays.length;j++){
                 if(arrays[i]>arrays[j]){
                     temp = arrays[i];
                     arrays[i] = arrays[j];
                     arrays[j] = temp;
                 }
             }
         }

选择排序高效率版

原理:一次遍历只做一次交换,标记最小值的位置,用一个变量记录该位置,之前遍历交换值,现在交换位置,遍历完成之后,再将值进行交换。

int k,temp;
         for (int i = 0; i < arrays.length; i++) {
             k = i;
             for(int j = k+1;j<arrays.length;j++){
                 if(arrays[j] < arrays[k]){
                     k = j;//position的交换,经过循环,可以把最小值的位置找出
                 }
             }
             if(k != i){
                 //找出最小的位置后,如果不是被比较的数,那么再把位置上的数进行交换
                 temp = arrays[i];
                 arrays[i] = arrays[k];
                 arrays[k] = temp;
             }
        }

练习:500个人拉成一圈,循环123报数,逢3退1,最后500个人只剩一人,请问,这个最后剩下的人一开始是第几个人?

        /**
         * 500个人拉成一圈,循环123报数,逢3退1,
         * 最后500个人只剩一人,
         * 请问,这个最后剩下的人一开始是第几个人?
         * 
         * 使用数组的思路
         */
        
        boolean[] arr = new boolean[500];//只要还在圈里的 都是true
        
        for(int i = 0; i< arr.length;i++){
            //一开始全部都在圈里
            arr[i] = true;
        }
        
        int leftCount = arr.length;//剩下的人数 初始化为500
        int countNum = 0;//记录报数的变量
        int index = 0;//position
        
        while(leftCount > 1){
            //只要剩下的人数>1个,就进入循环
            if(arr[index] == true){
                countNum ++;//只要在圈中就要报数
                if(countNum == 3){
                    //报数到3
                    countNum = 0;//清零 再重新报数
                    arr[index] = false;//报数到3 置为false 相当于出圈
                    leftCount -- ;//剩下的人-1
                }
                
            }
            
            index ++;//每循环一次,index+1
            if(index == arr.length){
                //一圈下来,index置为0,再开始新的一圈
                index = 0;
            }
        }
        
        //循环结束,圈里还剩一个人为true,找出这个人
        for(int i = 0;i < arr.length; i++){
            if(arr[i] == true){
                System.out.println(i+"  ");
            }
        }

二分查找法

查找都是在排序排好的基础上进行的,所谓二分查找法,是在排序排好的数组中,从中间的位置开始找,直到找到要找的值为止。

         //二分查找
     public static int binarySearch(int[] a,int i){ 
         if(a.length == 0){
             return -1;
         }
         int startPos = 0;
         int endPos = a.length - 1;
         int m = (startPos + endPos) / 2;
         while(startPos <= endPos){
             if(i == a[m]){
                 //如果要查找的值,刚好等于中间值
                 return m;
             }
             if(i > a[m]){
                 //如果要查找的值,比中间值大,说明在中间值的右边
                 startPos = m + 1;//更改起始位置
             } 
             if(i < a[m]){
                //如果要查找的值,比中间值小,说明在中间值的左边
                 endPos = m - 1;//更改结束位置
             } 
            //一次循环结束,更改m
             m = ( startPos + endPos ) / 2;
         }
         return -1;
     }

二维数组

二维数组可以看成已数组为元素的数组。如:
int a[][] = {{1,2},{3,4,5},{7,8,9}};
二维数组的声明和初始化应该从高维到低维的顺序进行(也就是从左到右),如:
int a[][] = new int[3][];//合法
int a[][] = new int[][4];//非法
二维数组在内存中的情况如下:


二维数组在内存中的情况

二维数组的初始化

静态初始化

int a[][] = {{1,2},{3,4,5},{7,8,9}};

动态初始化

int a[][] = new int[3][5];
int b[][] = new int[3][];
b[0] = new int[2];
b[1] = new int[3];
b[2] = new int[5];

数组的拷贝

System.arraycopy(Object srcArr,int srcPos,Object dest,int destPos,int length);
数组srcArr从srcPos项元素开始的length个元素拷贝到dest数组从destPos项开始的length个位置。

数组结束。下一章常用类

欢迎关注个人公众号,加入进来一起学习吧!


平头哥写代码

相关文章

  • JavaSE之数组

    一维数组:一条线 二维数组:一个面 三维数组:一个立方体,三维数组使用较少,这里不提及。 一维数组 数组的创建 声...

  • JavaSE之数组

    六、数组 目录:数组概述、数组声明创建、数组使用、多维数组、Array类、稀疏数组 1.什么是数组 数组的定义:数...

  • JavaSE之数组

    课前小例 数据类型: 1.基本数据类型:byte short int long float double char...

  • JavaSE之数组

    语法及元素访问 一些错误方式 数组的遍历(重点) Foreach循环写法 数组的排序(重点) 经典练习 非重点 二...

  • JavaSE之数组复习

    一维数组 介绍 数组是一种引用类型 数组是一种简单的数据结果,线性的结构 数组是一种容器,可以来存储其他元素,数组...

  • JavaSE——数组集合

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互...

  • JavaSE 数组排序

    Java数组排序是数组操作常用操作之一,通过排序将数组中原来顺序按照升序(从小到大)或降序(从大到小)重新组织。数...

  • javaSE - 006 - 数组

    定义,java的数组是引用类型 相同数据类型的连续的数据空间1.动态初始化 2.静态初始化

  • 2018-09-21

    关于数组 @(JavaSE) 数组平时用的太频繁了,可能就是因为用的太多,竟然根本就没有想过数组其实也是对象。任何...

  • JavaSE 基础学习之五 —— IO 操作 (java. io

    接上篇《JavaSE 基础学习之四 —— 异常的处理》 五. JavaSE 基础学习 —— IO 操作 (java...

网友评论

      本文标题:JavaSE之数组

      本文链接:https://www.haomeiwen.com/subject/pjuanftx.html