1.数组做形参
public class test {
/*
* 1:基本类型作为形参
* 基本类型作为形参,在被调用方法中改变形参的值,不会影响调用方法中实参的值
*
* 2:数组类型作为形参
* 基本类型作为形参,在被调用方法中改变数组元素的值,会影响调用方法中实参的值
*/
public static void show(int a){
a = 20;
System.out.println("show中a是:"+a);
}
public static void show2(int[] arr){
System.out.println(arr);
arr[0] = 100;
System.out.println("show中第一个下标值:"+arr[0]);
}
public static void main(String[] args) {
/*int a = 10;
show(a);
System.out.println("main中的a是:"+a);*/
int[] arr = {10,20,30};
System.out.println(arr);
show2(arr);
System.out.println("main中第一个下标值:"+arr[0]);
} }
运行结果:
[I@15db9742
[I@15db9742
show中第一个下标值:100
main中第一个下标值:100
2 理解main函数
public class test {
/*
* 理解main中形参的由来
*
* 1:main还是JVM自动调用的 当JVM启动之后,JVM会自动开启一个线程,主线程,也就是我们的main线程,由这个去执行这个main方法
*
* 2:给main方法传参 2.1 :通过eclipse的可视化界面传值 2.2:通过cmd命令传值 javac 文件名.java java 类名
* 参数1 参数2 ... 传值
*
* java运行的原理 1:编译 2:运行
*
*/
public static void a() {
// String[] str = {"a","b","c"};
// main(str);
}
public static void main(String[] args) {
for (String s : args) {
System.out.println(s);
}
System.out.println(args.length);
}
}
3.可变的参数(用数组实现)
public class Demo2 {
/*
* 可变参数
*
* 需求1:求2个数的和
* 需求2:求3个数的和
* 需求3:求多个数的和
*
* 问题:如果每一个数字都要求和,需要些太多方法,太繁琐了,怎么解决?
* 可变参数来解决
*
* 可变参数:底层其实就是一个数组,实参传几个值,那么这个可变参数就是有几个元素的数组
* 格式 public static void 方法名(数据类型... 形参名)
*
* 数据类型... 形参名
* 参数的个数可以是:0个,1个,多个
* 注意:参数的类型必须是同一个类型,除过Object类型
* 注意:可变参数是方法形参中最后一个参数,后面不可以出现任何参数
* 但是可变参数的前面可以出现其他多个参数,但是不能出现其他可变参数
*/
//需求1:求2个数的和
/*public static int sum(int a,int b){
return a+b;
}
//需求2:求3个数的和
public static int sum(int a,int b,int c){
return a+b+c;
}
//需求3:求多个数的和
public static int sum(int[] arr){
int sum = 0;
for (int i : arr) {
sum+=i;
}
return sum;
}*/
//可变参数的方法
public static int sum(int... args){
//The variable argument type int of the method
//sum must be the last parameter
int sum = 0;
for (int i : args) {
sum+=i;
}
return sum;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
int d = 40;
/*sum();
sum(a);*/
System.out.println("2个数的和:"+sum(a,b));
System.out.println("3个数的和:"+sum(a,b,c));
System.out.println("4个数的和:"+sum(a,b,c,d));
/*
int[] arr = {a,b,c,d};
int sum = sum(a,b);
System.out.println("2个数的和是:"+sum);
int sum1 = sum(a, b, c);
System.out.println("3个数的和是:"+sum1);
int sum2 = sum(arr);
System.out.println("多个数的和是:"+sum2);*/
}
}
4冒泡排序
public class Demo {
/*
* 需求:数组中存储多个学生分数,按照分数从低到高的顺序排序
*
* 冒泡排序:
* 步骤:1:两两做大于比较,大的往后移,小的往前移,把最大的值找出来,放在倒数第1位
* 这个时候,我们数组划分为2部分,排好序是一部分,未排序的是一部分
* 2:两两做大于比较,大的往后移,小的往前移,把第二大的值找出来,放在倒数第2位
* 这个时候,我们数组划分为2部分,排好序是一部分,未排序的是一部分
* 3:依次类推,直到把所有的数字都按照从小到大的顺序,排列
*
* 冒泡优化
* 1:把中间变量从小循环的里面,拿出来放在最大循环的外面声明,可以减少声明次数:
* 2:每排序出一个元素后,后面的排序,就可以减少一次
* 第1大的数 排序7 次
* 第2大的数 排序6 次
* 第3大的数 排序5次
* 以此类推
* 第8大数 排序0次
* 3:
*
*
*/
public static void main(String[] args) {
int[] s = {100,56,88,99,47,65,12,10} ;//原数组 乱序
int count = 0;
int temp = 0; //中间变量,存放需要交换元素的变量
for(int j=1;j<=7;j++){
for(int i = 0;i<s.length-j;i++){
count++;
if(s[i]>s[i+1]){
//如果第一个元素比第二个元素大,交换位置
temp = s[i];
s[i] = s[i+1];
s[i+1] = temp;
}
}
}
System.out.println(count);
System.out.println(Arrays.toString(s));
/*//两两做比较
if(s[0]>s[1]){
//如果第一个元素比第二个元素大,交换位置
int temp = 0;
temp = s[0];
s[0] = s[1];
s[1] = temp;
}
if(s[1]>s[2]){
//如果第一个元素比第二个元素大,交换位置
int temp = 0;
temp = s[1];
s[1] = s[2];
s[2] = temp;
}
if(s[2]>s[3]){
//如果第一个元素比第二个元素大,交换位置
int temp = 0;
temp = s[2];
s[2] = s[3];
s[3] = temp;
}*/
}}
5.掌握Arrays 常用的方法
import java.util.Arrays;
public class Demo {
/*
* 功能:掌握Arrays类的常用方法
*
*
* Arrays:此类包含用来操作数组(比如排序和搜索)的各种方法。
* 从以下版本开始: 1.2
*
* 常见的5个方法
* 1:binarySearch()二分搜索法
* 2:sort() 数组排序
* 3:fill() 数组填充
* 4:copyOf() 数组拷贝
* int[] newArr = Arrays.copyOf(arr, arr.length);
* 在堆中又开辟了一块新的空间,2个数组
int[] newArr = arr; //数组的地址符赋值 两个变量同时指向一块堆内存空间 1个数组
* 5:toString() 字符串拼接数组
*/
public static void main(String[] args) {
int[] arr = {10,-100,45,88,99,22,14};
//1 调用Arrays提供的sort方法
/* Arrays.sort(arr);
System.out.println("最小值:"+arr[0]);
System.out.println("最大值:"+arr[arr.length-1]);
//打印数组
System.out.println(Arrays.toString(arr));*/
//2 调用toString方法 这个不是遍历数组,这个是把数组中每个元素用字符串拼接起来,打印在控制台
/*System.out.println(arr);
System.out.println(Arrays.toString(arr));*/
//3:数组填充 调用Arrays的fill方法 ,恢复出厂设置
//Arrays.fill(arr, 0);
//System.out.println(Arrays.toString(arr));
//4:数组拷贝 调用Arrays的copyOf方法
//int[] newArr = Arrays.copyOf(arr, arr.length*2);
//int[] newArr = arr; //数组的地址符赋值 两个边路同时指向一块堆内存空间
//System.out.println("新数组:"+Arrays.toString(newArr));
}
}
6二分法
public class Demo2 {
/*
* 二分搜索法(折半查找) 前提是这个数组必须是有序的
* Arrays.binarySearch()
*
* 注意:二份搜索法:根据元素查找下标
* 找到返回当前元素的下标,没有找到返回负数
*/
public static void myBinarySearch(int[] arr,int ele){
//确保数组有序
Arrays.sort(arr);
//int[] arr = {-10,1,10,20,45,56,88};
//定义开始和结尾的2个下标
int start = 0;
int end = arr.length;
int index =-1;
//保证开头下标不能超过结尾下标,否则数组就会越界
int count = 0;
while(start<=end){
count++;
int mid = (start+end)>>>1; //折半点
//如果目标元素和中间元素相等
if(arr[mid]==ele){
//把中间元素的下标赋值给index,代表找到这个元素的下标
index = mid;
//后面就不用比较了
break;
//如果目标元素比中间元素的值大
}else if(ele>arr[mid]){
//去数组的右边来找 并且,start变成mid+1的值,end值不变
start = mid+1;
//如果目标元素比中间元素的值小
}else{
//去数组的右边来找 并且,end变成mid-1的值,start值不变
end = mid-1;
}
}
System.out.println(count);
if(index!=-1){
System.out.println("元素:"+ele+"的下标是:"+index);
}else{
System.out.println("不存在此元素");
}
}
public static void main(String[] args) {
int[] arr = {10,20,45,-10,56,1,88}; //乱序数组
myBinarySearch(arr,56);
Arrays.sort(arr); //排好序的数组
//{-10,1,10,20,45,56,88,100}
int index = Arrays.binarySearch(arr, 500);
System.out.println(index);
}
}
**
7.二维数组
**
public class Demo {
/*
* 二维数组
* 1:定义,初始化
* int[][] arr2 = new int[3][3];
* 第1个3代表这个二维数组是由3个一维数组构成的
* 第2个3代表每个一维数组的元素的个数有3个
*
* 二维数组分类
* 1:规则二维数组:每个一维数组的元素个数相同
* 2:不规则二维数组:每个一维数组的元素个数不相同
* 2:遍历
* 普通for循环
* for---each
* 3:内存分配
* 4:二维数组的转置
* 原二维数组
* a b c d
* 00 01 02 03
* e f g h
* j j k l
*
* 新二维数组
* a e j
* 00
* b f j
* 10
* c g k
* 20
* d h l
* 30
*
*
*
*
* 二维数组的使用场合
* 1:2D游戏地图
* 2:省市联动
*
*/
public static void main(String[] args) {
String[][] pro = {
{"武汉市","黄冈市","黄石市"},
{"西安市","咸阳市","宝鸡市","延安市"}
};
//1:定义,初始化 动态初始化 根据数组的长度,确定数组的元素的个数
/*int[][] arr3 = new int[3][3];
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;
arr[2][0] = 70;
arr[2][1] = 80;
arr[2][2] = 90;*/
//2:静态初始化 根据元素的个数,确定数组的长度
int[][] arr2 = new int[][]{{10,20,30},{40,50,60},{70,80,90}};
//静态初始化 根据元素的个数,确定数组的长度
int[][] arr = {
{10,20,30,100},
{40,50,60,110},
{70,80,90,120}
};
//外层循环的次数是二维数组中一维数组的的个数 普通for循环
for(int j = 0;j<arr.length;j++){
//里层循环的次数是每一个一维数组元素的个数
for(int i = 0;i<arr[j].length;i++){
System.out.println(arr[j][i]);
}
}
//双层 for-each
System.out.println("---------------------");
for (int[] is : arr) {
for (int i : is) {
System.out.println(i);
}
}
//不规则二维数组 先确定一维数组的个数 ,动态初始化
String[][] str = new String[3][];
//分别给每个一维数组,赋予长度
str[0] = new String[3];
str[1] = new String[4];
str[2] = new String[5];
//静态初始化
String[][] str2 = new String[][]{{"a"},{"b","c"},{"d","e","f"}};
String[][] str3 = {
{"a"},
{"b","c"},
{"d","e","f"}
};
}
}