在一些实际场景中组织数据时,会将大量的数据放在一起进行处理。数组就是为了满足这一要求而设置的数据结构。
1.一维数组
教室里,座位都是按照行和列进行排列的。
数组是常用的数据结构,是一种复合数据类型。是有序数据的集合。
数据中每个元素的数据类型必须相同,可以用一个统一的数组名和下标唯一的标识数组中的元素
1.数组的概念
数组的元素既可以是基本数据类型,也可以是复合数据类型。(复合数据类型:数组、类或接口)。数组的元素也可以是数组,这就出现了二维数组。
基本数据类型是通过值操作的,数组是通过引用操作的。
基本数据类型:只改变整数的值,不改变在内存中对应的地址。
数组变量:只是给出一个在内存中存放数据的地址。对数组的操作是通过引用地址实现的。
2.一维数组的声明
1.定义形式
数据类型[] 数组名;
数据类型 数组名[];
- 分配空间
数据类型 数组名 = {值1,值2,...,值n}
数组名 = new 数据类型[数组长度
数组名 = new 数据类型[数据长度]
java中,数组编号是从0开始的
3.一维数组的使用
数组元素是通过数组名和下标来访问的
数组名[下标]
数组的下标是从0开始递增,直到长度-1时结束
数组下标超过长度,出现ArrayIndexOutOfBoundsException错误
- 首先声明一个double类型的数组,然后为数组元素赋值,最后将数组元素全部输出。
package capther6;
public class oneDimArrayApp {
public static void main(String[] args) {
double[] arrayex = new double[10];
arrayex[0] = 45.76;
for(int i = 1;i<10;i++) {
arrayex[i] = arrayex[i-1] +2;
}
for(int i =0;i<arrayex.length;i++) {
System.out.println("arrayex["+i+"]="+arrayex[i]);
}
}
}
4.一维数组的空间模型
我们可以想象在一栋大楼里面的每一个住户的房子都是一个数组,如果麦当劳公司的快递员想要送快递到某一家,则需要根据门牌号,如3栋3门301送到这家。这里的门牌号就是住户(数组)的地址。
声明一个数组只是得到一个存放数组地址的变量,对于数组的操作是通过地址引用来实现的。
int arrayex[]
得到 数组的地址空间模型
arrayex = new int[5];
将数组初始化为长度为5的整形数组
- 两个数组指向同一个引用地址,如果改变其中一个数组元素的值,则另一个数组元素的值也会发生变化。
package capther6;
public class TwoArrayModify {
public static void main(String[] args) {
int[] arraymarks2;
int[] arraymarks1 = {281,282,283,284,285};
int mark1 = 198;
int mark2;
arraymarks2 = arraymarks1;
mark2 = mark1;
System.out.println("修改前的数据为");
System.out.println("mark1 = "+mark1 +" mark2 = "+mark2);
for(int i = 0;i<arraymarks1.length;i++) {
System.out.println("marks1["+i+"]="+arraymarks1[i]+";"+"marks2["+i+"]="+arraymarks2[i]);
}
mark2 = 200;
arraymarks2[3] = 297;
System.out.println("修改后的数据为");
System.out.println("mark1 = "+mark1 +" mark2 = "+mark2);
for(int i = 0;i<arraymarks1.length;i++) { System.out.println("marks1["+i+"]="+arraymarks1[i]+";"+"marks2["+i+"]="+arraymarks2[i]);
}
}
}
5.基本数据类型数据
byte、short、int、long、char、Boolean、short、float、double等类型的数组都是基本 数据类型数组。这些数组中各个元素存放的是元素的值,元素的改变是相应的值在改变。
1.整形数组中元素首位倒置
package capther6;
public class IntBasicArrayReverse {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {178,243,376,559,589,593};
System.out.println("数组元素倒置前");
System.out.print("{"+array[0]);
for(int i =1;i<array.length;i++) {
System.out.print(","+array[i]);
}
System.out.println("}");
for(int i =0;i<array.length/2+1;i++) {
array[i] = array[i] + array[array.length-1-i];
array[array.length-1-i] = array[i]-array[array.length-1-i];
array[i] = array[i] - array[array.length-1-i];
}
System.out.println("数组元素倒置后");
System.out.print("{"+array[0]);
for(int i =1;i<array.length;i++) {
System.out.print(","+array[i]);
}
System.out.println("}");
}
}
6.对象数组
对象数组是指数组元素是类的对象,对象数组元素中存放的是对象的地址。如果两个元素引用了一个相同的地址,把么其中一个元素的改变会引起另一个元素的改变
package capther6;
public class ObjectArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer[] obarray = new StringBuffer[2];
obarray[0] = new StringBuffer("Chinese");
obarray[1] = new StringBuffer("Japanese");
System.out.println("原始字符串:");
System.out.println("obarray[0]="+obarray[0] + " obarray[1]"+obarray[1]);
StringBuffer temp;
temp = obarray[0];
obarray[0] = obarray[1];
obarray[1] = temp;
System.out.println("改变后的字符串:");
System.out.println("obarray[0]="+obarray[0] + " obarray[1]"+obarray[1]);
}
}
7.数组参数
java中允许使用数组元素和整个数组作为方法的参数。
Java中可以定义方法,它用整个数组作为方法的形参(形式参数),当方法被调用时,传递给这个形参的变量就是整个数组
数组的类型决定了传递给数组参数的自变量的数据类型。但是没有显示的给出数组的长苏。因此,同样的数组参数可以被不同长度的数组自变量取代。
2.二维数组
对于一维数组,如果数组的元素也是数组。那么每个数组的一个元素都是由一个一维数组构成的,这样一维数组就变成了二维数组。多维数组同样也是数组的数组。即N维数组的每一个元素都是一个N-1维数组。
1.二维数组的声明
1.定义形式
数据类型[][] 数组名;
数据类型 数组名[][];
2.初始化
数组变量名 = new 数据类型[二维长度][一维长度]
2.二维数组的空间模型
在多维数组的高维元素中,每一个元素保存的是一个低维数组的地址
二维数组array[3][5]模型
##3.二维数组应用
- 二维数组转置例子
package capther6;
public class MatrixInvert {
public static void main(String[] args) {
// TODO Auto-generated method stub
int matrice1[][]={{1,4,6,10},{3,5,8,14},{6,7,9,21}};
int matrice2[][]=new int[matrice1[0].length][matrice1.length];
System.out.println("矩阵转置前为 ");
for(int i=0;i<matrice1.length;i++)
{
for(int j=0;j<matrice1[0].length;j++)
{
System.out.print(matrice1[i][j]+" ");
}
System.out.println();
}
for(int i=0;i<matrice1.length;i++)
{
for(int j=0;j<matrice1[i].length;j++)
{
matrice2[j][i] =matrice1[i][j];
}
}
System.out.println("矩阵转置后为 ");
for(int i=0;i<matrice2.length;i++)
{
for(int j=0;j<matrice2[i].length;j++)
{
System.out.print(matrice2[i][j]+" ");
}
System.out.println();
}
}
}
3.数组操作
图书馆里的图书放置,是按照行和 列放置的。我们可以将图书的位置称作为二维数组。在偌大的图书馆里想要扎到需要的书,则需要根据索引找到图书所在的某行某列的书架,图书馆就是一个存储图书的数组。查找图书,给图书排序,都是在执行数组的操作。
Java的工具类:Arrays
Array是java.util里的一个数组工具类,有很多可供数组使用的方法。包括排序、查找、复制、填充数据、比较等
1.排序
package capther6;
import java.util.Arrays;
public class ArraySortMethod {
public static void main(String[] args) {
int[] array = {83,43,24,-13,13,28,2,98};
System.out.println("排序前的数组顺序为");
System.out.print("{"+array[0]);
for(int i =1;i<array.length;i++) {
System.out.print(","+array[i]);
}
System.out.println("}");
Arrays.sort(array);
System.out.println("排序后的数组顺序为");
System.out.print("{"+array[0]);
for(int i =1;i<array.length;i++) {
System.out.print(","+array[i]);
}
System.out.println("}");
}
}
2.查找
我们去剧场看电影或者在很大的图书管理找到一本书,这些都是查找的例子。我们可以通过行和列来找到对应位置的座位或图书,但是对于一个容量很大的数组来说,这样的效率非常到底。可以使用Arrays里提供的二分搜索法查找
package capther6;
import java.util.Arrays;
public class binarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {83,43,24,-13,13,28,2,98};
System.out.println("排序前的数组顺序为");
System.out.print("{"+array[0]);
for(int i =1;i<array.length;i++) {
System.out.print(","+array[i]);
}
System.out.println("}");
System.out.println("未排序查找数组中13的位置为:"+Arrays.binarySearch(array, 13));
Arrays.sort(array);
System.out.println("排序后的数组顺序为");
System.out.print("{"+array[0]);
for(int i =1;i<array.length;i++) {
System.out.print(","+array[i]);
}
System.out.println("}");
System.out.println("排序后查找数组中13的位置为:"+Arrays.binarySearch(array, 13))
}
}
3.复制
在使用Word编写文档的时候,为了节约时间,减少不必要的操作,会使用复制操作。使用数组也一样。如果希望建立一个数组和已有数组拥有同样的数据,可以使用复制数组的功能。
CopyOf()方法复制数指定范围内的元素,并且返回新的数组
copyOfRange()方法将数组中指定范围的元素复制到一个新的数组
package capther6;
import java.util.Arrays;
public class ArrayCopyExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arrayA = {83,43,24,-13,13,28,2,98};
System.out.print("arrayA = ");
System.out.print("{"+arrayA[0]);
for(int i =1;i<arrayA.length;i++) {
System.out.print(","+arrayA[i]);
}
System.out.println("}");
int arrayB[] = new int[arrayA.length];
arrayB = Arrays.copyOf(arrayA, 3);
System.out.print("arrayB = ");
System.out.print("{"+arrayB[0]);
for(int i =1;i<arrayB.length;i++) {
System.out.print(","+arrayB[i]);
}
System.out.println("}");
int arrayC[] = new int[10];
arrayC = Arrays.copyOfRange(arrayA, 5, 9);
System.out.print("arrayC = ");
System.out.print("{"+arrayC[0]);
for(int i =1;i<arrayC.length;i++) {
System.out.print(","+arrayC[i]);
}
System.out.println("}");
int arrayD[] = new int[5];
arrayD = Arrays.copyOf(arrayA, 15);
System.out.print("arrayD = ");
System.out.print("{"+arrayB[0]);
for(int i =1;i<arrayD.length;i++) {
System.out.print(","+arrayD[i]);
}
System.out.println("}");
int arrayE[] = new int[5];
arrayE = Arrays.copyOfRange(arrayA, 5,15);
System.out.print("arrayE = ");
System.out.print("{"+arrayE[0]);
for(int i =1;i<arrayE.length;i++) {
System.out.print(","+arrayE[i]);
}
System.out.println("}");
}
}
4.填充数据
填充数据,就是给数据赋值。比如在教室里摆好了桌椅,这个数组就定义好了,但是由于教室里没有学生,所以数组!就是空的。当学生在教室里坐好准备上课了,这样数组就被赋值了
package capther6;
import java.util.Arrays;
public class ArrayFillExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arrayex1 = new int[10];
int[] arrayex2 = new int[10];
Arrays.fill(arrayex1, 15);//填充所有的值为15
Arrays.fill(arrayex2, 2,6,50);//填充2-6所有的值为50.其余的值为0
System.out.print("arrayex1[] = ");
System.out.print("{"+arrayex1[0]);
for(int i =1;i<arrayex1.length;i++) {
System.out.print(","+arrayex1[i]);
}
System.out.println("}");
System.out.print("arrayex2[] = ");
System.out.print("{"+arrayex2[0]);
for(int i =1;i<arrayex2.length;i++) {
System.out.print(","+arrayex2[i]);
}
System.out.println("}");
}
}
5 比较
比较就是判断两个数组中的元素是否相等。如果两个数组中所有对应元素都相等,并且两个数组包含相同数量的元素,则认为这两个数组是相等的
package capther6;
import java.util.Arrays;
public class ArrayEqualExample {
public static void main(String[] args) {
int[] arrayA = new int[10];
int[] arrayB = new int[10];
int[] arrayC = new int[10];
Arrays.fill(arrayA, 35);
Arrays.fill(arrayB, 0,10,35);
Arrays.fill(arrayC, 5,10,35);
System.out.print("arrayA[] = ");
System.out.print("{"+arrayA[0]);
for(int i =1;i<arrayA.length;i++) {
System.out.print(","+arrayA[i]);
}
System.out.println("}");
System.out.print("arrayB[] = ");
System.out.print("{"+arrayB[0]);
for(int i =1;i<arrayA.length;i++) {
System.out.print(","+arrayB[i]);
}
System.out.println("}");
System.out.print("arrayC[] = ");
System.out.print("{"+arrayC[0]);
for(int i =1;i<arrayC.length;i++) {
System.out.print(","+arrayC[i]);
}
System.out.println("}");
System.out.println("arrayA==arrayB?"+Arrays.equals(arrayA, arrayB));
System.out.println("arrayA==arrayC?"+Arrays.equals(arrayA, arrayC));
}
}
4.拓展训练
1.获取一维数组中的最大最小值
package capther6;
public class ArrayMinMax {
public static void main(String[] args) {
int A[] = {27,86,132,22,34,12};
int minvalue = A[0];
int maxvalue = A[0];
System.out.print("数组A的元素包括");
for(int i = 0;i<A.length;i++) {
System.out.print(A[i]+" ");
if(A[i]<minvalue) {
minvalue = A[i];
}
if(A[i]>maxvalue) {
maxvalue = A[i];
}
}
System.out.println("\n数组的最大值为"+maxvalue);
System.out.println("数组的最小值为"+minvalue);
}
}
2.杨辉三角
最本质的特征是:两条斜边都是由数字1组成的,而其他数字等于它两个肩上的数字之和
package capther6;
public class YanghuiClass {
//编写一个main方法
public static void main(String[] args) {
int[][] yangHui = new int[12][];
for(int i = 0; i < yangHui.length; i++) {//遍历yangHui的每个元素
//给每个一维数组(行) 开空间
yangHui[i] = new int[i+1];
//给每个一维数组(行) 赋值
for(int j = 0; j < yangHui[i].length; j++){
//每一行的第一个元素和最后一个元素都是1
if(j == 0 || j == yangHui[i].length - 1) {
yangHui[i][j] = 1;
} else {//中间的元素
yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];
}
}
}
//输出杨辉三角
for(int i = 0; i < yangHui.length; i++) {
for(int j = 0; j < yangHui[i].length; j++) {//遍历输出该行
System.out.print(yangHui[i][j] + "\t");
}
System.out.println();//换行.
}
}
}
5 技术解惑
1.Array和Arrays的区别是什么
Arrays是工具类,提供常用的静态方法,而Array是数组。举个例子,Array就好比种植出来的水果,而Arrays是对水果进行包装处理。可以制作成水果干,也可以制作成水果罐头。
2. for 和foreach的区别
这俩都是java中常用的遍历方法。
在固定长度或者不需要计算的时候for循环效率高于foreach,在不确定长度或计算长度有损耗的时候使用foreach比较方便。