复制数组:System.arraycopy()
public class Main{
public static void main(String[] args){
int[] i = new int[7];
int[] j = new int[10];
Arrays.fill(i, 47);
Arrays.fill(j, 99);
System.out.println("i = " + Arrays.toString(i));
System.out.println("j = " + Arrays.toString(j));
System.arraycopy(i,0,j,0,i.length);
System.out.println("j = "+ Arrays.toString(j));
int[] k = new int[5];
Arrays.fill(k, 103);
System.arraycopy(i,0,k,0,k.length);
System.out.println("k = " + Arrays.toString(k));
Arrays.fill(k, 103);
System.arraycopy(k, 0 ,i,0,k.length);
System.out.println("i = " + Arrays.toString(i));
Integer[] u = new Integer[10];
Integer[] v = new Integer[5];
Arrays.fill(u,new Integer(47));
Arrays.fill(v,new Integer(99));
System.out.println("u = "+ Arrays.toString(u));
System.out.println("v = "+ Arrays.toString(v));
System.arraycopy(v, 0, u, u.length/2, v.length);
System.out.println("u = "+ Arrays.toString(u));
}
}
运行结果:
i = [47, 47, 47, 47, 47, 47, 47]
j = [99, 99, 99, 99, 99, 99, 99, 99, 99, 99]
j = [47, 47, 47, 47, 47, 47, 47, 99, 99, 99]
k = [47, 47, 47, 47, 47]
i = [103, 103, 103, 103, 103, 47, 47]
u = [47, 47, 47, 47, 47, 47, 47, 47, 47, 47]
v = [99, 99, 99, 99, 99]
u = [47, 47, 47, 47, 47, 99, 99, 99, 99, 99]
用此方法复制,比用for循环快的多。此复制为浅复制,如果复制对象数组,那么只是复制了对象的引用,而不是对象本身的拷贝。并且,System.arraycopy()并不会自动包装和自动拆包,所以int和Integer是不能相互复制的
数组的比较:相等的条件是元素个数相等 ,并且对应位置的元素也相等
Arrays.equals(a1, a2)
public class Main{
public static void main(String[] args){
int[] a1 = new int[10];
int[] a2 = new int[10];
Arrays.fill(a1, 47);
Arrays.fill(a2, 47);
System.out.println(Arrays.equals(a1, a2));
a2[3] = 11;
System.out.println(Arrays.equals(a1, a2));
String[] s1 = new String[4];
Arrays.fill(s1, "Hi");
String[] s2 = {new String("Hi"), new String("Hi"),
new String("Hi"), new String("Hi")};
System.out.println(Arrays.equals(s1, s2));
}
}
运行结果:
true
false
true
可以发现,s1的所有元素指向同一个对象,而s2中的对象相互独立,数组相等时基于内容的
注:关于字符串的初始化可以参考 https://blog.csdn.net/qq_27469549/article/details/79898589
对自定义的对象进行排序
class CollectionData<T> extends ArrayList<T> {
public CollectionData(Generator<T> gen,int quantity){
for(int i=0;i<quantity;i++){
this.add(gen.next());
}
}
// A generic convenience method.
public static <T> CollectionData<T> list(Generator<T> gen,int quantity){
return new CollectionData<T>(gen, quantity);
}
}
interface Generator<T>{
T next();
}
class Generated{
public static <T> T[] array(T[] a, Generator<T> gen){
return new CollectionData<T>(gen, a.length).toArray(a);
}
public static <T> T[] array(Class<T> type, Generator<T> gen, int size){
T[] a = (T[])java.lang.reflect.Array.newInstance(type, size);
return new CollectionData<T>(gen, size).toArray(a);
}
}
class CompType implements Comparable<CompType> {
int i;
int j;
private static int count = 1;
public CompType(int n1, int n2){
i = n1;
j = n2;
}
public String toString(){
String result = "[i = " + i + ", j = " + j + "]";
if(count % 3 == 0){
result += "\n";
}
return result;
}
public int compareTo(CompType rv){
return (i < rv.i ? -1 : (i == rv.i ? 0 : 1));
}
private static Random r = new Random(47);
public static Generator<CompType> generator(){
return new Generator<CompType>() {
@Override
public CompType next() {
return new CompType(r.nextInt(100), r.nextInt(100));
}
};
}
}
public class Main{
public static void main(String[] args){
CompType[] a = Generated.array(new CompType[12], CompType.generator());
System.out.println("before sorting");
System.out.println(Arrays.toString(a));
Arrays.sort(a);
System.out.println("After sorting");
System.out.println(Arrays.toString(a));
}
}
运行结果:
before sorting
[[i = 58, j = 55], [i = 93, j = 61], [i = 61, j = 29], [i = 68, j = 0], [i = 22, j = 7], [i = 88, j = 28], [i = 51, j = 89], [i = 9, j = 78], [i = 98, j = 61], [i = 20, j = 58], [i = 16, j = 40], [i = 11, j = 22]]
After sorting
[[i = 9, j = 78], [i = 11, j = 22], [i = 16, j = 40], [i = 20, j = 58], [i = 22, j = 7], [i = 51, j = 89], [i = 58, j = 55], [i = 61, j = 29], [i = 68, j = 0], [i = 88, j = 28], [i = 93, j = 61], [i = 98, j = 61]]
对字符串进行排序
public class Main{
public static void main(String[] args){
String[] sa = {"dfs","jkm","Jkd","sdfgv","AWERR","terr","PERJMjd","QERM","vklo"};
System.out.println("Before sort: " + Arrays.toString(sa));
Arrays.sort(sa);
System.out.println("After sort: " + Arrays.toString(sa));
Arrays.sort(sa, Collections.reverseOrder()); //反序
System.out.println("reverseOrder sort: " + Arrays.toString(sa));
}
}
运行结果:
Before sort: [dfs, jkm, Jkd, sdfgv, AWERR, terr, PERJMjd, QERM, vklo]
After sort: [AWERR, Jkd, PERJMjd, QERM, dfs, jkm, sdfgv, terr, vklo]
reverseOrder sort: [vklo, terr, sdfgv, jkm, dfs, QERM, PERJMjd, Jkd, AWERR]
Java标准类库中的排序算法针对正排序的特殊类型进行了优化——针对基本类型设计的“快速排序”,以及针对对象设计的“稳定归并排序”。