木 头 课 堂
小 木 正 文
——————————————
??数组变量的声明
——————————————
数组相当于一堆数放到一起。
String[]players={“王菲”,”张飞”,”刘亦菲”};String[]cards={“黑桃Q”,”黑桃K”,”黑桃A”};
如图所示,在变量的命名上就体现了”一堆”的意义。
数组的声明有两种方式,如下所示:
int[] ary: 声明了数组变量ary,数组变量是代词。intary[];:为了与C语法兼容的写法,不建议写法。
定义数组方式如下代码:
package com.wood.programming;public class ArrayTest { public static void main(String[] args) { //声明和初始化一个数组int[]arr=newint[4];//第1种写法intarr1 []=newint[4];//第2种写法(不推荐)}}
数组对象初始化public class ArrayDemo { public static void main(String[] args) { //声明一个数组变量 int[] arr; //创建一个数组对象,有4个int元素 arr = new int[4]; // java数组必须给定大小,元素是自动初始化的,数组下标0~3 System.out.println(ar[2]);System.out.println(arr[3]); //直接使用元素创建数组,arr引用了一个新的数组 arr= new int[]{1,2,3}; System.out.println(arr);}}注:
1、数组变量引用了具体数组对象,就是代词。
2、数组元素是自动初始化的,自动初始化为”零”值。
3、”零”值包括: 0(整型)、0.0(浮 点型)、\u000(char)、false(boolean)、nul(引用类型)。
在今后的的学习中会经常出现如下异常,请大家先熟悉一下,如下所示:
public class TestArray {publicstaticvoidmain(String[]args){ //声明一个数组变量int[]arr=newint[4];System.out.println(arr[0]);//结果为0System.out.println(arr[5]);//数组访问越界,会出异常}}
运行结果如下:
0Exception in thread “main”java.Iang.ArrayIndexOutOfBoundsException: 5 at basic.array. TestArray.main(TestArray.java:6)
Java中的初始化分为两种方式:动态初始化和静态初始化,如下所示:
packagecom.wood.programming;public class ArrayTest { public static void main(String[] args) { //声明和初始化一个数组int[]arr=newint[4];//动态初始化 int arr1[] = new int[4]; //动态初始化intarr2[]=newint[]{1,2,3};//动态初始化 int arr3[]={1,2,3};//静态初始化}}
注:静态初始化只能用在声明数组变量时候同时初始化。
——————————————
??数组变量、数组对象、数组元素
——————————————
请理解并熟悉这些名词:
public class Test { //声明和初始化一个数组int[]arr=newint[]{1,2,3};//arr:数组变量 //{1, 2, 3}:数组对象 //1,2,3:数组元素}
——————————————
??数组元素的访问
——————————————
数组对象的大小是固定的,长度是n,下标范围是0~n-1。
我们通常使用下标]访问数组元素,越界访问(小于0/大于等于n),都会发生运行异常。
Java中使用.length属性可以获取数组对象长度如下图所示:
重新强化两个概念:编译错误和运行时异常,如下图所示:
编译错误
运行时异常
——————————————
??数组对象的复制
——————————————
我们先理解数组赋值概念,如下所示:
/***数组的复制与动态扩展算法*/public class ArrayCopyDemo {publicstaticvoidmain(String[]args){int[]arr=newint[]{1,2,3,4}; //数组的赋值int[]arr2=rr;//-个数组对象,两个引用同时引用 }}
继续案例,如下图所示:
注:这种现象叫数组赋值,可以发现如果这样赋值,数组对象没有隔离性,不小心就修改了。
所以我们使用数组对象的复制实现数组的隔离性,如下所示:
/***数组的复制与动态扩展算法*/publicclassArrayCopyDemo_01{ public static void main(String[] args) { int[] arr = new int[]{1,2,3, 4}; //数组的复制:两个不同的数组对象int[]arr3=newint[arr.length];//空数组 for (int i= 0; i< arr.length; i ) {arr3[i]=arr[i];//将每个元素复制一遍} // arr3是arr的复制结果,不通的数组对象,arr和arr3是隔离的 arr3[1] = 9999;System.out.println(arr[1]);//2,没有改变}}注:新数组ary3是数组ary1的副本,ary3是新数组。ary1和ary3分别指向不同对象,内存示意图如下所示:
那么如何输出数组中全部元素?我们使用“数组的迭代”方法,迭代(Iterate)的意思就是”重复”。
如下所示:
public class Test {publicstaticvoidmain(String[]args){ // 声明和初始化一个数组 int[] arr = new int[]{1,2,3,4}; //迭代输出每个元素 for (int i= 0; i< arr.length; i ) { System.out.println(arr[i]);}}}
Java提供了更简单的输出数组的方法,如下所示:
importjava.util.Arrays;public class Test2 { public static void main(String[] args) { //声明和初始化一个数组int[]arr=newint[]{1,2,3,4};System.out.println(Arrays.toString(arr);}}
注:使用Java提供的方法需要import。
下面我们介绍数组拷贝(复制)效率更高的2种方法:
System.arraycopy(src , srcPos, dest,destPos , length)
这个方法是Java API提供的,底层是用C 写的,所以速度非常快,比for()循环实现数组拷贝效率要高很多,所以推荐使用。
Arrays.copyOf(src,length):是JDK1.6版本提供的方法,比起System. arraycopy(使用更简便,但需要注意的是你的开发环境JDK版本必须是1.6及以上。
copyOf()方法的底层就是arraycopy(方法.下面我们首先演示System.arraycopy()方法,如下所示:
/***Java提供的数组复制方法*/package com.wood.programming;import java.util.Arrays;public class Test3{ public static void main(String []args){ int[] src={1,2,3,4}; int[] dest = new int[4]; // [0,0,0,0] System.arraycopy(src, 0, dest, 0, src.length); System.out.println(Arrays.toString(dest)); }}
Arrays.copyOf(src, length)方法演示代码如下:
/***Java提供的数组复制方法*/package com.wood.programming;import java.util.Arrays;public class HelloWorld{ public static void main(String []args){ int[]src={1,2,3,4}; int[] dest = Arrays.copyOf(src, src.length); System.out.println(Arrays.toString(dest)); }}
注:实现数组复制更加简洁和方便(推荐)。
——————————————
??数组的扩展问题
——————————————
我们先明确一点,Java数组对象的大小是固定的,数组对象是不能扩展的,我们利用数组复制的方法可以变通的实现数组扩展。
创建数组副本的同时将数组长度增加就变通的实现了,数组的扩展。
1、System.arraycopy() 可以复制数组。
2、Arrays.copyOf() 可以简便的创建数组副本。
我们演示一个例子实现了数组扩展功能,如下所示,
package com.wood.programming;import java.util.Arrays;public class Test5{ public static void main(String []args){ char[] cArr={‘北’,’京’}; char [] temp = Arrays.copyOf(cArr, 4); char [] cArr2 = temp; // {‘北’,[Fields]’京’,0, 0}后两位自动补零 cArr2[2]= ‘人’; cArr2[3]=’民’; System.out.println(cArr2); }}
需要注意:在数组输出时,会有一些不同,让我们看看会有哪些
不同情况发生,如下所示:
/***Java提供的数组复制方法*/package com.wood.programming;import java.util.Arrays;public class HelloWorld{ public static void main(String []args){ char[] cArr={‘北’,’京’}; System.out.println(cArr); System.out.println(Arrays.toString(cArr)); int [] iArr={1,2}; System.out.println(iArr); System.out.println(Arrays.toString(iArr)); String [] sArr={“人”,”民”}; System.out.println(sArr);System.out.println(Arrays.toString(sArr)); }}
输出结果如下所示:
完成如下案例:统计一一个字符在字符串中所有的位置。
比如”统计一个字符在字符串中所有的位置”这个字符串中的”字”出现2次,分别出现在下标4和7的位置。
要求,将下标位置放入到一个int数组中,每找到-一个就放入并对数组扩容。
package com.wood.programming;import java.util.Arrays;public class CharCountDemo{ public static void main(String [] args){ String str=”统计一个字符在字符串中的位置”; int [] arr=countAll(str,’字’); System.out.println(Arrays.toString(arr)); } /** *统计一个字符在字符串中所有位置的方法 * @param str * 被统计的字符串str = “统计一个字符在字符串中的位置” * @param ch * 统计的字符ch =’字’ * @return数组,包含所有的位置 */ private static int [] countAll(String str,char ch){ int [] arry={}; for (int i= 0; i< str.length(); i ) {//i是每个字符的位置 char c = str.charAt(i); // C就是字符串中每个字符 if(c==ch){ //i-> arry;将数组扩展,榆插入到数组中 arry=Arrays.copyOf(arry, arry.length 1); arry[arry.length-1]=i; } } return arry; }}
注:本例中的重要知识点如下所示:
1、复习方法的定义和调用概念。
2、int []ary= {}表示初始化了一个空数组。
3、数组长度使用arr.length表示, 字符串长度使用str.length()表示。
4、ary[ary.length-1]表示数组的最后一个元素。
无 成 本 赞 赏
生活不易,还请小伙伴多多支持
,顺手给小编加个鸡腿,万分感谢~~~
END
— — — — — — — — — — — — —