1:数组的特殊性:
1、数组是效率最高的存储方式,但是为这种速度付出的代价是长度固定、生命周期中不可改变。
2、数组中存放的固定类型的数据,类型检查在编译和运行期都有。
3、数组支持基本数据类型。
以上三个数组的优点,相对于容器,好像只剩下了效率高。但是实际情况中数组很受显示。
2:数组标识符其实是一个引用,指向堆中的一个真实的对象。
3:数组和泛型结合:
1、不靠谱的做法
TestClass<ClassB>[] test = new TestClass<ClassB>[10] //由于擦除会移除类型信息,但是数组还必须要确定类型。
2、 靠谱的做法:
参数化数组本生的类型:
class TestClass<T>{ public T[] f(T[] arg){return arg;} } class main{ Integer arr = {1,23,4}; Integer nums = new TestClass<Integer>().f(arr); }
4:Arrays类实用方法:
1、equals() 比较两个数组是否相同(deepEqual()用于多维数组)。(元素位置、值都相同)
2、fill() 用同一个值填充所有的位置。
3、sort() 对数组排序。(可以对基本数据类型,实现了Comparable接口或者关联了Comparator的对象)
4、binarySearch() 在已经排序的数组中查询元素。
5、asList() 将序列或者数组转变为List容器(返回的List不可变)。
6、arraycopy() 复制数组,针对各种类型做了重载,比使用for循环块很多。
杂记:
1:ArrayList可以自动扩充尺寸的数组。
2:@supperss Warnings 抑制警告。
3:泛型使得一些本该在运行期暴露的错误在编译器报错。
4:使用接口可以使我们写出通用的代码。
5:多态通过分离做什么和怎么做将接口和实现类分离开。改变了程序的组织接口,提高了扩展性。
6:封装通过合并特征和行为来抽象新的数据类型。
7:ArrayList.asList();方法接收一个数组或者以逗号分隔的元素列表。将其装换为list。
使用ArrayList.asList()或取到的list底层表示是数组,所以不制止add()或者delete()方法。
8:显示类型参数说明
class F{}; class S1 extends F{}; class S2 extends F{}; List<F> f = Arrays.<F>asList(new S1(),new S2());