java学习之数组(二)
在上一节中我们讲到了数组的概念,定义,以及在内存当中的表现形式。那么这里我们来说一下,数组的另一种定义方式。
在上一篇当中我们规定是这个样子定义数组的,
class ArrDemo { public static void main(String[] args) { int[] arr = new int[8]; } }
这个方式定义数组,有一个缺陷,什么缺陷呢,当你有整组数组元素,这里我们姑且称之为 3,4,598,88。比如说你现在有这个么一组数,如果你按照上面方法定义数组的话,你要做的事情就多了,你得一个个把这些个元素复制到数组当中去,想想这是多么痛苦,尽管你可以用循环来简化这个操作,但是当只有2、3个值的时候你还得写个循环来赋值么???java有这么傻么??当然没有。
数组定义方法之二:
数组元素类型[] 数组变量名 = 数组元素类型 [] {数组元素一,数组元素二,数组元素三,.....}。代码:
class ArrDemo { public static void main(String[] args) { int[] arr = new int[]{1,3,5,6,6,9,999};//需要注意一下,这个地方的第二个方括号,并没有明确数据的个数或者长度。这个也是java避免我们犯错的一个机制 } }
这里需要注意的一点就是跟第一种定义方式不同,这里的第二个方括号呢,并没有定义数组元素的个数或者数组的长度。但是这样定义和第一种定义就差不多了,我们还嫌他太过麻烦,怎么办?Java兄弟这个写法能再简化一下否???Java兄弟这么说,好吧我们再来简化一下,(*^__^*) 嘻嘻:
数组元素类型[] 数组变量名 = {数组元素一,数组元素二,数组元素三,.....},代码:
class ArrDemo { public static void main(String[] args) { int[] arr = {1,3,5,6,6,9,999};//这样子定义是不是显得清爽了很多呢? :) } }
当我们这个样子定义数组的时候,会不会感觉很爽?但是他本身也有个缺点,当数组元素较多的时候你一眼看不出数组中的元素到底是多少,也不知道数组的长度。还好的是java是完全面向对象的语言,这个数组也不例外。他是一个对象,他有一个属性值为length来标注。数组的长度,这后边在讲。
以上两种定义的方法的区别在于:前者能看到数组的长度或者元素的个数,但是看不到具体的直接赋值。后者的优点在于能够直接清晰的赋值,但是不能一眼看出数组的长度,各有优劣。
数组的遍历。
我们之值所以定义实体即对象或者数组的原因是因为他们能够存放封装数据。这些实体的主要的一个作用就在于:存、取。你可以存数据,同时你也可以取数据。
代码:
class ArrDemo { public static void main(String[] args) { int[] arr = {1,3,5,6,6,9,999};//需要注意一下,这个地方的第二个方括号,并没有明确数据的个数或者长度。 /** *需求:取出数组中的所有元素,并且分别打印 *思路,以为要重复的取数据,这里采用循环的方式,循环有while和for循环两种,我们采用的是for循环,之所以采用 *for循环是因为他能在内部定义一个局部变量,这样子比较干净利索,执行完之后,不会有没用的变量驻留在内存当中 *因为我们使用for循环的话,必须明确这个数组的长度。由于java是完全面向对象的,一切皆为对象。这里数组也是对象 *他自身有一个属性值length.来取出数组的长度。这里数组的长度就是arr.length * */ //方法一:正序遍历 System.out.println("正序遍历:"); for(int i = 0; i<arr.length ; i++ )//这里之所以把i的初始值设置为0,是因为数组的索引都是从0开始的 { System.out.println(arr[i]); } //方法二:倒序遍历 System.out.println("倒序遍历"); for(int i = arr.length-1; i>=0 ; i--){ System.out.println(arr[i]); } } }
这里需要注意的一点是:for循环当中i的初始值,和末尾值的设定。
正序的时候是从0开始的,在arr.length-1处结束
倒序的时候是从arr.length-1处取到,在0处结束,这一点一定要明确。
数组的最值:
我们平常对数组经常的一个操作就是求最值,这个数组当中的最小值,或者最大值。
class ArrDemo { public static void main(String[] args) { int[] arr = {1,3,888,5,6,6,9,999}; int[] arr2 = {-2,-88,-356,-135,-8445}; int m = getMax(arr); int _m = _getMax(arr2); System.out.println(m); System.out.println(arr2[_m]); } /** *直接循环遍历值求最大值,缺点,当要循环遍历的值是负数的时候,其中max的初始化是个缺陷。 *思路: * 1、在函数当中定义一个基值,并且初始化为0, * 2、然后循环遍历数组,把数组当中的每个元素跟这个基值做比较,如果结果比这个基值大,那么就把此时的数组元素赋值给这个基值 * 3、相反如果基值比数组中的元素大,那么就保持不变,当循环遍历之后,返回最大值 * * * */ static int getMax(int[] arr) { int max = 0; for(int i = 0 ; i< arr.length ; i++) { max = (max >= arr[i])?max:arr[i]; } return max; } /* *利用数组的索引求最值,这种方法对正数还有负数都是通用的。 *思路: * 跟上边的思路是一样的,只不过这时候为了正负数比较通用期间,我们把原来直接值的比较,换为数组中各个索引值的比较 * */ static int _getMax(int[] arr) { int max = 0; for(int i = 0 ; i < arr.length ; i++) { max = (arr[max]>=arr[i])?max:i; } return max; } }