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());