遍历:访问数组中的每个元素并打印
案例:
publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,5,6,7,8,3,23,56,78,52,34};for(int i =0;i<a.length;i++){
System.out.print(a[i]+"\t");}}}
数组在内存中的分析
int[] a =newint[4];
a的引用指向 数组在堆内存中的实体 (见图示)
元素的地址值 = 首地址+数据类型字节数*下标
案例:
publicclassDemo{publicstaticvoidmain(String[] args){int[] a =newint[3];
a[0]=2;
a[1]=3;
a[2]=5;int[] b =newint[4];
b = a;
System.out.println("b数组的长度:"+b.length);
System.out.println("a数组的长度:"+a.length);for(int i =0;i<b.length;i++){
System.out.print(b[i]+" ");}}}
数组的扩容
思想:
1.定义一个新的数组 容量要比之前的数组大
2.将原数组中的元素 复制到新数组中
3.将原数组的引用指向新数组
注意:如果超出了数组的下标 那么会报异常
java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常
方法:
=========================================================================================
第一种:自己写
代码:
publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={2,4,6,3,7,5,23};//7
System.out.println("扩容之前的长度:"+a.length);//1,定义一个新数组int[] b =newint[a.length*2];//2,将原数组元素复制到新数组中for(int i =0;i<a.length;i++){
b[i]= a[i];}//3 将a的引用指向新数组
a = b;//遍历a数组
System.out.println("扩容之后的长度:"+a.length);for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}=================================================================
第二种:利用 System.arraycopy(原数组名,原数组的起始下标,新数组名,新数组的起始下标,要复制的长度)
代码:
publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={2,4,6,3,7,5,23};//7
System.out.println("扩容之前的长度:"+a.length);//1,定义一个新数组int[] b =newint[a.length*2];//2,将原数组元素复制到新数组中
System.arraycopy(a,0,b,0,a.length);/*for(int i = 0;i<a.length;i++){
b[i] = a[i];
}
*///3 将a的引用指向新数组
a = b;//遍历a数组
System.out.println("扩容之后的长度:"+a.length);for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}==================================================================
第三种:利用Arrays工具类 操作
Arrays是java.util包中的一个工具类
Arrays.copyOf(原数组,扩容之后的长度) 此函数可以返回一个新的扩容之后的数组数组长度由函数的第二个参数决定
代码:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={2,4,6,3,7,5,23};//7
System.out.println("扩容之前的长度:"+a.length);
a = Arrays.copyOf(a,a.length*2);
System.out.println("扩容之后的长度:"+a.length);//遍历for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}
练习:随机点名系统
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){
String[] s ={"刘源","张晨晨","郭树春","刘志伟","古煜","樊黎明","桑邦豪","梁帅","毕鑫蕊","张慧晨","齐美君","王宗南","温晓","詹楠烽","程靖文","陈晨","罗懿","陈天龙","牟宝莉","张梅子","马改红","李海杰","吴立成","郭源","雷洋","李争","贾兴龙","卢迪","陈盟","许梦龙","姚世安","何康","韩光利","王俊广","张士辉","高乔","冀骁帆","马炳阳","武丽鹏","孙米洛","于蓬勃","王天祥","付宵","谈昌森","李雪岩","王瑞","杨福莉","刘雷","代前进","朴海东","闫盛龙","罗欢","白正宇","唐晓青","肖肃羽","卢新龙","李征","姚帅康","陈东煌","耿润锋","杨安明","袁苏培","成华明","张勇","徐甲楠","徐震","侯卓宏","万丹丹","张赟","霍冠霖","毕蒙玮","张琦","缪毅"};//系统随机产生一个下标int index =(int)(Math.random()*s.length);
System.out.println(s[index]);}}
案例:随机赋值
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a =newint[10];//循环赋值for(int i =0;i<a.length;i++){
a[i]=(int)(Math.random()*100);}//遍历for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}
数组用在函数的参数上
案例:写一个函数 函数的功能是遍历数组 形参类型 数组类型 参数几个 1 返回值 void printArray
代码:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,4,56,7,8,8,9,9,3,5,66,77,88};printArray(a);
System.out.println();int[] b =newint[10];printArray(b);}//publicstaticvoidprintArray(int[] a){for(int i =0;i<a.length;i++){
System.out.print(a[i]+",");}}}
数组用在函数的参数和返回值上
案例:写一个函数 实现数组的扩容
代码:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,4,56,7,8,8,9,9,3,5,66,77,88};//调用 扩容
a =myCopyOf(a);printArray(a);}//publicstaticvoidprintArray(int[] a){for(int i =0;i<a.length;i++){
System.out.print(a[i]+",");}}//扩容数组publicstaticint[]myCopyOf(int[] a){//定义一个新数组int[] b =newint[a.length*2];//将原数组的元素复制到新数组for(int i =0;i<a.length;i++){
b[i]= a[i];}return b;}}
案例:定义一个函数 函数的功能是 计算多个数的和 数不定
代码:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,4,5};int sum =add(a);
System.out.println(sum);}//定义一个函数 实现 计算几个数的和publicstaticintadd(int[] a){int sum =0;for(int i =0;i<a.length;i++){
sum+=a[i];}return sum;}}
函数可变长参数
语法: 数据类型... 变量名
就相当于 数据类型[] 变量名;
publicstatic 返回值类型 函数名(数据类型... 变量名){
}
注意:可变长参数函数中的形参列表只能有一个可变长参数,如果有其他的形参,那么可变长参数必须放在参数列表的最后
案例:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){/*int sum1 = add(3,4,5);
int sum2 = add(4,6,9);
int sum3 = add(3,6,8,9,4,3);*/int sum =add(3,4,6);
System.out.println(sum);}//定义一个可变长参数函数publicstaticintadd(int b,int c,int...a){int sum =0;for(int i =0;i<a.length;i++){
sum+=a[i];}return sum;}}
案例:传数组也可以
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={1,2,3};int sum =add(a);
System.out.println(sum);}//定义一个可变长参数函数publicstaticintadd(int...a){int sum =0;for(int i =0;i<a.length;i++){
sum+=a[i];}return sum;}}
案例:这样是不行的
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int sum =add(2,4,5);
System.out.println(sum);}//定义一个可变长参数函数publicstaticintadd(int[] a){int sum =0;for(int i =0;i<a.length;i++){
sum+=a[i];}return sum;}}
数组的排序
1.4. 6.8.3 ---- 1 3 4 6 8
套路:算法
冒泡排序
规则:相邻的两个元素进行比较 如果前者大于后者 则两者交换位置
案例: 3,1,4,2------->1234******
双重for循环
代码:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,5,87,34,67,2,95,36,67,78};//int[] a = {3,1,4,2};//冒泡排序for(int i =1;i<=a.length-1;i++){for(int j =0;j<a.length-i;j++){if(a[j]>a[j+1]){//交换位置int t = a[j];
a[j]= a[j+1];
a[j+1]= t;}}}//遍历for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}
选择排序
规则:在数组中选择一个数 和其他的数进行比较 如果这个数大于其他的数 那么两者交换位置
代码:
import java.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,5,87,34,67,2,95,36,67,78};//int[] a = {3,1,4,2};//冒泡排序/*for(int i = 1;i<=a.length-1;i++){
for(int j = 0;j<a.length-i;j++){
if (a[j]<a[j+1]) {
//交换位置
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}*///选择排序for(int i =0;i<=a.length-2;i++){for(int j = i+1;j<a.length;j++){if(a[i]>a[j]){int t = a[i];
a[i]= a[j];
a[j]= t;}}}//遍历for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}
快速排序
jdk提供的属于java.util中的Arrays工具类的函数
java.util.Arrays.sort(a);
代码:
publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={3,5,87,34,67,2,95,36,67,78};//int[] a = {3,1,4,2};//快速排序
java.util.Arrays.sort(a);//遍历for(int i =0;i<a.length;i++){
System.out.print(a[i]+" ");}}}
第一种:声明 分配空间
1)先声明 后分配空间
int[][] a;
a =newint[4][5]//4行5列2)声明并分配空间
int[][] a =newint[4][5];
第二种:声明 赋值
1)先声明 后赋值
int[][] a ;
a =newint[][]{{2,3,4},{4,5,6},{4,6,8},{3,5,7}}2)先声明并赋值
int[][] a =newint[][]{{2,3,4},{4,5,6},{4,6,8},{3,5,7}}
简写:int[][] a ={{2,3,4},{4,5,6},{4,6,8},{3,5,7}};
注意:简写形式不能分为两行 声明和赋值必须在同一行
案例:
publicclassDemo{publicstaticvoidmain(String[] args){//声明并赋值int[][] a =newint[][]{{1,2,3},{4,5,6},{7,8,9},{10,11,12}};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();}}}
二维数组的内存分析
见图示
不规则的二维数组
数组中每个元素数组的长度是不同的
int[][] a ={{1,2,3,3},{4,5},{7,8,9,8,56},{10,11,12}};
遍历:
publicclassDemo{publicstaticvoidmain(String[] args){//声明并赋值int[][] a ={{1,2,3,3},{4,5},{7,8,9,8,56},{10,11,12}};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();}}}
注意的问题:
1.当定义一个二维数组 可以先为高维数组进行分配空间,再一一为低维数组进行初始化
案例:
publicclassDemo{publicstaticvoidmain(String[] args){//声明并赋值int[][] a;
a =newint[3][];
a[0]=newint[3];
a[1]=newint[4];
a[2]=newint[5];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();}}}2.当定义一个二维数组,必须先为高维分配空间,因为低维数组是依赖于高维数组创建的
案例:
publicclassDemo{publicstaticvoidmain(String[] args){//声明并赋值int[][] a;
a =newint[][4];//错误的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();}}}