Thinking in java : 16 数组

请优先使用高级容器集合,除非证明用数组确实效率高,否则当然优先使用容器集合。

1.  数组是一种效率最高的存储和随机访问对象引用序列的方式,其代价就是固定大小。ArrayList的效率比数组低很多。不可越界否则产生RuntimeException。

2. 无论使用哪种类型的数组,数组标识符其实只是一个引用,指向在堆中创建的一个真实对象,这个对象用以保存指向其他对象的引用。

3. 对象数组:保存引用;所有引用被自动初始化为null;可以使用静态方法Arrays.deepToString(多维数组),返回多个String对象

    基本类型数组:直接保存基本类型的值;数值型自动初始化为0,char型自动初始化为(char)O,bollean自动初始化为false;可以使用静态方法Arrays.deepToString(多维数组),返回多个String对象

4. int[] a=new int[5];   int[] b = new int[6];

   a=b;   a将指向数组b;

5.数组与泛型

6. 数据生成器:Generator类。所有生成器嵌套在CountingGenerator类中,例如要创建Integer对象的生成器可以通过表达式new CountingGenerator.Integer()来创建。注意:CountingGenerator.String类使用CountingGenerator.Character来填充一个字符数组,该数组被转换为String,但是CountingGenerator.String使用的是基本的Generator<java.lang.Character>,而不是具体的对CountingGenerator.Character的引用。

7.Arrays类

      包含有用于数组的静态方法,equals():比较内容是否相同;fill():填充数组;sort():对数组排序;binarySearch():用于在已排序的数组中查找元素;toString()产生数组的String表示,返回格式:[a1,a2,a3];hashCode():产生数组的散列码;Arrays.asList()接受任意的序列或数组作为其参数,并将其转变为List容器

   7.1   一个不属于Arrays但很有用的方法

        静态方法:System.arraycopy(),用它来复制数组比用for循环要快很多。针对所有类型都做了重载。

import java.util.Arrays;

public class Niuke {
    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);  //将数组i从0复制到j,从j[0]开始,i.length为要复制的元素个数
        System.out.println("j = " + Arrays.toString(j));

        Integer[] u = new Integer[10];
        Integer[] v = new Integer[5];
        Arrays.fill(u, 47);
        Arrays.fill(v, 99);
        System.out.println("u = " + Arrays.toString(u));
        System.out.println("v = " + Arrays.toString(v));
        System.arraycopy(v, 0, u, u.length / 2, u.length/2);
        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]
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]
 */

Ststem.arraycopy( 源数组,源数组开始位置 ,目标数组 ,目标数组开始位置 ,需要复制元素的个数),不可越界,并且不会自动包装和拆包,所以,需要两数组类型相同。

此例子表示,基本类型数组和对象数组都可以复制,当然,复制对象数组,只是复制了对象的引用而不是对象本身的拷贝,这被称为“潜复制”

Arrays.binarySearch():

1.首先要对查找的数组做Arrays.sort()排序;2.其算法为二分查找,返回索引号;3.数组中有重复的元素,查找时随机返回任意一个索引号。对于对象类型需要传入改写的Comparator作为参数!



猜你喜欢

转载自blog.csdn.net/oyeyuanxinzhizhu1/article/details/79733342