前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java开发知识之Java数组

Java开发知识之Java数组

作者头像
IBinary
发布2019-05-25 16:16:10
1.4K3
发布2019-05-25 16:16:10
举报
文章被收录于专栏:逆向技术逆向技术

          Java开发知识之Java数组

一丶数组简介

  首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构

在Java中数组可以看成是一个对象. C++ 中数组就是数组. Java中的数组其实是封装的数组.虽然是由基础类型组成.但可以当对象使用. C++中的则不可以.

数组可以分为一维数组. 二维数组. 三维数组 .高维数组..

二丶一维数组

  使用数组我们就要学会声明

1.数组的声明

  在Java中数组是new出来的.所以我们可以使用new关键字. 有两种方式

先声明后new

数组元素类型 数组名字[]; //定义

  数组元素类型[] 数组名字; //定义

  数组名字 = new 数组元素类型[个数]; //分配内存,分配了内存才可以使用

  数组元素类型 数组名[] = new 数组元素类型[个数];

关于第一种,想必C++开发人员比较熟悉.在C++中数组的定义就是这样定义的.

Java中数组只是定义.并没有实际内存来存放数据.所以下面我们必须要用new关键字分配内存.

[] 运算符. 关于数组元素类型.我们可以是int ,如果是int 那么数组每个元素的大小都是int类型大小. 也可以是对象.

如果是对象,那么数组元素大小都是 数组元素类型的大小.

代码:

代码语言:javascript
复制
int Array1[];
Array1 = new int[10];  //定义的时候括号在前在后都可以
        
int []Array2 = new int[100];//括号在前也可以

int arr[] = new int[5]; 了解内存模式

元素有5个. arr[0] - arr[4];

下标也是5个,用来访问数组内容的. 但是数组下标都是从0开始的. 也就是0位置的元素是arr[0] 5位置的元素是arr[4]

下标计算方法:  数组元素的最大个数 - 1; 比如你new了 100个.元素个数100个. 100-1 就是下标最大值了. 从0 - 100 -1;

2.一维数组的初始化.

  在我们定义数组的同事可以进行初始化.这也方便我们的编程

语法1:

  数组元素类型 数组名[] = new 数组元素类型[]{值,值,值};

语法2:

  数组元素类型 数组名[] = {值,值,值};

代码例子:

代码语言:javascript
复制
int Array1[] = new int[] {1,2,3,4,5,6,7,8,9,10};
    
int Array2[] =  {1,2,3,4,5,6,7,8,9,10};

3.一维数组的使用

  数组一般用来遍历的.数组的遍历使用for循环.或者foreach都可以.数组可以看成一个对象.那么数组元素的大小就在对象中存储着.所以我们可以直接使用.不用再计算数组的大小了

for循环

代码语言:javascript
复制
for (int i = 0; i < Array1.length; i++)
    {
            System.out.println(Array1[i]);
    }

输出结果

三丶二维数组

  上面讲了一维数组的操作.以及一维数组的简单理解模型(如下图),那么二维数组可以看成一个平面.其实在内存中还是一维数组.不过如果要理解的话内存模型想象成一个平面即可.

1.二维数组的创建

  二维数组跟一维数组一样.只不过你是二维的所以需要两个 []运算符

定义:

  数组元素类型 数组名称[][];

  数组元素类型[][] 数组名称;

内存申请:

  数组元素类型[][] 数组名称 = new 数组元素类型[个数][个数];

  数组元素类型 数组名称[][] = new 数组元素类型[个数][个数];

第二种方式:定义二维数组.不指定一维数组大小

a = new int[2][]; 一个二维数组. a[0] 跟 a[1]

a[0] = new int[2]; 为a[0] 分为2个一维数组.

a[1] = new int[3]; 为a[1] 分配3个以为数组

内存模型图:

此时 a[0] 跟 a[1] 可以理解为是以为数组首地址.

注意一下使用的时候 new关键字如何使用即可.

二维数组内存模型

代码: a = new int[2][4];

二维数组的大小可以计算出来的. 2 * 4 = 8; 总共8个. 因为是int类型. 所以是 8 * int(4) = 32; 所以所占内存是32个字节;

2 4 的意思就是 分配了两个一维数组. 每个一维数组的大小是4个元素.

所以看下面内存模型图:

2.二维数组初始化

  二维数组初始化跟一维数组一样.都是使用大括号进行初始化. 只不过多了两个[][]

语法:

  数据元素类型 数组名称[][] = {值,值,值}

语法2

  数据元素类型 数组名称[][] = {{值,值},{值,值},{值,值}};

第二种初始化方法.因为我们是二维数组.是一个平面.所以可以理解为需要x y的值. 内部的大括号就是x y 的值.

代码:

代码语言:javascript
复制
    int Array1[][] = new int[][] {{1,2},{3,4},{5,6},{7,8},{9,10}}; //定义并且初始化
    
        
        for (int i = 0; i < Array1.length; i++)
        {
            for (int j = 0; j < Array1[i].length; j ++) //注意这里.Array[i]代表的是一维数组. Array[i].length代表的就是一维数组组大小.
            {
                System.out.println(Array1[i][j]);
            }
        }

四丶数组的基本操作

  对于数组来说,我们会定义.还要会使用.

1.遍历数组.

  遍历数组一般使用for循环.foreach也可以.

一维数组遍历的两种方式

代码语言:javascript
复制
        int Array1[] = new int[]{1,2,3,4,5,6,7,8,9,10};
        for (int i = 0; i < Array1.length; i++) {
            System.out.print(" " + Array1[i]);
        }
        System.out.println(" ");
        for(int s:  Array1) {
            System.out.print(" " + s);
        }
        System.out.println(" ");
    }

输出结果:

注意增强for循环

  for (元素数据类型 变量名: 元素变量){};

遍历的时候. 我们的变量名就是元素变量中的值了. 上面第一个循环是 Array[i] 需要用下标. 增强for循环则不用.

二维数组的遍历

代码语言:javascript
复制
        int Array1[][] = new int[][]{{1,2},{3,4},{5,6},{7,8},{9,10}};
        for (int i = 0; i < Array1.length; i++) {
            for (int j = 0; j < Array1[i].length;j++) {
                System.out.print(" " + Array1[i][j]);
            }
            
        }
        System.out.println(" ");
        
        for(int[]  A:  Array1) {
            for (int B  :A) {
                System.out.print(" " + B);
            }
        }
        System.out.println(" ");
    }

二维数组中.第二种遍历方式需要遍历两次, 第一次遍历完毕之后 A变量就相当于一维数组. 然后继续进行一次遍历. 此时B才是数组里面的值.

2.数组的填充

    C++中可以使用ZeroMemory或者memset对一块内存按照指定方式填写指定值. 比如常见的就是数组清零了. Java也可以这样做.Java中我们可以使用Arrays类的静态方法

fill(数组[],填充的值) ps:注意是一维数组.

例子:

代码语言:javascript
复制
int Array1[] = new int[]{1,2,3,4,5,6,7,8,9,10};
Arrays.fill(Array1, 0);
for(int s:Array1) {
	System.out.print(s);
}

输出结果:

可以看出.输出结果都为0. 填充的值为0就是0. 填充的值为x.值就是x(x是一个数值)

fill函数有很多重载.比如常用的.指定一个范围.进行填充

file(数组[],开始位置,结束位置,填充的值);

代码语言:javascript
复制
        int Array1[] = new int[]{1,2,3,4,5,6,7,8,9,10};
        //int Array1[][] = new int[][]{{1,2},{3,4},{5,6},{7,8},{9,10}};
        Arrays.fill(Array1, 0);
        Arrays.fill(Array1, 2,9,12);
        for(int s:Array1) {
            System.out.print(" " + s);
        }

首先数组全部清零.然后从下标2开始.结果都赋值为12

输出结果:

3.数组复制

  C++中的数组是申请的 内存.可以直接使用内存操作. memmove memcpy一个是进行内存移动.一个是内存拷贝.就能实现内存的赋值.如果用于数组.就可以进行数组拷贝了.

  Java中都是Arrays类进行操作数组的.

Arrays中的静态方法 copyOf(数组[],大小) 就可以进行赋值.返回一个新数组

例子:

代码语言:javascript
复制
    int Array1[] = new int[]{1,2,3,4,5,6,7,8,9,10};
        int Array2[] = Arrays.copyOf(Array1, Array1.length);
        //int Array1[][] = new int[][]{{1,2},{3,4},{5,6},{7,8},{9,10}};
        ;
        for(int s:Array2) {
            System.out.print(" " + s);
        }
        

4.范围进行数组复制

  Arrays还可以支持范围复制

copyOfRange(数组,开始索引,结束索引)

例子:

代码语言:javascript
复制
    int Array1[] = new int[]{1,2,3,4,5,6,7,8,9,10};
        int Array2[] = Arrays.copyOfRange(Array1, 0,3);
        //int Array1[][] = new int[][]{{1,2},{3,4},{5,6},{7,8},{9,10}};
        ;
        for(int s:Array2) {
            System.out.print(" " + s);
        }

我们复制了三个. 从0开始.所以输出的1 2 3.三个元素的值. 结束索引是多大.那么我们新的数组元素大小就有多大.什么意思

意思就是我们拷贝了3个元素大小. 那么Array2.length 就是3.

5.数组的排序

  可以使用Arrays类中的静态方法 sort进行排序.

Arrays.sort(数组) 可以对任意数据进行破爱须.

他有很多重载方法.

代码语言:javascript
复制
int Array1[] = new int[]{1,2,6,4,3,6,7,10,9,8};
Arrays.sort(Array1);
        
for(int s:Array1) {
    System.out.print(" " + s);
}

6.数组的查找

  有的时候我们需要查找指定值. 可以使用Arrays.binarySerach()方法进行查找.

返回值索引 binarySearch(数组[],要查找的值) ; 有很多重载方法. 在使用查找之前.需要进行数组排序.

因为BinarySearch是一个二分查找法.

代码语言:javascript
复制
        int Array1[] = new int[]{1,2,6,4,3,6,7,10,9,8};
        Arrays.sort(Array1);
        int nIndex = Arrays.binarySearch(Array1, 2);
        System.out.println("索引值为" + nIndex);
        for(int s:Array1) {
            System.out.print(" " + s);
        }

如果查询不存在.就返回负数. 负数的值.根据排序后.判断应该插入在哪里. 比如我们要查询4. 假设数组中没有4. 那么返回值就是-3.

意思就是如果有4的话.下标应该是在3索引位置. 但是没有.所以返回负数.

五丶数组的算法实现

  5.1冒泡排序

    冒泡排序我们上变也用过,就是Arrays.sort() 那么我们可以自己实现一个.

冒泡排序基本思想:

  冒泡排序的核心思想就是相邻的元素进行比较.进行排序. 冒泡排序是双层for循环. 外层循环是排序的轮数. 内层循环就是比较相邻的数.

如下图所示:

第一轮63不短的跟下一个相邻的元素进行比较.进而得出了.63最大.放到数组最末尾.

此时数组的值最末尾是63 然后进行第二轮比较.依次类推. 一直到完全排序完毕即可.

代码语言:javascript
复制
public static void Sort(int arr[],int nSize) {
        for (int i = 1; i < arr.length; i++){
            for (int j = 0; j < arr.length-i;j++) {
                if (arr[j] > arr[j + 1]) {
                    int nTemp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = nTemp;
                }
            }
        
        }
    }

首先是外层循环.总共循环轮数是 数组大小.

内层循环.内层循环的比较每次都要从0开始比较.比较的大小是数组大小的长度-1; 但是这样比较会很浪费.每次都要比较整个数组.(虽然可以实现)但为了减少比较次数. 所以 -i 也就是剩余比较次数会越来越少.

然后内部代码就是判断. j位置是否小于j+1的位置. 如果是就使用交换算法进行交换.

  5.2直接选择排序

 直接选择排序的原理就是.将指定排序位置与其他数组元素分别进行对比. 如果满足条件.就交换元素的值.注意.不是交换相邻的元素.而是把满足条件的元素预指定的排序位置交换.

比如有楼梯10层. 你选择一层. 跟一其他楼层相比. 小了就位置交换楼层编号. 最终组成了1 - 10层的编号. (这里的小了指高低,如果低了那么就是1楼)

如下:

第一轮.选择最大的数据放在最后.

第二轮. 从中继续选出大于数组中其他元素的最大值.放在最后.

依次类推.

使用直接选择排序的话.需要有一个变量用来记录. 使用双for循环

算法:

代码语言:javascript
复制
    public static void Sort2(int Arr[]) {
        int nIndex = 0;
        for (int i = 1; i < Arr.length;i++) {
            for (int j = 1; j < Arr.length - i;j++) {
                if (Arr[j] > Arr[nIndex]) {
                    nIndex = j; //记录最大的数字
                }
            }
            //进行交换数值.最大的数值放在数组的末尾
            int nTemp = Arr[Arr.length -i];
            Arr[Arr.length -i] = Arr[nIndex];
            Arr[nIndex] = nTemp;
        }
    }

跟冒泡排序类似, 外层控制比较几轮. 内层控制相邻比较次数. 只不过唯一不同就是使用了nIndex值.来保存数值中元素最大的值的索引位置.然后下方交换的时候使用这个索引.排序到数组的最末尾. 注意-i -i的意思就是第一次吧最大值放到末尾.第二次把最大值放到末尾的前一个位置. 比如第一次 xxxx 63 .末尾放了63. 因为外层控制轮数. 所以第二次最大值放到 最大数组- i位置. 也就是成了 xxxx 26 63 ,依次类推.

六丶数组学习总结

  通过上面简介了数组怎么操作.其实可以进行一下总结.

1.数组的定义与使用

数组的定义:

  数组元素类型 维数 数组名字;

  数组元素类型 数组名 维数; 维数代表的意思就是[] .有几维就是几个花括号.

数组的内存分配.

  数组元素类型 维数 数组名字 = new 数组元素类型 维数[个数]; //定义之后要分配内存才能使用

数组的初始化

  数组元素类型 维数 数组名字 = {值,值,值};

  数组元素类型 维数 数组名字 = new 数组元素类型 维数..{值,值,值};

如果是高维数.那么初始化的时候.每个值都用花括号进行初始化即可.

例如:

  数组元素类型[][] 数组名字 = {{值,值},{值,值}};

2.类Arrays对数组进行操作的方法

Arrays.fill(数组,填充的值); //对数组进行填充操作. 重载方法 fill(数组,范围开始,范围结束,填充的值); 对指定范围数组进行填充.

Arrays.copyOf(数组[],复制后新数组的长度); 复制数组至指定长度.

Arrays.copyOfRange(数组,指定的数组开始索引的位置.,数组范围的最后索引的位置): 将指定数组的指定长度.复制到一个新数组当中. 实现范围复制. 最后一个参数是新数组元素个数.

Arrays.sort(数组); 数组排序.,有重载

Arrays.binarySearch(数组,要查找的值): 二分查找法.返回找到的值所在数组的索引,有重载

3.排序算法

最后就是掌握排序算法了.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •           Java开发知识之Java数组
    • 一丶数组简介
      • 二丶一维数组
        • 1.数组的声明
        • 2.一维数组的初始化.
        • 3.一维数组的使用
      • 三丶二维数组
        • 1.二维数组的创建
      • 四丶数组的基本操作
        • 1.遍历数组.
        • 2.数组的填充
        • 3.数组复制
        • 4.范围进行数组复制
        • 5.数组的排序
        • Arrays.sort(数组) 可以对任意数据进行破爱须.
        • 6.数组的查找
      • 五丶数组的算法实现
        •   5.1冒泡排序
        •   5.2直接选择排序
      • 六丶数组学习总结
        • 1.数组的定义与使用
        • 2.类Arrays对数组进行操作的方法
        • 3.排序算法
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档