关于数组活动地址:CSDN21天学习挑战赛
虽然用new,但是大小确定后不可更改。
动态初始化:定义:数据类型 数组名 = new 数据类型 [大小]
int [][] = new int [m][n]; //m个有n个元素的元素
先声明再创建:数据类型 数组名[ ];或 数据类型 [ ]数组名;数组名 = new 数据类型[大小];
静态初始化:数据类型 数组名 [ ] = {元素值,元素值...};
值传递与地址传递:数字直接复制导致地址传递,新数组值改变引起旧数组值同时改变,解决需用值传递
地址传递:
int array[] = new int [5]; int arrayNew[] = array; //array与arrayNew的值同时改变
值传递:
int array[] = new int []{1,2,3,4}; int arrayNew[] = new int [array.length]; System.arraycopy(array,0,arrayNew,0,array.length);//也可以使用循环进行赋值
第一个参数表示源数组
第二个参数表示源数组要复制的起始位置
第三个参数表示目标数组
第四个参数表示要复制的长度
小结:只要使用new新开辟空间,就可以避免浅复制的问题。
数组拷贝:
int []array1 = {1,2,3,4,5}; int []array2 = Arrays.copyOf(arr1,5);
传回新的数组,不影响原来数组,相当于封装了一个new和循环赋值的操作。
第二个参数是新数组长度,多处的空间默认置0(通常第二个参数为array.length * 2来扩容数组大小)
Arrays工具类的使用java.util.Arrays类即为操作数组的工具类,包含了用来操作数组的各种方法,比如搜索、排序等
c++中,通过bool传参给sort的第三个参数进行自定义排序(默认升序)
Java中,可以分为操作数组或者操作对象
操作数组:
Integer[] temp = {4,3,7,9,2,4,6,0}; //定义integer,以对象的形式操作 Arrays.sort(temp, new Comparator() { public int compare(Integer a, Integer b) { return b > a; //自定义降序排列 } });
操作对象:
在对象内部通过覆写compareTo函数,自定义排序规则
@Override public int compareTo(Object o) { // TODO Auto-generated method stub if (o instanceof Student) { Student s = (Student) o; if (this.age > s.age) { return 1; } else if (this.age == s.age) { return 0; } else { return -1; } } return 0; }
注意返回值类型为int,因为在比较字符串时,会出现以下几种情况:
比较的两个字符串首字母不同:返回首字母的ASCII码差值
比较的两个字符串首字母相同:则比较下一个字符,直至字符不同,返回ASCII码的差值
两个字符串不一样长,可以参与比较的字符又完全一样:返回两个字符串的长度差值如‘aa123456’与'aa',返回6