《Java编程思想》笔记16-数组
数组的优点,不能和现在的泛型容器比。要和它同时期的无泛型的原生容器比。站在Java1.0的时间基准上看,数组至少有三大优势:
- 高效(下标随机访问O(1))
- 持有特定类型(无泛型容器只能持有Object)
- 能持有基本型
但现在有泛型容器,也已经编译器类型检查。而且直接有“自动包装机制”,容器持有基本型不成问题。数组只剩下高效一个优点了。但因为数组有长度限制,而且容器功能更多。所以现在普遍都用容器。
多维数组
使用 Arrays.deepToString()
将多维数组转换为多个 String。
数组与泛型
通常,数组与泛型不能很好结合,你不能实例化具有参数化类型的数组。
Peel<Banana>[] peels = new Peel<>[10]; //不合法
擦除会移除参数类型信息,而数组必须知道它们所持有的确切类型,以强制保证类型安全。
但是它允许你创建对这种数组的引用。你可以创建非泛型的数组,然后将其转型。
public class ArrayOfGenerics {
public static void main(String[] args) {
List<String>[] ls;
List[] la = new List[10];
ls = (List<String>[])la; // "Unchecked" warning
ls[0] = new ArrayList<String>();
//! ls[1] = new ArrayList<Integer>();
// 数组是协变类型的,因此 List<String>[] 也是一个 Object[],
// 并且利用这点可以把 ArrayList<Integer>赋值到数组中,不会有任何编译期或运行时错误。
// 如果知道将来不会向上转型,并且需求也相对比较简单,那么你仍旧可以创建泛型数组。
Object[] objects = ls; // OK
objects[1] = new ArrayList<Integer>();
}
}
填充数组
Arrays.fill()
标准类库的 fill() 只能用同一个值填充各个位置。
int[] i=new int[10];
Arrays.fill(i,9); // [9,9,9,9,9,9,9,9,9,9]
Arrays 实用功能
复制数组
System.arraycopy()
复制数组,比用 for 循环复制要快很多,该方法对所有类型做了重载。
注意复制对象数组的时候,只是浅复制。另外,System.arraycopy()
不会执行自动包装和自动拆包,两个数组必须具有相同的类型。
Arrays.copyOf()
Arrays.copyOf() 接受两个参数,第一个是源数组,第二个拷贝以后数组的长度。可以用来扩展数组。用起来比 System.arraycopy() 简便,内部调用 System.arraycopy()
Object.clone()
最后一个 Object.clone() 只是浅复制,被复制的类需要实现 Clonenable 接口(不实现的话在调用 clone 方法会抛出 CloneNotSupportedException 异常) 该接口为标记接口(不含任何方法)
由于 Clonable 接口有这么多问题,很多专家级程序员干脆从来不去覆盖 clone 方法。————《Effective Java》P52
数组的比较
Arrays.equals()
: 相等的条件:元素个数相等,对应位置的元素也相等。
在已排序的数组中查找
排序,比较,对象实现了 Comparable 接口,或具有相关联的 Comparator。
如果使用 Comparator 排序对象数组(基本类型数组无法使用 Comparator 进行排序)了,使用 binarySearch 对对象数组进行排序的时候必须提供同样的 Comparator。
int index = Arrays.binarySearch(sa, sa[10], String.CASE_INSENSITIVE_ORDER);
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:《Java编程思想》笔记16-数组
文章字数:827
本文作者:Bin
发布时间:2018-05-29, 21:01:02
最后更新:2019-08-06, 00:46:42
原始链接:http://coolview.github.io/2018/05/29/Java%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3/%E3%80%8AJava%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3%E3%80%8B%E7%AC%94%E8%AE%B016-%E6%95%B0%E7%BB%84/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。