1 数组
- 数组和容器比较,数组的优点也只剩访问效率高这一点了。
2 数组是第一级对象
- 数组也是一个对象,和其他普通对象一样在堆中创建, int[ ] arr arr是数组的引用。
- 可以隐式创建数组对象,也可以new显式创建数组对象
int[] ints = {1 ,8 ,9}; //聚集初始化 /*动态聚集初始化,任意位置创建并初始化, * 有时候传一个数组类型参数时代码更简单*/ int[] iArr = new int[]{2 , 5 , -12 , 20}; int[] arr = new int[3];//只定义了大小
- 对象数组中数组存的是对象的引用,基本类型数组直接存值
- length表示数组大小,不表示数组内具体存有多少个元素。
3 返回一个数组
- 和返回一个普通类型没区别
4 多维数组
- Java没有多维数组,任何多维数组都可以看成一维数组内引用一维数组
- 初始化多维数组时可以先只初始化最左边的维数,此时该数组的每个元素都相当于一个数组引用变量,这些数组元素还需要进一步初始化
- int a = new int[2][3][5] ; 直接定义大小,这样的数组是个规则的多维数组
- 逐步定义大小如下:
int[][][] a = new int[2][][]; System.out.println("a.length="+a.length); //a中只有2个元素a[0],a[1]它们是一个二维数组的引用 a[0]=new int[3][]; a[1]=new int[3][]; System.out.println("a[1].length="+a[1].length);//a[1]中3个元素a[1][0],a[1][1],a[1][2]他们是一维数组的引用 a[0][1] = new int[5]; System.out.println("a[0][1].length="+a[0][1].length);// a[0][1] 中有5个元素a[0][1][0]-a[0][1][4] System.out.println(Arrays.deepToString(a)); /* a.length=2 a[1].length=3 a[0][1].length=5 [[null, [0, 0, 0, 0, 0], null], [null, null, null]] */
- 逐步定义大小可以定义出不规则多维数组,如
a[0]=new int[3][]; a[1]=new int[2][];
- 打印多维数组Arrays.deepToString();
- 数据存在[5]这个数组中,其他[2]和[3]都存的引用。
5 数组与泛型
- 可以创建泛型数组引用 Fruit<Apple>[ ] apples;
- 但不能实例化具有泛型的数组如 apples = new Fruit<Apple>[ ];
6 填充数组
- Array.fill(Object[] a, int fromIndex, int toIndex, Object val) 使用val值填充范围内的每一个值,没有范围就填充全部值,此方法被重载了很多次可以适用任何类型。缺点就是只能用一个值填充。
7 Arrays类库
- java.util.Arrays 类库是用来操作数组的,全部为static方法
- 复制数组
- 可以使用System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length); 参数有(源数组,偏移量,目标数组,偏移量,长度)长度+源/目标数组偏移量后不能越界。会将目标数组偏移量后指定长度的元素替换为源数组的偏移量后指定长度的元素,此方法是本地方法直接内存操作具有较高的效率,但对于对象类型数组只是复制了一份引用而已,并没有复制对象,这也叫浅度复制。并且没有实现自动包装。
- 1.6开始 可以使用 Arrays.copyO f(int [] original, int newLength) ,复制一份数组如果新数组长度大于源数组长度则用0或null填充,属于深复制。
- copyOfRange(char[] original, int from, int to) 深度复制
- 数组比较
- Arrays.equals(a1, b1) 相同的条件是数组元素个数相等,相同位置元素内容相同。Arrays的equals()是重载过的是基于内容比较。
- 多维数组使用Arrays.deepEquals()比较。
- 数组元素比较
- 一个类实现Comparable接口,重写compareTo()方法后就具有了比较能力。,至于什么跟什么比可以根据要求决定写在compareTo(Object a)方法里,
-
如果指定的数与参数相等返回0。
-
如果指定的数小于参数返回 -1。
-
如果指定的数大于参数返回 1。
-
- 实现Comparable接口后调用Arrays.sort()方法就会自动升序排序。
- 一个类实现Comparable接口,重写compareTo()方法后就具有了比较能力。,至于什么跟什么比可以根据要求决定写在compareTo(Object a)方法里,
- 数组排序
- Arrays.sort(Object[] a) a 必须实现Comparable接口
- Arrays.sort(T[] a, Comparator<? super T> c) Comparator比较器接口,可以创建自己需要的比较规则在compare(Object a, Object b)方法实现即可。可以对没有实现Comparable接口的类或者Comparable比较方式不符合要求的对象按自己需求比较.
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数
- Comparable.compareTo(Object a)也称自然排序,内比较器,自己内的元素排序。Comparator.compare(Object a, Object b) 外比较器,比较对象属性,无法对基本类型数组排序。
- 在已经排序的数组中查找
- Arrays.binarySearch(Object[] a, Object key) 如果找到返回索引,找不到返回一个负值,该负值= -(插入点)-1 ,插入点为第一个比Key大的元素的索引。
- 对于使用了Comparator排序的对象数组要使用 binarySearch(T[] a, T key, Comparator<? super T> c) 查找
- 基本数据类型数组无法使用 binarySearch(T[] a, T key, Comparator<? super T> c)
知识点:
- 二维数组a[ ][ ] 中 a.length 就是行数row, a[0].length就是列数column。