好贷网好贷款

JAVA第六弹(深入数组)

发布时间:2016-12-4 18:20:47 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"JAVA第六弹(深入数组)",主要涉及到JAVA第六弹(深入数组)方面的内容,对于JAVA第六弹(深入数组)感兴趣的同学可以参考一下。

----------------------android培训、java培训、期待与您交流! ----------------------                                                                  JAVA第六弹(深入数组)                            ——————(个人见解,有错误的地方欢迎批评指正)—————                                                                   (如有雷同纯属巧合) 在JAVA中,只要看到有new,那么就一定是建立对象,那么数组也肯定是个对象,一个数组通过new建立后,每个索引值都会有默认值,以下归纳了各个类型的数组建立后的默认值:             数据类型               初始值 bye 0 short 0 int 0 long 0L float 0.0f double 0.0d char \u0000 boolean flase 类 null 我们可以在数组初始化时候通过java.util包中的Arrays类中的fill()方法自行设定初始值 public class ArraysDemo { public static void main(String[] args) { int[] arrays = new int[5]; for(int i = 0;i<arrays.length;i++) { System.out.println(arrays[i]); } Arrays.fill(arrays, 2); for(int array:arrays) { System.out.println(array); } } } 上述程序输出结果:00000 22222 假如想要在创建数组时候就初始化值可以这样写: int[] arrays = new int[]{1,3,10,25,2}; 数组既然是对象,那么不同数组是否可以同时参考一个对象呢? public class ArraysDemo1 { public static void main(String[] args) { int[] arrays1 = new int[]{10,20,30,40,50}; int[] arrays2 = arrays1; arrays2[0] = 60; System.out.println(arrays1 == arrays2); System.out.println(arrays1[0]); } } 上述程序输出结果是:true , 60 因为数组是对象,arrays1和arrays2参考的同一个实例。arrays2的arrays2[0]元素改变后,arrays1的arrays1[0]元素自然就跟着改变了。 同样的,假如想复制一数组,通过参考同一实例是不能完成这个动作的,因为只要参考的实例改变,那么所有参考同一实例的数组都将改变,正确的复制,只能是新建一个数组: public class ArraysDemo2 { public class ArraysDemo2 { public static void main(String[] args) { int[] arrays1 = new int[]{10,20,30,40,50}; int[] arrays2 = new int[arrays1.length]; for(int i = 0;i<arrays1.length;i++) { arrays2[i] = arrays1[i]; } } JAVA API中提供了一个方法,可以方便的复制数组,这个方法是System.arraycopy()。 import java.util.Arrays; public class ArraysDemo3 { public static void main(String[] args) { int[] arrays1 = new int[]{10,20,30,40,50}; int[] arrays2 = new int[arrays1.length]; System.arraycopy(arrays1, 0, arrays2, 0, arrays1.length); for(int arrays :arrays2) { System.out.println(arrays); } } } 上述程序输出结果是:10,20,30,40,50 System.arraycopy(arrays1, 0, arrays2, 0, arrays1.length);这段代码中arraycopy()的五个参数分别是:来源数组,来源数组的起始索引,目标数组,目标数组的起始索引,复制长度。 JAVA API提供另外一个复制数组的方法Arrays.copyOf(),此方法不需要自己new对象,方法自己会创建对象。 import java.util.Arrays; public class ArrayDemo4 { public static void main(String[] args) { int[] arrays1 = new int[]{10,20,30,40,50}; int[] arrays2 = Arrays.copyOf(arrays1, arrays1.length); for(int arrays : arrays2) { System.out.println(arrays); } } } 至于类类型的数组复制就不同了,如下例: class Person{ String name; int age; Person(String name,int age) { this.name = name; this.age = age; } } public class ArrayDemo5 { public static void main(String[] args) { Person[] person1 =    {new Person("zhangsan",18),new Person("lishi",20)}; Person[] person2 = new Person[person1.length]; for(int i = 0;i<person1.length;i++) { person2[i]=person1[i]; } person1[0].name = "wangwu"; System.out.println(person2[0].name); } } 程序输出为:wangwu 这是为什么呢?这是因为,在循环中,每次把person2[i]参考的对象都给person1[i]参考,所以person1[i]参考的对象和person2[i]是同一个。当person1[0].name改变时候,person2[0].name同样跟着改变了,这称之为浅层复制。无论System.arraycopy()还是Arrays.copyOf(),用在类类型声明的数组是,都是执行的浅层复制,要想跟着对象一起复制,只能自己操作,因为基本上只有自己才知道每个对象复制时,有哪些属性要复制。下例就实现了深层复制。 public class ArrayDemo6 { public static void main(String[] args) { Person[] person1 =    {new Person("zhangsan",18),new Person("lishi",20)}; Person[] person2 = new Person[person1.length]; for(int i = 0;i<person1.length;i++) { person2[i]=new Person(person1[i].name,person1[i].age); } person1[0].name = "wangwu"; System.out.println(person2[0].name); } } 程序输出为:zhangsan 。 二维数组: 如果想用new建立二维数组,格式如下: int[][] arrays = new int[2][3]; 这表示建立了个2*3的数组,里面有2个int[]类型的索引,每个索引参考的是长度为3的一维数组的对象,初始值都为0,如下图: 如果用arrays.length取得的是什么长度呢?答案就是:取得arrays参考的对象有2个索引,而arrays[0].length取得的是什么长度呢?答案就是arrays参考的对象索引为0的长度为3。同样arrays[1].length是表示arrays参考的对象索引为0的长度为3。如何取得二维数组的元素?如下:   public class ArrayDemo7 { public static void main(String[] args) { int[][] arrays = {{1,2,3},{4,5,6},{7,8,9}}; for(int i =0;i<arrays.length;i++) { for(int j =0;j<arrays[i].length;j++) { System.out.println("arrays["+i+"]["+j+"]="+arrays[i][j]); } } } } 程序输出结果为: arrays[0][0]=1 arrays[0][1]=2 arrays[0][2]=3 arrays[1][0]=4 arrays[1][1]=5 arrays[1][2]=6 arrays[2][0]=7 arrays[2][1]=8 arrays[2][2]=9 用增强for循环: for(int[] array1:arrays) { for(int array2:array1) { System.out.println(array2); } } 那么建立个类类型的二维数组: Integer[][] integer = new Integer[3][2]; 问:此二维数组建立了几个对象? 要是回答6个,那就错了,其实它一个对象都没有建立,看下图: 二维数组不一定都要矩阵,例如: int[][] arrays = {{0,1},{2,3,4},{5,6,7,8}}; 这样也是合法的,这称之为不规则数组。 另外,还可以这么写: int[][] arrays = new int[2][]; 这表示new int[2][]仅提供第一个[]数值,arrays参考的对象会有2个索引,每个索引暂时参考至null。 下例展示了不规则数组的应用: 例:用程序打印出杨辉三角。 import java.util.Scanner; public class Yanghui { public static void main(String[] args) { Scanner in=new Scanner(System.in); System.out.print("请输入行数:"); int num=in.nextInt();//读取键盘录入 //初始化行数 int[][] arry = new int[num][]; //初始化第二维数组的长度 for(int i =0;i<arry.length;i++) { arry[i] = new int[i+1];//因为第一维的下标关系,这里要+1 } int index;//定义下标指针 //给二位数组赋值 for(int i = 0; i<arry.length;i++) { index =0;//给不同维度的数组赋值都要初始化指针 //给arry[i]维度下的元素赋值 for(int j = 0 ;j<arry[i].length;j++) { //假如是第二维数组的头尾,那么就把值赋为1 if((j==0)||(j==arry[i].length-1)) arry[i][j]=1; else { //根据杨辉三角的规律,除了头和尾,每个不同维度的值都是 //上以维度的相邻两个值的和 arry[i][j]=arry[i-1][index]+arry[i-1][index+1]; index++; } } } //打印杨辉三角 for(int i = 0; i<arry.length; i++) { //打印横向开始时的空格数 for(int j = arry.length-i-1;j>0;j--) System.out.print("\t"); //打印每一行的元素(在每一行的元素没打印完前,不换行) for(int k =0;k<=arry[i].length-1;k++) { System.out.print(arry[i][k]); System.out.print("\t\t"); } //打印完一行,换行 System.out.println(); }    } } 程序输出结果:     ----------------------android培训、java培训、期待与您交流! ----------------------  

上一篇:大学软件工程总结
下一篇:POJ2823_Slidingwindow_solution

相关文章

相关评论