建立网站接受投注是什么意思,网站页面设计报价模板,查看网站是否被k,建设银行企业网银缴费一、数组的定义与使用 #x1f601;1.1数组的概念#x1f4cc;数组#xff1a;可以看成是相同类型元素的一个集合。在内存中是一段连续的空间#xff0c;可以同来存储同种数据类型的多个值。但是数组容器在存储数据的时候#xff0c;需要结合隐式转换考虑。比如#xff1…一、数组的定义与使用 1.1数组的概念数组可以看成是相同类型元素的一个集合。在内存中是一段连续的空间可以同来存储同种数据类型的多个值。但是数组容器在存储数据的时候需要结合隐式转换考虑。比如 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的 但是byte类型short类型int类型的数据是可以存到这个数组里面的。1.2数组的创建和初始化T[] 数组名 new T[N];T表示数组中存放元素的类型T[]表示数组的类型N表示数组的长度int[] array1 new int[10]; // 创建一个可以容纳10个int类型元素的数组
double[] array2 new double[5]; // 创建一个可以容纳5个double类型元素的数组
String[] array3 new double[3]; // 创建一个可以容纳3个字符串元素的数组注意括号跟数组名谁写在前面谁写在后面都是一样的。平时习惯性使用第一种方式。1.3数组的初始化数组的初始化主要分为动态初始化以及静态初始化。1.3.1静态初始化在创建数组时不直接指定数据元素个数而直接将具体的数据内容进行指定完整格式数据类型[] 数组名 new 数据类型[]{元素1元素2元素3元素4...};
int[] arr new int[]{11,22,33};
double[] arr new double[]{1.1,1.2,1.3};注意等号前后的数据类型必须保持一致。数组一旦创建之后长度不能发生变化。2.简化格式数据类型[] 数组名 {元素1元素2元素3元素4...};
int[] array {1,2,3,4,5};
double[] array {1.1,1.2,1.3};1.3.2动态初始化格式数据类型[] 数组名 new 数据类型[数组的长度];//1.定义一个数组存3个人的年龄年龄未知
int[] agesArr new int[3];
//2.定义一个数组存班级10名学生的考试成绩考试成绩暂时未知考完才知道。
int[] scoresArr new int[10];2.数组的默认初始化值整数类型0小数类型0.0布尔类型false字符类型\u0000引用类型null1.3.3静态动态初始化区别【注意事项】静态初始化虽然没有指定数组的长度编译器在编译时会根据{}中元素个数来确定数组的长度静态初始化时, {}中数据类型必须与[]前数据类型一致静态初始化可以简写省去后面的new T[]。注意虽然省去了new T[], 但是编译器编译代码时还是会还原int[] array1 {0,1,2,3,4,5,6,7,8,9};
double[] array2 {1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 {hell, Java, !!!};静态和动态初始化也可以分为两步但是省略格式不可以int[] array1;
array1 new int[10];
int[] array2;
array2 new int[]{10, 20, 30};
// 注意省略格式不可以拆分, 否则编译失败
// int[] array3;
// array3 {1, 2, 3};如果没有对数组进行初始化数组中元素有其默认值如果数组中存储元素类型为基类类型默认值为基类类型对应的默认值比如如果数组中存储元素类型为引用类型默认值为null【使用场景】只明确元素个数但是不明确具体的数据推荐使用动态初始化。已经明确了要操作的所有数据推荐使用静态初始化。1.4数组的使用1.4.1数组元素的访问数组在内存中是一段连续的空间空间的编号都是从0开始的依次递增该编号称为数组的下标数组可以通过下标访问其任意位置的元素。1.4.1.1格式和作用格式数组名[索引];作用获取数组中对应索引上的值修改数组中对应索引上的值一旦修改之后原来的值就会被覆盖了。int[]array new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通过[]对数组中的元素进行修改
array[0] 100;
System.out.println(array[0]);1.4.1.2索引概念也叫角标、下标。就是数组容器中每一个小格子对应的编号。特点索引一定是从0开始的。连续不间断。逐个1增长。1.4.1.3注意事项数组是一段连续的内存空间因此支持随机访问即通过下标访问快速访问数组中任意位置的元素2. 下标从0开始介于[0, N之间不包含NN为元素个数不能越界否则会报出下标越界异常。int[] array {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素下标一次为0 1 2array[3]下标越界
// 执行结果
Exception in thread main java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)抛出了 java.lang.ArrayIndexOutOfBoundsException 异常. 使用数组一定要下标谨防越界.1.4.2遍历数组所谓 遍历 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作比如打印int[]array new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);上述代码可以起到对数组中元素遍历的目的但问题是1. 如果数组中增加了一个元素就需要增加一条打印语句2. 如果输入中有100个元素就需要写100个打印语句3. 如果现在要把打印修改为给数组中每个元素加1修改起来非常麻烦。通过观察代码可以发现对数组中每个元素的操作都是相同的则可以使用循环来进行打印。int[]array new int[]{10, 20, 30, 40, 50};for(int i 0; i 5; i){System.out.println(array[i]);
}改成循环之后上述三个缺陷可以全部2和3问题可以全部解决但是无法解决问题1。那能否获取到数组的长度呢注意在数组中可以通过 数组对象.length 来获取数组的长度int[]array new int[]{10, 20, 30, 40, 50};
for(int i 0; i array.length; i){System.out.println(array[i]);
}也可以使用 for-each 遍历数组int[] array {1, 2, 3};
for (int x : array) {System.out.println(x);
}for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错。二、数组是引用数组类型2.1初始JVM的内存分布内存是一段连续的存储空间主要用来存储程序运行时数据的。比如1. 程序运行时代码需要加载到内存2. 程序运行产生的中间数据要存放在内存3. 程序中的常量也要保存4. 有些数据可能需要长时间存储而有些数据当方法运行结束后就要被销毁程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址虚拟机栈(JVM Stack): 与方法调用相关的一些信息每个方法在执行时都会先创建一个栈帧栈帧中包含有局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息保存的都是与方法执行时相关的一些信息。比如局部变量。当方法运行结束后栈帧就被销毁了即栈帧中保存的数据也被销毁了。本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,3} )堆是随着程序开始运行时而创建随着程序的退出而销毁堆中的数据只要还有在使用就不会被销毁。方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域2.2基本类型变量与引用类型变量的区别基本数据类型创建的变量称为基本变量该变量空间中直接存放的是其所对应的值而引用数据类型创建的变量一般称为对象的引用其空间中存储的是对象所在空间的地址。public static void func() {int a 10;int b 20;int[] arr new int[]{1,2,3};
}在上述代码中a、b、arr都是函数内部的变量因此其空间都在main方法对应的栈帧中分配。a、b是内置类型的变量因此其空间中保存的就是给该变量初始化的值。array是数组类型的引用变量其内部保存的内容可以简单理解成是数组在堆空间中的首地址。引用变量并不直接存储对象本身可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址引用变量便可以去操作对象。有点类似C语言中的指针但是Java中引用要比指针的操作更简单2.3再谈引用变量public static void func() {int[] array1 new int[3];array1[0] 10;array1[1] 20;array1[2] 30;int[] array2 new int[]{1,2,3,4,5};array2[0] 100;array2[1] 200;array1 array2;array1[2] 300;array1[3] 400;array2[4] 500;for (int i 0; i array2.length; i) {System.out.println(array2[i]);}
}2.4认识 nullnull 在 Java 中表示 空引用 , 也就是一个不指向对象的引用。int[] arr null;
//
System.out.println(arr[0]);
// 执行结果
Exception in thread main java.lang.NullPointerException
at Test.main(Test.java:6)null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException。注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联int[] array {123,4,5}
int[] array2arr;
array2[0]99;注意array2这个引用指向了array这个引用所指向的对象2.5地址值int[] arr {1,2,3,4,5};
System.out.println(arr);//[I6d03e736double[] arr2 {1.1,2.2,3.3};
System.out.println(arr2);//[D568db2f2打印数组的时候实际出现的是数组的地址值。数组的地址值就表示数组在内存中的位置。以[I6d03e736为例[ 表示现在打印的是一个数组。I表示现在打印的数组是int类型的。仅仅是一个间隔符号而已。6d03e736就是数组在内存中真正的地址值。十六进制的提问传引用一定可以改变实参的值吗public static void main(String[] args) {int[] array{1,2,3,4,5};System.out.println(前 Arrays.toString(array));func1(array);System.out.println(后Arrays.toString(array));//前[1, 2, 3, 4, 5]//后[1, 2, 3, 4, 5]}public static void func1(int[] array) {//此时形参指向了一个新的对象array new int[]{9,8,7,6};}结论传引用不一定可以改变形参的值。三、数组的应用场景3.1保存数据public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i array.length; i){System.out.println(array[i] );}
}3.2 作为函数的参数参数传数组类型(引用数据类型)public static void main(String[] args) {int[] arr {1, 2, 3};func(arr);System.out.println(arr[0] arr[0]);
}
public static void func(int[] a) {a[0] 10;System.out.println(a[0] a[0]);
}
// 执行结果
a[0] 10
arr[0] 10发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变.因为数组是引用类型按照引用类型来进行传递是可以修改其中存放的内容的。总结: 所谓的 引用 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 拷贝开销就会很大).3.3作为函数的返回值public class TestArray {public static int[] fib(int n){if(n 0){return null;} int[] array new int[n];array[0] array[1] 1;for(int i 2; i n; i){array[i] array[i-1] array[i-2];} return array;}public static void main(String[] args) {int[] array fib(10);for (int i 0; i array.length; i) {System.out.println(array[i]);}}四、数组练习4.1数组转字符串import java.util.Arraysint[] arr {1,2,3,4,5,6};
String newArr Arrays.toString(arr);
System.out.println(newArr);
// 执行结果
[1, 2, 3, 4, 5, 6]Java 中提供了 java.util.Arrays 包, 其中包含了一些操作数组的常用方法.4.2数组拷贝4.2.1数组拷贝代码示例public static void func(){
// newArr和arr引用的是同一个数组
// 因此newArr修改空间中内容之后arr也可以看到修改的结果int[] arr {1,2,3,4,5,6};int[] newArr arr;newArr[0] 10;System.out.println(newArr: Arrays.toString(arr));
// 使用Arrays中copyOf方法完成数组的拷贝
// copyOf方法在进行数组拷贝时创建了一个新的数组
// arr和newArr引用的不是同一个数组arr[0] 1;newArr Arrays.copyOf(arr, arr.length);System.out.println(newArr: Arrays.toString(newArr));
// 因为arr修改其引用数组中内容时对newArr没有任何影响arr[0] 10;System.out.println(arr: Arrays.toString(arr));System.out.println(newArr: Arrays.toString(newArr));
// 拷贝某个范围.int[] newArr2 Arrays.copyOfRange(arr, 2, 4);System.out.println(newArr2: Arrays.toString(newArr2));}注意数组当中存储的是基本类型数据时不论怎么拷贝基本都不会出现什么问题但如果存储的是引用数据类型拷贝时需要考虑深浅拷贝的问题//自定义实现copyOf
public static int[] copyOf(int[] arr) {int[] ret new int[arr.length];for (int i 0; i arr.length; i) {ret[i] arr[i];} return ret;
}4.2.2Arrays.copyOf源码注意事项拷贝的同时会产生新对象4.3查找数组中指定元素(顺序查找)public static void main(String[] args) {int[] arr {1,2,3,10,5,6};System.out.println(find(arr, 10));}public static int find(int[] arr, int data) {for (int i 0; i arr.length; i) {if (arr[i] data) {return i;}} return -1; // 表示没有找到}
// 执行结果
34.4数组排序(冒泡排序)给定一个数组, 让数组升序 (降序) 排序算法思路假设排升序1. 将数组中相邻元素从前往后依次进行比较如果前一个元素比后一个元素大则交换一趟下来后最大元素就在数组的末尾2. 依次从上上述过程直到数组中所有的元素都排列好public static void main(String[] args) {int[] arr {9, 5, 2, 7};bubbleSort(arr);System.out.println(Arrays.toString(arr));
}
public static void bubbleSort(int[] arr) {for (int i 0; i arr.length; i) {for (int j 1; j arr.length-i; j) {if (arr[j-1] arr[j]) {int tmp arr[j - 1];arr[j - 1] arr[j];arr[j] tmp;}}} // end for
} // end bubbleSort
// 执行结果
[2, 5, 7, 9]冒泡排序性能较低. Java 中内置了更高效的排序算法public static void main(String[] args) {int[] arr {9, 5, 2, 7};Arrays.sort(arr);System.out.println(Arrays.toString(arr));
}4.5数组逆序给定一个数组, 将里面的元素逆序排列.思路设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.然后让前一个下标自增, 后一个下标自减, 循环继续即可public static void main(String[] args) {int[] arr {1, 2, 3, 4};reverse(arr);System.out.println(Arrays.toString(arr));}public static void reverse(int[] arr) {int left 0;int right arr.length - 1;while (left right) {int tmp arr[left];arr[left] arr[right];arr[right] tmp;left;right--;}}五、二维数组5.1基本语法二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。Java中二维数组中存放的是各个一维数组的地址也就是说通过array.length输出结果为一维数组的个数而array[i]输出的是一维数组的地址。下图表示二维数组二维数组中不可以省略行可以省略列。int【】【】arraynew int【行数】【省略】此时array.length行数array【i】.length会报错因为不知道每一列有多少个元素。5.1.1基本格式数据类型[][] 数组名称 new 数据类型 [行数][列数] { 初始化数据 };int[][] arr {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}
};
for (int row 0; row arr.length; row) {for (int col 0; col arr[row].length; col) {System.out.printf(%d\t, arr[row][col]);} System.out.println();
}
// 执行结果
1 2 3 4
5 6 7 8
9 10 11 125.1.2二维数组的遍历5.1.2.1for循环实现public static void main(String[] args) {int[][] array{{1,2,3},{4,5,6},{7,8,9}};for (int i 0; i array.length; i) {for (int j 0; j array[i].length; j) {System.out.print(array[i][j] );}System.out.println();}}
/*
1 2 3
4 5 6
7 8 9
*/5.1.2.2for-each循环实现for-each:将冒号后面的数据依次存放到冒号前面的数据中。第一个for-each( 类型为数组 二维数组名)将二维数组中存放的一维数组地址存放到一维数组中。第二个for-each(数组元素的类型变量名 : 一维数组)将一维数组中的每个int型数据存放到一个int型变量中。public static void main(String[] args) {int[][] array{{1,2,3},{4,5,6},{7,8,9}};for (int[] tmp:array) {for (int i:tmp) {System.out.print(i );}System.out.println();}}
/*
1 2 3
4 5 6
7 8 9
*/5.1.2.3调用Arrays方法public static void main(String[] args) {int[][] array{{1,2,3},{4,5,6},{7,8,9}};String array2Arrays.deepToString(array);//深度访问数组System.out.println(array2);}
/*
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
*/5.2二维数组内存2.不规则的一维数组二维数组中行长度array.length二维数组中列长度array[0].length public static void main(String[] args) {int[][] array1 new int[2][];//Java当中 不可以省略行 但是可以省略开列array1[0] new int[3];array1[1] new int[5];System.out.println(array1.length);//行的长度System.out.println(array1[1].length);//每一列的长度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();}}
//----------------------------------------------------------------------------
public static void main(String[] args) {//不规则二维数组int[][] arraynew int[2][];array[0]new int[3];array[1]new int[5];System.out.println(二维数组的行数含有一维数组的个数array.length);System.out.println(第一行元素个数array[0].length);System.out.println(第二行元素个数array[1].length);}六、Arrays方法6.1toString()返回指定内容的字符串表示形式【返回值为字符串】-----用于输出数组 int[] array{1,3,5,7,9,2,4,6,8,10};System.out.println(Arrays.toString(array));//[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]6.2deepToString返回指定数组“深层内容”的字符串表示形式-----用于输出二维数组int[][] array{{1,2,3},{4,5,6},{7,8,9}};String array2Arrays.deepToString(array);//深度访问数组System.out.println(array2);//[[1, 2, 3], [4, 5, 6], [7, 8, 9]]6.3copyOf(拷贝的数组,新的长度)复制指定的数组以使副本具有指定的长度----用于拷贝原始数组或实现数组的扩容会产生新的对象copyOfRange(拷贝的数组数组下标起始位置数组下标最终位置)int[] array{1,3,5,7,9,2,4,6,8,10};System.out.println(Arrays.toString(array));//[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]//数组拷贝int[] array2Arrays.copyOf(array,array.length);System.out.println(Arrays.toString(array2));//[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]//数组扩容int[] array3Arrays.copyOf(array,array.length*2);System.out.println(Arrays.toString(array3));//[1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]int[] array4Arrays.copyOfRange(array,2,4);//Java中一般出现起始和最终位置通常按照左闭右开的元素---[2,4)System.out.println(Arrays.toString(array4));//5,76.4fill(数组某数)将指定的值分配给指定型数组指定范围中的每个元素-----初始化数组int[] arrnew int[10];Arrays.fill(arr,2);System.out.println(Arrays.toString(arr));//[2, 2, 2, 2, 2, 2, 2, 2, 2, 2]Arrays.fill(arr,1,3,5);System.out.println(Arrays.toString(arr));//[2, 5, 5, 2, 2, 2, 2, 2, 2, 2]6.5sort(数组)对数组元素进行升序排列----排序int[] arr{1,3,5,7,9,2,4,6,8,10};Arrays.sort(arr);System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]6.6binarySearch(数组需要查找的值)二分查找----查找某个具体数int[] arr{1,2,3,4,5,6,7,8,9,10};System.out.println(下标为Arrays.binarySearch(arr,5));//下标为46.7equals(数组1数组2)比较两个数组内容是否相同 int[] arr{1,2,3,4,5};int[] arr2{1,2,3,4,5};System.out.println(Arrays.equals(arr,arr2));