java基础(14)---数组

泛型以后学习的更加深入了再来总结 先总结第16章数组。

1 数组为什么特殊

数组为什么特殊;数组与其他种类直接的区别有三方面:效率、类型和保存基本类型的能力。在java中,数组是一种效率最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素的访问非常快速,但是为这种速度所付出的代价是数组对象的大小被固定。并且在其生命周期中不可改变。

2、数组是第一级对象

对象数组保存的是引用,基本类型数组保存的是值。
数组的初始化:
基本类型:数值型初始化为0,char型初始化为 (char)O,boolean型初始化为false。
对象类型:初始化为null。

3、返回一个数组

返回一个数组对于c和c++来说有点困难在java中只需要直接“”返回一个数组“”

4、多维数组

对于多维数组的打印,使用Arrays.deepToString();
数组中构成矩阵的每个向量可以有任意长度,如:
a[][] = {{{}, {0} }, {{0,0}, {0,0,0}, {0,0,0,0,0}}, {{0}} }

5、数组与泛型

数组与泛型不能很好的结合。你不能实例化具有参数化类型的数组:

Peel<Banana>[] peels=new Peel<banana>[10];

擦除会移除参数类型信息,而数组必须知道他们所持有的确切类型,以强制保证类型安全。、

编译器不允许实例化泛型数组,但是可以创建其应用,如:
List<String>[] ls;
然后用非泛型数组转型:
List[] la = new List[10];
ls = (List<String>[])la; // "Unchecked" warning
ls[0] = new ArrayList<String>();

数组是协变类型的。

6、创建测试数据

Arrays.fill() 可以填充整个数组

书中还介绍了Generator来创建数组,感觉没什么用。不总结了。

7. Arrays实用功能

(1) System.arraycopy() 数组复制

Java标准类库提供static方法System.arraycopy(),用它复制数组比用for循环复制快很多。

System.arraycopy(Object src, int srcPosition, Object dest, int destPosition, int length);

注意:System.arraycopy()不会执行自动包装盒自动拆包,两个数组必须具有相同的确切类型。

基本类型数组与对象数组都可以复制。如果复制对象数组,只是复制了对象的引用——而不是对象本身的拷贝,这被称为浅复制

(2) Arrays.equals() 数组比较

Arrays类提供了静态equals()方法,用来比较整个数组。数组相等的条件是元素个数必须相等,并且对应位置的元素也相等,通过对每一个元素使用equals()方法来作比较。

使用Arrays.deepEquals()可以比较多维数组。

(3) Arrays.sort() 数组排序

使用静态方法Arrays.sort()用语对数组进行排序。



Java有两种方式来提供比较功能:

第一种:实现java.lang.Comparable接口

此接口只有一个compareTo()方法,此方法接收另一个Object为参数,如果当前对象小于参数则返回负值,如果相等则返回零,如果当前对象大于参数则返回正值。如果对没有实现Comparable接口的类的数组进行排序,会抛出ClassCastException。因为sort()需要把参数的类型转换为Comparable。

第二种:创建一个实现了Comparator接口的单独的类

假设使用别人定义好的类并没有实现Comparable接口,或者类实现了Comparable接口但是需要另外一种比较方式。这是策略设计模式的一个应用实例。这个类有两个方法compare()和equals()方法。不一定要实现equals()方法,因为它间接的继承自Object的equals()方法。

(4) Arrays.binarySearch() 执行快速查找

如果要对未排序的数组使用binarySearch()将产生不可预料的结果(可能指没找到元素的返回情况)。

如果找到了目标,Arrays.binarySearch()产生的返回值大于或等于0,否则产生负返回值。

若要保持数组的排序状态此目标元素应该插入的位置。这个负值的计算方式的: -(插入点)-1。插入点指第一个大于查找对象的元素在数组中的位置,如果数组中所有的元素都小于查找的对象,插入点就等于数组的长度。

如果数组包含重复的元素,则无法保证找到的是这些副本中的哪一个。

如果需要对没有重复元素的数组排序可以使用TreeSet(保持排序顺序),或者LinkedHashSet(保持插入顺序)。这些类会自动处理所有细节。除非他们成为程序性能的瓶颈,否则不需要自己维护数组。

如果使用Comparator排序了某个对象数组,在使用binarySearch()时必须提供同样的Comparator。



猜你喜欢

转载自blog.csdn.net/qq_40182703/article/details/80513638