Java开发知识之Java数组
一丶数组简介
首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构
在Java中数组可以看成是一个对象. C++ 中数组就是数组. Java中的数组其实是封装的数组.虽然是由基础类型组成.但可以当对象使用. C++中的则不可以.
数组可以分为一维数组. 二维数组. 三维数组 .高维数组..
二丶一维数组
使用数组我们就要学会声明
1.数组的声明
在Java中数组是new出来的.所以我们可以使用new关键字. 有两种方式
先声明后new
数组元素类型 数组名字[]; //定义
数组元素类型[] 数组名字; //定义
数组名字 = new 数组元素类型[个数]; //分配内存,分配了内存才可以使用
数组元素类型 数组名[] = new 数组元素类型[个数];
关于第一种,想必C++开发人员比较熟悉.在C++中数组的定义就是这样定义的.
Java中数组只是定义.并没有实际内存来存放数据.所以下面我们必须要用new关键字分配内存.
[] 运算符. 关于数组元素类型.我们可以是int ,如果是int 那么数组每个元素的大小都是int类型大小. 也可以是对象.
如果是对象,那么数组元素大小都是 数组元素类型的大小.
代码:
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:
数组元素类型 数组名[] = {值,值,值};
代码例子:
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循环
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 的值.
代码:
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也可以.
一维数组遍历的两种方式
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循环则不用.
二维数组的遍历
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:注意是一维数组.
例子:
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(数组[],开始位置,结束位置,填充的值);
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(数组[],大小) 就可以进行赋值.返回一个新数组
例子:
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(数组,开始索引,结束索引)
例子:
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(数组) 可以对任意数据进行破爱须.
他有很多重载方法.
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是一个二分查找法.
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 然后进行第二轮比较.依次类推. 一直到完全排序完毕即可.
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循环
算法:
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.排序算法
最后就是掌握排序算法了.
以上是 Java开发知识之Java数组 的全部内容, 来源链接: utcz.com/z/394129.html