明天又是新的一天。
目录:
1.数组的概念
2.初始化
3.分类
4.属性
5.与容器的区别
6.数组的复制
7.排序
************************1.概念*************************
数组是相同类型的、用同一个标识符名称封装在一起的对象序列或基本类型数据序列。简言之:数组就是一个简单的线性序列。
数组通过方括号下标操作符[]来定义和使用。
************************2.初始化************************
1 public static void main(String[] args) { 2 /*定义数组的方式:在类型后面跟一个[],推荐这样定义,可以直接理解为int类型的数组*/ 3 int[] arr; 4 String[] ars; 5 //另一种数组定义方式 6 int arr1[]; 7 String ars1[]; 8 }
分析一下内存分配:第三行int[]arr,在栈中为int数组的引用开辟内存空间,此时引用中没有存储任何地址。
1 /*声明并初始化int类型数组arr的两种形式:1.由一对花括号括起来的组值组成2.使用new关键字*/ 2 public static void main(String[] args) { 3 //使用一对花括号括起来的组值初始化数组 4 int[] arr = {1,2,3,4,5}; 5 // int[] arr = new int[]{1,2,3,4,5};使用new关键字 6 }
使用以上两种初始化数组的方式实质上是一致的。
内存分配:在栈中为int数组的引用开辟内存空间,此时引用中存储的是指向堆中int类型数组的地址。
使用new关键字创建的数组对象(由编译器)在堆中为该数组对象分配内存空间。
************************3.分类************************
数组分类:按照数组存储数据的类型分为基本类型数组、引用类型数组。
基本类型数组:数组中存储的是基本类型的数据。
引用类型数组:数组中存储的是对象的引用。
************************4.属性************************
length属性。它表示的是数组的大小,也就是数组的最大存储量,并非是数组的个数。
1 public static void main(String[] args) { 2 int[] arr = new int[5];//int[]数组的最大存储量是5 3 arr[0] = 1; 4 arr[1] = 3; 5 System.out.println(arr.length); 6 System.out.println(Arrays.toString(arr)); 7 String[] strs = new String[5];//String[]数组的最大存储量是5 8 strs[0] = new String("A"); 9 strs[1] = new String("B"); 10 System.out.println(strs.length); 11 System.out.println(Arrays.toString(strs)); 12 } 13 /*输出结果 14 5 int[]数组的最大容量 (基本类型数组) 15 [1, 3, 0, 0, 0] 给int[]数组前两个分别赋值,因为数组中的元素有默认值,所以后三个为0 16 5 String[]数组的最大容量 (引用类型数组) 17 [A, B, null, null, null]给String[]数组前两个分别赋值,因为数组中的元素有默认值,所以后三个为null 18 19 */
从上面例子可以看出,length表示的数组的最大容量,而并非是数组存储元素的个数。
我们操作数组,或者说记录数组是从第0个元素开始,所以可以操作数组所能使用的最大索引是length-1
************************5.与容器的区别*************************
1.数组可以存储基本数据类型的数据和对象,集合只能存储对象。
在1.5之后有了泛型可以存储基本类型的包装类了,使用自动装箱操作使集合看起来可以存储基本类型值了。
数组存储的是特定的数据类型,在编译期可以有效地防止类型错误;容器存储的是Object类型的数据,编译期无法察觉类型错误,在运行期可能会发生类型转换错误。
在1.5之后可以使用泛型来进行约束,实现编译期检查。
2.数组长度固定,集合的长度可以根据实际需求实现伸缩,更加灵活。
可以根据实际需求进行分析选择更适合实际业务需求的数组或容器。
3.数组和容器都做了边界检查,过了边界会出现RuntimeException
************************6.数组的复制*************************
有四种方式可以实现数组的复制:循环、clone、System.arrayCopy()、Arrays.copyof();
1 public class ArrayCopyTest1 { 2 public static void main(String[] args) { 3 int[] src = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 4 int len = src.length; 5 int[] des = new int[len]; 6 System.out.println("原数组src:" + Arrays.toString(src)); 7 System.out.println("========1.使用for循环复制数组======"); 8 for (int i = 0; i < len; i++) { 9 des[i] = src[i]; 10 } 11 System.out.println("des:" + Arrays.toString(des)); 12 des[2] = 16;// 改变des数组不会影响原数组 13 System.out.println("改变后的des:" + Arrays.toString(des)); 14 System.out.println("原数组src:" + Arrays.toString(src)); 15 16 System.out.println("========2.使用clone实现数组的复制"); 17 des = (int[])src.clone();//强制类型转换 18 System.out.println("des:" + Arrays.toString(des)); 19 des[3] = 101;// 改变des数组的元素不影响原数组 20 System.out.println("改变后的des:" + Arrays.toString(des)); 21 System.out.println("原数组src:" + Arrays.toString(src)); 22 23 System.out.println("=======3.使用System.arraycopy()方法复制数组======"); 24 //将数组src从下标0开始复制到des数组中从下标为0的位置开始接收,一共复制len个 25 System.arraycopy(src, 0, des, 1, len-1); 26 System.out.println("des:" + Arrays.toString(des)); 27 des[6] = 100;//修改des数组中第六个元素,原数组没有改变 28 System.out.println("修改后的des:" + Arrays.toString(des)); 29 System.out.println("原数组src:" + Arrays.toString(src)); 30 System.out.println("======4.使用数组工具类提供的Arrays.copyof()方法实现数组的复制===="); 31 des = Arrays.copyOf(src, len);// 复制src数组,从下标0开始,复制len个 32 System.out.println("des:" + Arrays.toString(des)); 33 System.out.println("=========================="); 34 for(int i=0; i < len; i++){ 35 des[i] = 0;//将des所有元素置0 36 } 37 System.out.println("将des所有元素置0:" + Arrays.toString(des)); 38 System.out.println("====复制数组引用====="); 39 des = src;//复制数组的引用,此时des和src引用指向同一个对象 40 System.out.println("des:" + Arrays.toString(des)); 41 des[5] = 100;//修改des会改变原数组 42 System.out.println("修改后的des:" + Arrays.toString(des)); 43 System.out.println("src:" + Arrays.toString(src)); 44 } 45 } 46 /*运行结果展示 47 原数组src:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 48 ========1.使用for循环复制数组====== 49 des:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 50 改变后的des:[1, 2, 16, 4, 5, 6, 7, 8, 9, 10] 51 原数组src:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 52 ========2.使用clone实现数组的复制 53 des:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 54 改变后的des:[1, 2, 3, 101, 5, 6, 7, 8, 9, 10] 55 原数组src:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 56 =======3.使用System.arraycopy()方法复制数组====== 57 des:[1, 1, 2, 3, 4, 5, 6, 7, 8, 9] 58 修改后的des:[1, 1, 2, 3, 4, 5, 100, 7, 8, 9] 59 原数组src:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 60 ======4.使用数组工具类提供的Arrays.copyof()方法实现数组的复制==== 61 des:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 62 ========================== 63 将des所有元素置0:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 64 ====数组复制 65 des:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 66 修改后的des:[1, 2, 3, 4, 5, 100, 7, 8, 9, 10] 67 src:[1, 2, 3, 4, 5, 100, 7, 8, 9, 10] 68 69 70 71 */
************************7.数组的排序*************************
数组排序常见的方法:快速排序、冒泡排序、选择排序、插入排序。
快速排序:使用数组的工具类Arrays中的sort方法实现
1 public class ArraySortTest { 2 public static void main(String[] args) { 3 int[] arr = { 102, 66, 38, 76, 231, 190, 22, 13 }; 4 Arrays.sort(arr);//数组排序 5 System.out.println(Arrays.toString(arr)); 6 } 7 } 8 /*运行结果,默认按照升序排列 9 [13, 22, 38, 66, 76, 102, 190, 231] 10 11 */
冒泡排序:遍历数组进行比较,通过不断的比较将最大值或者最小值一个一个遍历出来。
1 public class ArraySortTest { 2 public static void main(String[] args) { 3 int[] arr = { 102, 66, 38, 76, 231, 190, 22, 13 }; 4 int len = arr.length; 5 //控制循环比较的轮数,例10个数字相邻两个比较,需要比较9轮 6 for(int i = 0; i < len-1; i++){ 7 //控制每轮比较的次数,例10个数字第一轮需要比较9次、8、7...1,共比较九轮 8 for(int j = i + 1; j < len; j++){ 9 //相邻两个比较,大的数字向后移。 10 if(arr[i] > arr[j]){ 11 int temp = arr[i]; 12 arr[i] = arr[j]; 13 arr[j] = temp; 14 } 15 } 16 } 17 System.out.println(Arrays.toString(arr)); 18 } 19 } 20 /*运行结果 21 [13, 22, 38, 66, 76, 102, 190, 231] 22 */
选择排序:是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。
1 public class ArraySortTest2 { 2 public static void main(String[] args) { 3 int[] arr = { 102, 66, 38, 76, 231, 190, 22, 13 }; 4 int len = arr.length; 5 for (int i = 0; i < len - 1; i++) { 6 int min = i; 7 for (int j = i + 1; j < len; j++) { 8 if (arr[min] > arr[j]) { 9 min = j; 10 } 11 } 12 if (min != i) { 13 int temp = arr[i]; 14 arr[i] = arr[min]; 15 arr[min] = temp; 16 } 17 } 18 System.out.println(Arrays.toString(arr)); 19 } 20 }
插入排序:是选择一个数组中的数据,通过不断的插入比较最后进行排序。略,有兴趣的筒靴可以自己学习一下。
原文:http://www.cnblogs.com/Colinhcj/p/6427097.html