Java数组

来源:互联网 发布:用友网络股票行情走势 编辑:程序博客网 时间:2024/06/13 21:30

数组与其他容器对比:效率 类型 保存基本类型的能力。

数组是效率最高的存储和随机访问对象引用序列的方式。访问的复杂度为O1,一步到位。但是代价是大小固定。对比ArrayList数组仅有的优点就是速度了(ArrayList底层也是数组)。

数组声明后会自动创建成员,如果是基本数据类型则是其默认值,如果是个对象,则是null。

数组对象具有一个唯一的属性就是length。

数组声明new Object[n]; {xx,x,x,xxx}多维数组可以{{x,x},{xx,xx}}
创建泛型数组是不行的,new T[10],原因数组是允许父类数组赋值为子类数组,也就是说动物[5]=new猪[5]是可以的。List[] arr = new ArrayList [10]; 如果能创建泛型数组则这个式子通过,另外有个Object[] arr2被初始化了,并且我们令arr2=arr父子关系,可以这么写的。然后arr2[0]=1;然后发现arr[0]被强行变成了1,这个int类型而不是原来的Object类型。因为泛型是为了安全,所以这个初衷出发的话,禁止了泛型数组,但是List[] arr2 = new ArrayList [10];这样写却没报错,这样写arr2其实是个泛型数组。

    List<String>[] arr2 = new ArrayList [10];    arr2[0]=new ArrayList<>();    arr2[0].add("hahhaa");    System.out.println(arr2[0]);    Object[] a=new Object[10];    a=arr2;    a[0]=10;    System.out.println(arr2[0]);

这段代码是模拟刚才那种假设,编译无措,但有个警告:

    警告: [unchecked] 未经检查的转换           List<String>[] arr2 = new ArrayList [10];                                 ^      需要: List<String>[]      找到:    ArrayList[]    1 个警告
但是运行时a[0]=10这行就出错了。ArrayStoreException

结论就是泛型数组不推荐使用,虽然可以用一种有警告的形式使用,但不正当使用会出错。

Arrays.fill(arr,val)可以将数组所有的值设为val。

System.arraycopy(src,srcstart,des,desstart,length)将src从srcstart取length个拷贝到des从desstart开始length个,注意任何一个数组产生越界都会报错,不管是src拿不出这么多还是des没这么多位子。!!!注意:这种复制方式之所以速度很快是因为执行的是浅复制,即如果是对象的话,复制的是对象的引用。但实际测试却是深复制,一个新的对象具有相同的值。和书上说的不一样。

Array.toString(arr)可以很好地打印数组。

数组的equals方式,是每个元素equals返回true才是true。

比较(排序sort):我们有时候会对数组进行排序,这时候我们需要对数组里的类实现一个Comparable接口(也可以是泛型的),这个接口要求重写compareTo(Object x)方法返回值是int于是可以使用Arrays.sort(arr)进行排序,这个排序直接改变数组本身。或者使用更好的非侵入式的重载Arrays.sort(arr,new Comparator) 这里使用的Comparator需要重写compare方法。这种写法是非侵入式的。

小结:

我们需要知道的是数组是一种古老的数据类型,存取速度快速是他的优点。泛型数组是不被允许的写法,应该了解下这样做的原因。Arrays封装了一些好用的静态方法:    toString可以更好的打印数组    equals可以判断每个元素最后返回是否相等        以上是对Object中重写的方法    sort可以根据自然顺序或者自定义Comparator进行排序,直接改变数组本身    fill可以快速填充数组所有项为某个值System.arraycopy可以进行数组间的值复制
0 0
原创粉丝点击