Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1800370
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: Java

2012-03-25 23:37:21

Java中的数组是在堆中分配的连续内存,它可以用来存放基本类型的值或对象类型的引用。除了操作符“[]”外,数组同样还有一个length属性,这和C++里的数组不同。
我们还可以使用多维数组


  1. int a[][][] = new int[2][3][2];
  2. a[1][2][1] = 5;

数组内所有元素都会被赋一个默认初值(null、0、false等)。因为数组是在堆中初始化的,所以可变长度的维度是可行的。这样的数组被称为粗糙数组
  1. int a[][][] = new int[2][][];
  2. a[0] = new int[3][];
  3. a[1] = new int[5][];
  4. a[0][1] = new int[6];
  5. a[1][2] = new int[8];
  6. System.out.println(Arrays.deepToString(a)); // Output: 
  7. // [[null, [0, 0, 0, 0, 0, 0], null], [null, null, 
  8. // [0, 0, 0, 0, 0, 0, 0, 0], null, null]]

Arrays.deepToString方法可以将多维数组转成字符串。同样你也可以用数组初始化的方式来定义粗糙数组:
  1. int a[][][] = new int[][][] {
  2.         { {1,2,3,4}, {5,6} },
  3.         { {7}, {8}, {9,10,11}, {12} },
  4.         { {13,14}, {15,16}, {17,18} }
  5. };


Java提供了一些对数组的操作,比如fill、equal、copy等。下面演示下:
Arrays.fill


  1. void fillArray() {
  2.     int a[] = new int[5];
  3.     Arrays.fill(a, 3);
  4.     System.out.println(Arrays.toString(a)); // [3, 3, 3, 3, 3]
  5.     int b[] = new int[8];
  6.     Arrays.fill(b, 2, 6, 3);
  7.     System.out.println(Arrays.toString(b)); // [0, 0, 3, 3, 3, 3, 0, 0]
  8. }

System.arraycopy
  1. void copyArray() {
  2.     int a[] = {1, 2, 3, 4, 5};
  3.     int b[] = new int[a.length+1];
  4.     System.arraycopy(a, 0, b, 1, a.length);
  5.     System.out.println(Arrays.toString(b)); // [0, 1, 2, 3, 4, 5]
  6. }

Arrays.equals
  1. void equalsArray() {
  2.     int a[] = {1, 2, 3, 4, 5};
  3.     int b[] = {1, 2, 3, 4, 5};
  4.     Arrays.equals(a, b); // true
  5. }

还有数组的排序,对象类型并须实现Comparable接口才可以用Arrays.sort排序,否则在会得到异常。示例代码:
  1. class MyElement implements Comparable<MyElement> {
  2.     public int compareTo(MyElement other) {
  3.         return this.value - other.value;
  4.     }
  5.     static MyElement createNext() {
  6.         MyElement me = new MyElement();
  7.         me.value = r.nextInt(20);
  8.         return me;
  9.     }
  10.     public String toString() {
  11.         return String.valueOf(value);
  12.     }
  13.     private int value;
  14.     private static Random r = new Random();
  15. }

  16. static void sortArray() {
  17.     MyElement meArray[] = new MyElement[8];
  18.     for (int i = 0; i < meArray.length; ++i) {
  19.         meArray[i] = MyElement.createNext();
  20.     }
  21.     System.out.println(Arrays.toString(meArray)); // [8, 18, 4, 2, 16, 0, 13, 3]
  22.     Arrays.sort(meArray);
  23.     System.out.println(Arrays.toString(meArray)); // [0, 2, 3, 4, 8, 13, 16, 18]
  24. }

如果你对Comparable的排序不满意,你可以自己定义一个Comparator
  1. class MyElementComparator implements Comparator<MyElement> {
  2.     @Override
  3.     public int compare(MyElement left, MyElement right) {
  4.         return right.compareTo(left); // reverse
  5.     }
  6. }
  7. void reverseSortArray() {
  8.     MyElement meArray[] = new MyElement[8];
  9.     for (int i = 0; i < meArray.length; ++i) {
  10.         meArray[i] = MyElement.createNext();
  11.     }
  12.     System.out.println(Arrays.toString(meArray)); // [17, 14, 12, 9, 4, 7, 19, 11]
  13.     Arrays.sort(meArray, new MyElementComparator()); // add a comparator
  14.     System.out.println(Arrays.toString(meArray)); // [19, 17, 14, 12, 11, 9, 7, 4]
  15. }

对于排好序的数组,可以使用二分法来查找元素。Arrays.binarySearch
  1. void binarySearchArray() {
  2.     int a[] = { 3, 5, 2, 4, 9, 7, 1 };
  3.     Arrays.sort(a);
  4.     int index = Arrays.binarySearch(a, 7); // a[5]=7
  5. }


编译器不允许你创建一个范型数组,但是允许你使用范型数组的引用:
  1. // List liArray[] = new List[8]; // error:
  2. // Cannot create a generic array of List
  3. List<Integer> liArray[] = new List[8]; // success!
  4. // liArray[0] = new ArrayList(3); // error:
  5. // Type mismatch: cannot convert from ArrayList to List

阅读(820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~