首页 > 编程语言 > 详细

Java数组学习

时间:2017-02-23 01:02:44      阅读:115      评论:0      收藏:0      [点我收藏+]

明天又是新的一天。

 

目录:

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 }

插入排序:是选择一个数组中的数据,通过不断的插入比较最后进行排序。略,有兴趣的筒靴可以自己学习一下。

 

Java数组学习

原文:http://www.cnblogs.com/Colinhcj/p/6427097.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!