存数据:为每个元素赋值
取数据:
语法:数组名[数组下标]= 值;
案例:
publicclassDemo{publicstaticvoidmain(String[] args){//声明一个数组int[] a ;//为数组开辟空间
a =newint[4];//存数据
a[0]=2;
a[1]=4;
a[2]=6;
a[3]=8;//访问数据System.out.println(a[0]);System.out.println(a[1]);System.out.println(a[2]);System.out.println(a[3]);//获取数组的长度System.out.println("数组的长度:"+a.length);}}
数组的默认值
当定义一个数组没有为数组赋值数组的每一个元素都有一个默认值 默认值的类型和数组的类型是相关的
简单数据类型
byte--------------0short-------------0int-------------0long--------------0float------------0.0double------------0.0char-------------空字符 '\u0000'boolean----------false
引用数据类型(对象类型)------null
案例:publicclassDemo{publicstaticvoidmain(String[] args){//定义一个数组String[] a =newString[5];System.out.println(a[0]);System.out.println(a[1]);System.out.println(a[2]);System.out.println(a[3]);System.out.println(a[4]);}}
数组的遍历
遍历:访问数组中的每个元素并打印
案例:
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};//7System.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};//7System.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(原数组,扩容之后的长度) 此函数可以返回一个新的扩容之后的数组数组长度由函数的第二个参数决定
代码:
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){int[] a ={2,4,6,3,7,5,23};//7System.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]+" ");}}}
练习:随机点名系统
importjava.util.*;publicclassDemo{publicstaticvoidmain(String[] args){String[] s ={"",""};//系统随机产生一个下标int index =(int)(Math.random()*s.length);System.out.println(s[index]);}}
案例:随机赋值
importjava.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
代码:
importjava.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]+",");}}}
数组用在函数的参数和返回值上
案例:写一个函数 实现数组的扩容
代码:
importjava.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;}}
案例:定义一个函数 函数的功能是 计算多个数的和 数不定
代码:
importjava.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 返回值类型 函数名(数据类型... 变量名){
}
注意:可变长参数函数中的形参列表只能有一个可变长参数,如果有其他的形参,那么可变长参数必须放在参数列表的最后
案例:
importjava.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;}}
案例:传数组也可以
importjava.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;}}
案例:这样是不行的
importjava.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----13468
套路:算法
冒泡排序
规则:相邻的两个元素进行比较 如果前者大于后者 则两者交换位置
案例: 3,1,4,2------->1234******
双重for循环
代码:
importjava.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]+" ");}}}
选择排序
规则:在数组中选择一个数 和其他的数进行比较 如果这个数大于其他的数 那么两者交换位置
代码:
importjava.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]+" ");}}}
数组的声明:
语法:
数据类型[][] 数组名;
为数组分配空间
语法:
数组名 =new 数据类型[高维数组长度][低维数组长度]
案例:
publicclassDemo{publicstaticvoidmain(String[] args){int[][] a =newint[4][3];/*int[] b = new int[4];
b[0] = new int[3];
b[1] = new int[3];
b[2] = new int[3];
b[3] = new int[3];*/
a[0][0]=1;
a[0][1]=2;
a[1][2]=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();}}}
二维数组的遍历
方法:先遍历高维 再遍历低维
代码:
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)先声明 后分配空间
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();}}}