一、声明数组和初始化(掌握)
数据类型[] 数组名 ;
数据类型 数组名[] ;
静态初始化
数据类型[] 数组名 = {元素1,元素2,元素3};
动态初始化
数据类型[] 数组名 = new 数据类型[5];
数组名[0] = 元素1;
二、数组的内存结构(掌握)
package com.hl.array;public class ArrrayDemo1 {public static void main(String[] args) {//局部变量//基本数据类型int i = 1;//引用数据类型int[] array = new int[5];System.out.println(i);//栈区的值System.out.println(array);//堆区的内存地址}
}
package com.hl.array;public class ArrrayDemo1 {public static void main(String[] args) {//局部变量//基本数据类型int i = 1;//引用数据类型int[] array = new int[5];System.out.println(i);//栈区的值System.out.println(array);//堆区的内存地址int[] array2 = array;array2[0] = 1;System.out.println(array2[0]);//1System.out.println(array[0]);//0 1}
}
三、使用数据
1、数据的复制 (深拷贝和浅拷贝)
int[] array1 = new int[5];
int[] array2 = array1; //内存地址的copy 浅拷贝深拷贝拷贝的是数组的值
package com.hl.array;import java.util.Arrays;public class ArrayDemo2 {public static void main(String[] args) {int[] array1 = new int[10];int[] array2 = new int[array1.length];for (int i = 0; i < array2.length; i++) {array2[i] = array1[i];}array1[0] = 1;array2[0] = 2;System.out.println(Arrays.toString(array1));System.out.println(Arrays.toString(array2));}
}
2、数组的插入和删除
数组插入,删除:效率低,牵涉到扩容和数据元素移动。
数据:查询|修改效率高 ,内存空间连续,有索引下标,可以快速定位。
3、算法(了解)
排序:冒泡、选择排序
查找:二分查找
没有二分查找时,是遍历所有元素 数组长度100,最快1次,最慢100次,平均50次
前提条件是 数组是有序的。
int[] array = {1,2,3,4,5,6,7}
123 4 567
mid = 4
num 10 num>mid [5,6,7]
min = mid+1 max=length-1
mid = 6
min=max=mid mid==10
四、二维数组
二维数组本质上就是一个一维数组,每一个元素又是一个一维数组。
int[] array = {1,2,3,4};
int[][] array = {{1,2,3,4},{5,6,7,8}
};//索引坐标 从二维数组中获取数据int[] arr2 = array[0];
sout(arr2[0] + arr2[1])sout(arr[0][0])
二维数组的定义和初始化
静态初始化:
int[][] array = {{1,2,3,4},{5,6,7,8}
};动态初始化:
int[][] array = new int[2][4];
//2行 4列
0 0 0 0
0 0 0 0
array[0][0] ... [0][3]
array[1][0] ... [1][3]
二维数组的遍历
package com.hl.array2;public class Demo1 {public static void main(String[] args) {int[][] array = {{1,2,3},{4,5,6},{7,8,9,10}};//遍历查询//求二维数组长度System.out.println(array.length);for(int i=0;i<array.length;i++){//一维数组int[] array2 = array[i]; // {1,2,3}//遍历每一个一维数组for (int j = 0; j < array2.length; j++) {System.out.print(array2[j]+" ");}System.out.println();//换行符}}
}
package com.hl.array2;public class Demo2 {public static void main(String[] args) {int[][] a = {{1,2,3},{4,5,6},{7,8,9,10}};//作为二维数组,通过平面图形,利用坐标遍历for (int i = 0; i < a.length; i++) {//外层循环行for (int j = 0; j < a[i].length; j++) {//内层循环列System.out.print(a[i][j] +" ");}System.out.println();}}
}
内存空间分配
使用二维数据
需求:生成10注双色球
//生成10注双色球
int[][] tickets = new int[10][7];
for (int i = 0; i < tickets.length; i++) {for (int j = 0; j < tickets[i].length; j++) {if(j < 6){//前6次,生成红色球tickets[i][j] = random.nextInt(33)+1;}else{//生成一次蓝色球tickets[i][j] = random.nextInt(16)+1;}}
}
//得到的二维数据
System.out.println(tickets);
改造需求:要求前6个球不能重复
//生成10注双色球
int[][] tickets = new int[20][7];
for (int i = 0; i < tickets.length; i++) {for (int j = 0; j < tickets[i].length; j++) {if(j < 6){//前6次,生成红色球tickets[i][j] = random.nextInt(33)+1;//解决数字重复问题for (int k = 0; k < j; k++) {if(tickets[i][j] == tickets[i][k]){j--;break;}}}else{//生成一次蓝色球tickets[i][j] = random.nextInt(16)+1;}}
}
//得到的二维数据
System.out.println(Arrays.deepToString(tickets));
五、方法
1、了解方法的作用
什么是方法?
方法是具有特定功能的代码块。
简单的理解就是:把一段完整的代码,看成一个整体,并给这段代码起个名字,以后在用的时候,使用这个名字就相当于执行了这一段代码。
方法必须先创建才可以使用,创建只需要进行一次创建,使用可以多次。方法的创建过程称为方法的定义。
2、声明方法(定义方法)
方法的定义
方法隶属于类,因此方法要定义在类中,且方法不能定义在别的方法内。---类后面会详细讲。
方法定义的格式
public static 返回值类型 方法名(参数列表){方法体
}public static void 方法名(){ //无参方法}public static 返回值(基本数据|引用类型) 方法名(){ //无参方法return 10;
}
public、static在讲类和对象的时候会详细讲,此处先固定这么写。
方法名的命名规范和变量名的命名规范相同。
返回值、参数列表 下面专门讲解。
方法的分类
方法按有没有参数,有没有返回值可以分为以下4类:
无参数无返回值方法
无参数有返回值方法
有参数无返回值方法
有参数有返回值方法
3、调用方法
package com.hl.methodDemo1;public class MethodDemo2 {//main方法 入口方法public static void main(String[] args) {//调用方法//调用无参方法 方法名()printHello();printHello();//调用有参方法 方法名(值,值) 实参sum(1,2);int num = sum2(10,12);System.out.println(num);}//创建一个方法,在方法内打印helloworldpublic static void printHello(){System.out.println("hello world!");}//创建一个方法,在方法内打印两个数字的和(传入两个参数)//sum(int i,int j) 形参(一个变量,一个占位符)public static void sum(int i,int j){System.out.println(i+j);}//创建一个方法,返回两个数字的和(返回 --->要求有返回值)public static int sum2(int i,int j){return i+j;}
}
4、方法的值传递
基本类型的值传递(传递的是数值)
package com.hl.methodDemo1;public class MethodDemo3 {public static void main(String[] args) {//调用方法int i = 1;m1(i);System.out.println("main...."+i);}//声明方法public static void m1(int i){i++;System.out.println("m1...."+i);}
}
package com.hl.methodDemo1;public class MethodDemo3 {public static void main(String[] args) {//调用方法int i = 1;
// m1(i);
// System.out.println("main...."+i);int j = m2(i);System.out.println(i);System.out.println(j);}//声明方法public static void m1(int i){i++;System.out.println("m1...."+i);}public static int m2(int i){i++;return i;}
}
引用类型的值传递(堆区内存地址)
package com.hl.methodDemo1;public class MethodDemo4 {public static void main(String[] args) {//调用方法int[] array = {6,5,4,3,2,1};m1(array);System.out.println(array[0]);//6 1System.out.println(array[1]);//5 2System.out.println(array[2]);//4 4}//定义方法public static void m1(int[] array){array[0] = 1;array[1] = 2;System.out.println(array[0]);//1System.out.println(array[1]);//2System.out.println(array[2]);//4}
}
package com.hl.methodDemo1;public class MethodDemo5 {public static void main(String[] args) {int i = 1;int[] array = new int[10];i = m1(i,array);System.out.println(i);//8、 1 3 4System.out.println(array[0]);//9、 2}public static int m1(int i ,int[] array){i++;array[0] = i++;return ++i;}// public static void m1(int i ,int[] array){
// i++;
// array[0] = i++;
// System.out.println(array[0]);//15、2
// System.out.println(i);//16、3
// }}
5、方法的重载
同一个类中,方法名称相同,参数列表不同,称为方法重载。
package com.hl.methodDemo1;import java.util.Random;/*
Overload 和 Override 的区别?
方法重载 和 方法重写 的区别?同一个类中,方法名称相同,参数列表不同,称为方法重载。(跟返回值无关)参数列表不同:参数个数不同,类型不同 或者 类型顺序不同max(int i,int j);max(int j,int i);max(int i,double j); //重载max(double i;int j) //重载*/
public class MethodOverload {public static void main(String[] args) {Math.max(1,3);Math.max(1.0,3.0);Random r = new Random();r.nextInt();r.nextInt(100);}//方法名---变量名 见名知意public static void add() {System.out.println("........");}public static int add(int a, int b){return a+b;}public static double add(double a, double b){return a+b;}public static double add(double a, int b){return a+b;}public static double add(int a, double b){return a+b;}}
6、不定参数方法
package com.hl.methodDemo1;
/*
不定参数注意事项:int...变量名 不定参数(0到多个变量),底层是数组一个方法中最多只能有一个不定参数,并且不定参数必须是最后一个参数*/
public class MethodDemo6 {public static void main(String[] args) {
// int sum = sum();
// System.out.println(sum);int[] array = {1,2,3};//调用者int sum = sum2(null);System.out.println(sum);}//自定义一个方法,求多个int变量的和//int...变量名 不定参数(0到多个变量),底层是数组public static int sum(int...num){int sum = 0;for (int i = 0; i < num.length; i++) {sum += num[i];}return sum;}
// public static int sum(int[] array){
// return 0;
// }//定义方法public static int sum2(int[] num){int sum = 0;if(num != null){ //避免空指针异常for (int i = 0; i < num.length; i++) {//num 为null,出现空指针异常sum += num[i];}}return sum;}//自定义方法public static void sum3(double d1,double d2,int...args){}}
7、方法练习
1. 需求:设计一个方法,自定义数据范围(最小值和最大值),根据键盘录入获取用户输入的数据。
要求用户必须输入num1~num2之间的数,如果不是,让用户重新输入,直到用户输入的内容合法。
package com.hl.homework;import java.util.Scanner;public class WorkDemo1 {//1. 需求:设计一个方法,获取用户输入的数据。// 要求用户必须输入0~9之间的数,如果不是,让用户重新输入,直到用户输入的内容合法。public static int input(){Scanner scanner = new Scanner(System.in);int num = -1;do{System.out.println("请录入0-9的数字:");num = scanner.nextInt();if(num >= 0 && num <= 9){break;}else{System.out.println("录入错误,请重新录入");}}while(true);return num;}//2. 需求:设计一个方法,自定义数据范围,获取用户输入的数据。// 要求用户必须输入num1~num2之间的数,如果不是,让用户重新输入,直到用户输入的内容合法。public static int input(int num1,int num2){Scanner scanner = new Scanner(System.in);int num = -1;do{System.out.println("请录入"+num1+"-"+num2+"的数字:");num = scanner.nextInt();if(num >= num1 && num <= num2){break;}else{System.out.println("录入错误,请重新录入");}}while(true);return num;}public static void main(String[] args) {
// int num = input();
// System.out.println("接收到:"+num);int num = input(5,10);System.out.println("接收到:"+num);}
}
关于return关键字:
package com.hl.homework;public class WorkDemo2 {public static void main(String[] args) {//调用方法double money = getMoney();System.out.println(money);}//方法定义//返回值的方法,必须使用return关键字返回结果给调用者public static double getMoney(){int i = 1;
// if(i > 1){
// return 1000;
// }else{
// return 10000;
// }// while(true){
//// break;
// return 100000;
// }boolean flag = true;while(flag){return 1;//返回到方法调用位置//System.out.println("----不可达---");}System.out.println("-----while 外------");return 10000;}
}
需求2:定义一个方法,接收一个二维数组,求二维数组中元素的最大值和最大值的索引下标。
package com.hl.homework;public class WorkDemo3 {
// 需求2:定义一个方法,接收一个二维数组,求二维数组中元素的最大值。public static int getMax(int[][] array){int max = array[0][0];int x = 0;int y = 0;for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {
// System.out.print(array[i][j] + " ");if(array[i][j] >= max){max = array[i][j];x = i;y = j;}}}System.out.println("最大值索引下标"+x+"--"+y);return max;}//定义一个方法, 编写代码, 求二维数组中,第2行的平均值。public static double getAvg(int[][] array){int sum = 0;for (int i = 0; i < array[1].length; i++) {sum += array[1][i];}return sum*1.0/array[1].length;}public static void main(String[] args) {int[][] array = {{1,22,3},{4,55,6},{7,8,9}};
// int max = getMax(array);
// System.out.println("最大值是:"+max);double avg = getAvg(array);System.out.println("第二行的平均值为:"+avg);}
}