《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。
订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Java/大数据/Python/低代码/云原生 等全套视频课程,同时共同探讨问题、携手共进~
- 一、Java 数组详解
- 1.1 声明数组
- 1.2 初始化数组
- 1.3 访问数组
- 1.4 遍历数组
- 1.5 复制数组
- 1.6 排序数组
- 二、Java 方法详解
- 2.1 定义方法
- 2.2 调用方法
- 三、小案例
- 3.1 找出数组的最大值/最小值
- 3.2 创建一个方法,用于生成十个随机数的数组
一、Java 数组详解
数组是一种数据类型(引用型),它是相同数据元素的集合,也就是说每一个数组中的元素的数据类型必须是相同的。在这里我们对数组的 声明
、初始化
、访问
、遍历
、复制
和 排序
相关操作进行介绍。
1.1 声明数组
声明数组即定义数组变量,数组必须先经过声明后才能在程序中被使用,声明方式如下:
//声明整型数组a,包含10个元素,每个元素都是int类型,默认值为0int[] a = new int[10];//声明浮点型数组b,包含20个元素,每个元素都是double类型,默认值为0.0double[] b = new double[20];//声明布尔型数组c,包含30个元素,每个元素都是boolean类型,默认值为falseboolean[] c = new boolean[30];
1.2 初始化数组
数组的初始化其实就是为数组赋值。赋值方式有三种情况。
① 正常声明数组后会默认使用 默认值
为该数组赋值,如 int 型数组 a 如果不进行初始化的话默认赋值为 [0,0,0];
int[] a = new int[3]; //[0,0,0]
② 当数据元素比较少的时候,我们可以直接在声明数组的同时为其赋值,在大括号中输入值并用逗号隔开。但注意这种方式必须是声明的同时赋值,不可分开;
int[] a = {1,2,3}; //[1,2,3]
③ 声明并赋值还有另一种写法是这样的,保留 new 关键字。与 ② 的区别是此写法可以将声明与赋值分开。
int[] b; //声明b = new int[]{1,2,3}; //赋值[1,2,3]
1.3 访问数组
访问数组即如何去使用数组中的元素。当数组被声明和初始化之后,数组名.length
可获取数组长度,数组名[下标]
可获取数组中的某一个元素,下标从 0 开始,“数组名[0]”代表该数组的第一个元素,“数组名[2]”代表该数组的第三个元素。
int[] a = new int[3]; //[0,0,0]System.out.println(a[0]); //输出数组a第一个元素的值a[1] = 100; //赋值数组a的第二个元素为100a[2] = 200; //赋值数组a的第三个元素为300//a[3] = 300; //运行时会发生数组下标越界异常,System.out.println(a[a.length-1]); //输出数组a最后一个元素的值
1.4 遍历数组
遍历也叫迭代,就是将数组中的所有元素从头到尾挨个走一遍。遍历需要使用到 for 循环。
int[] arr = new int[10];for(int i=0;i<arr.length;i++){ //遍历arr数组 arr[i] = 100; //赋值数组的每一个元素为100 System.out.println(arr[i]); //输出数组每一个元素的值}
1.5 复制数组
复制数组的第一种方式是使用 arraycopy
关键字,格式为:
System.arraycopy(源数组,源数组的起始下标,目标数组,目标数组起始下标,要复制的元素个数);
如下,将数组 a(第二个元素开始后面的四个元素)复制到数组 b(第一个元素起始)。
public static void main(String[] args) { int[] a = {1,2,3,4,5}; int[] b = new int[6]; //[0,0,0,0,0,0] //a 源数组 //1 源数组的起始下标 //b 目标数组 //0 目标数组起始下标 //4 要复制的元素个数 System.arraycopy(a,1,b,0,4); for(int i=0;i<b.length;i++){ System.out.println(b[i]); //[2,3,4,5,0,0] }}
复制数组的第二种方式是使用类 Arrays
,格式为:
Arrays.copyOf(源数组,目标数组的长度);
在使用 Arrays 之前需要先引入;
如下将数组 a 复制到数组 b。注意一下如果目标数组的长度大于原数组,那么多出来元素将会以默认值赋值;如果目标数组的长度小于原数组,那么多余复制的元素将会被截掉。
public static void main(String[] args) { int[] a = {1,2,3,4,5}; //a 源数组 //6 目标数组的长度 int[] b = Arrays.copyOf(a,6); for(int i=0;i< b.length;i++){ System.out.println(b[i]); //[1,2,3,4,5,0] 第六个元素为多出来的元素,所以默认为0 }}
1.6 排序数组
排序可以说是数组中最为常用的算法。使用 Arrays.sort(数组);
可对数组进行升序排列。如下是对一个包含 10 个随机数的数组升序排列。
public static void main(String[] args) { int[] arr = new int[10]; for(int i=0;i< arr.length;i++){ arr[i] = (int)(Math.random()*100); System.out.println(arr[i]); } Arrays.sort(arr); //对数组升序排列 System.out.println("升序后的数组为:"); for(int i=0;i< arr.length;i++){ System.out.println(arr[i]); }}
二、Java 方法详解
方法也称函数,用于封装一段特定的业务逻辑功能,减少代码的重复,有利于代码维护。通常在设计方法的过程中应尽量独立,也就是说尽量让它 只做一件事情
即可。
方法最明显的特征就是带 ()
,我们经常使用的 println()、Math.random()、arraycopy()、sort() 等等都是 Java 已经为我们封装好的方法。
2.1 定义方法
方法的定义一共需要包含包含五个要素:
要素 | 含义 |
---|---|
修饰词 | public static |
返回值类型 | 方法可以有返回值,也可以无返回值(依业务需求而定) ● 无返回值设计为 void ● 有返回值时设计为特定的数据类型即可 |
方法名 | 方法名的命名规则应见名知义,且使用驼峰命名法 |
参数列表 | 参数列表位于方法名后的括号中,格式为:方法名(参数列表) 方法可以无参,也可以有参,但有参可以使方法更加灵活 参数的书写方法和定义变量是一样的,如 int a,String b |
方法体 | 即业务逻辑的实现,{ } 中的代码 |
方法的标准格式如下:
//标准格式修饰词 返回值类型 方法名(参数列表){ 方法体}//最常见的标准方法就是主方法mainpublic static void main(String[] args) { ......}
在方法的定义过程中,要注意每个方法之间都是 并列关系
,主方法 main 是一个方法,我们自己定义的方法也是一个方法,所以自定义方法一定不能放到主方法 main{ } 里面。而当调用自定义方法的时候就需要在 main{ } 中调用了,因为“计算机只认主方法”。
//主方法mainpublic static void main(String[] args) { say(); //自定义方法在此调用}//自定义方法saypublic static void say(){ System.out.println("大家好,我是敬 之!");}
2.2 调用方法
方法可以被反复多次调用。针对有返回值和无返回值以及有无参数,调用方式稍有区别:
无参无返回值时,直接 方法名();
调用;
//主方法mainpublic static void main(String[] args) { say(); //调用say}//自定义方法say(无参无返回值)public static void say(){ System.out.println("大家好,我是敬 之!");}
有参无返回值时,调用时必须传参,方法名(参数值);
补充:
- 定义方法时的参数为形参
- 调用方法时传入的参数为实参
//主方法mainpublic static void main(String[] args) { Hello("敬 之"); //调用Hello,有参必须传参且参数类型必须匹配}//自定义方法hello(有参无返回值)public static void Hello(String name){ //加入一个String类型的参数name System.out.println("大家好,我是"+name+"!");}
有参无返回值,且多个参数时,方法名(参数值1,参数值2);
//主方法mainpublic static void main(String[] args) { Hello("敬 之",23); //调用Hello,有参必须传参且参数类型必须匹配,传两个参}//自定义方法hello(有参无返回值)public static void Hello(String name,int age){ //加入一个String类型的参数name和一个int类型的参数age System.out.println("大家好,我是"+name+",今年"+age+"岁!");}
当无参有返回值的时候,方法中必须通过关键字 return
来返回一个数据,而且 return 返回的数据类型必须与返回值类型匹配。调用这种方法时需要声明一个对应类型的变量用于接收此方法。
//主方法mainpublic static void main(String[] args) { double a = getNum(); //声明一个double型变量来接收 System.out.println(a); //3.1415}//自定义方法getNum(有返回值,返回值数据类型为double)public static double getNum(){ return 3.1415; //return返回一个double型数据。此语句的含义为结束此方法的同时返回3.1415给调用方}
有参有返回值时调用如下;
//主方法mainpublic static void main(String[] args) { int add = plus(4,5); //声明一个int型变量来接收 System.out.println(add); //9}//自定义方法plus(有参有返回值)public static int plus(int a,int b){ //加入两个int型数据a和b int num = a+b; return num;}
三、小案例
3.1 找出数组的最大值/最小值
首先声明一个包含 10 个元素的数组,将它们赋值为 0~99 的随机数。我们假设第一个元素为最大值 max,接下来遍历除第一个元素之外的剩余元素,让剩余元素一个一个的与当前设定的最大值 max 进行比较,如果大于 max,则将这个较大的值赋给 max,以此类推,知道将剩余元素全部比较完,最后输出的 max 就是整个数组的最大值。
public static void main(String[] args) { int[] arr = new int[10]; //声明数组arr for(int i=0;i<arr.length;i++){ //遍历数组arr arr[i] = (int)(Math.random()*100); //为每个元素赋值0-99的随机数 System.out.println(arr[i]); //输出每个元素的值 } int max = arr[0]; //假设第一个元素为最大值 for(int i=1;i<arr.length;i++){ //遍历除第一个元素之外的剩余元素 if(arr[i]>max){ //若剩余元素大于当前的max max = arr[i]; //则修改max为那个较大的值 } } System.out.println("该数组中的最大值为"+max);}
程序运行效果如下:
找最小值同理,相反操作即可。
3.2 创建一个方法,用于生成十个随机数的数组
//主方法mainpublic static void main(String[] args) { int[] arr1 = testArray(); //定义同类型的新数组arr1用于接收testArray方法传回来的数组 System.out.println(arr1.length); //输出数组的长度 System.out.println(arr1[2]); //输出数组的第三个元素}//自定义方法testArray(无参有返回值)public static int[] testArray(){ //返回值类型为int数组 int[] arr = new int[10]; for(int i=0;i<arr.length;i++){ arr[i] = (int)(Math.random()*100); } return arr;}
程序运行效果如下: