简介
数组存在的优势和劣质
优势
- 数组是线性序列,从效率和类型检查的角度讲,数组是最好的
劣势
- 不灵活,数组的大小是预先定义好的,不会随意改变
引入容器
- 容器这个概念就是装东西的介质,可以理解为能装东西的都是容器
- 比如之前的数组,就是一种容器
- 英文collection,翻译为容器,也有意为集合的值得都是这个接口
Collection介绍
- 其下有两个子接口Set和List
- Set 没有顺序,不可重复
- List 有顺序可以重复
接口常用实现类
- Set实现HashSet(底层哈希实现)
- List实现ArrayList(底层数组实现)和LinkedList(底层链表实现)
Map
- 常用HashMap(底层哈希)
泛型概念引入
- 泛型是JDK1.5以后增加的,它可以帮助我们建立类型安全的集合
- 泛型的本质,就是"数据类型的参数化",就相当于给对象加了一个参数,调用的时候需要传入实参
- 泛型是靠编译器进行处理的
泛型实战
- 建立一个简单的泛型
建议一个简单的容器
调用容器
存在问题
- 同类型数据无法共同存储
- 每次需要不断转型
问题解决 ----------- 使用泛型
- 泛型常用<T,E,V>表示名称.
改写容器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class FormalCollection<E>{ 2 3 Object[] objects; 4 5 6 FormalCollection(){ 7 objects=new Object[5]; 8 } 9 10 public E getObjects(int index) { 11 return (E)objects[index]; 12 } 13 14 public void setObjects(E object,int index) { 15 objects[index] = object; 16 } 17 }
调用容器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 FormalCollection<String> formalCollectionString = new FormalCollection<>(); 2 3 formalCollectionString.setObjects("zhangsan",0); 4 formalCollectionString.setObjects("lisi",1); 5 formalCollectionString.setObjects("wanger",2); 6 formalCollectionString.setObjects("longwu",3); 7 8 FormalCollection<Integer> formalCollectionInteger = new FormalCollection<>(); 9 10 formalCollectionInteger.setObjects(25,0); 11 formalCollectionInteger.setObjects(26,1); 12 formalCollectionInteger.setObjects(27,2); 13 formalCollectionInteger.setObjects(28,3); 14 15 16 FormalCollection<Double> formalCollectionDouble = new FormalCollection<>(); 17 18 formalCollectionDouble.setObjects(12500.00,0); 19 formalCollectionDouble.setObjects(12600.00,1); 20 formalCollectionDouble.setObjects(12700.00,2); 21 formalCollectionDouble.setObjects(42800.00,3); 22 23 24 System.out.println("姓名"+" "+"年龄"+" "+"薪资"); 25 26 System.out.println(formalCollectionString.getObjects(0)+" "+formalCollectionInteger.getObjects(0)+" "+formalCollectionDouble.getObjects(0)); 27 System.out.println(formalCollectionString.getObjects(1)+" "+formalCollectionInteger.getObjects(1)+" "+formalCollectionDouble.getObjects(1)); 28 System.out.println(formalCollectionString.getObjects(2)+" "+formalCollectionInteger.getObjects(2)+" "+formalCollectionDouble.getObjects(2));
结果展示
容器中使用泛型
通过阅读源码,发现Collection、List、Set、Map、Iterator接口都定义了泛型
Collection简介
- Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口
- 由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。
Collection接口中定义的方法
- boolean add(E e); 增加元素到容器中
- boolean remove(Object o); 从容器中移除元素
- boolean contains(Object o); 容器中是否包含该元素
- int size(); 容器中元素的数量
- boolean isEmpty(); 容器是否为空
- void clear();清楚容器中所有元素
- Iterator<E> iterator(); 获取迭代器,用于遍历所有元素
- boolean containsAll(Collection<?> c);本容器是否包含C容器中的所有元素
- boolean addAll(Collection<? extends E> c); 将容器C中所有元素增加到本容器
- boolean removeAll(Collection<?> c); 移除本容器和容器C中都包含的元素
- boolean retainAll(Collection<?> c); 取本容器和容器C中都包含的元素,移除非交集元素
- Object[] toArray();转化成Object数组
例子详情见ArrayList