多态,容器,泛型
养成查API文档的好习惯!
一:什么是多态?什么是容器?
1.多态:强大的“父类的引用指向子类对象”(指针)。它的实现就是父类的子类们根据自身的需求来实现其父类的同一个方法。通常和“接口”的实现有关,当然还有继承。
2.容器:通俗的讲就是存放东西的器皿,就面向对象而言,就是存放某一类对象的类型。面向对象语言的容器(接口)有Collection,Set,List,Map,Iterator,Comparable.
二:容器(六大接口)
1.Collection接口:它是Set,List容器接口的父类,所以其它的子类里包含了他里边的所有方法。(可查阅API文档)
2.Set接口:他里边的元素特点是元素的值不可重复并且元素没有顺序。实现他的类是HashSet,注意在要使HashSet里的两个对象相等必须重写这两个对象的equals(),和hashcode();
3.List接口:和数组非常类似他的元素有下标。其特点是元素的值可以重复并且有顺序。实现他的类典型的有ArrayList(读取速度快写入速度慢),LinkedList(读取速度慢写入速度快).
ArrayList的底层实现是数组,他是一块连续的内存单元,而LinkedList的底层实现是链表实现的他里边的元素是不连续的但是其头、尾都有指针指向其前一个元素和后一个元素的结构。这里又必须和数据结构中的知识联系起来了。
这里不能不提封装了List的算法的类Collections(注意和上面的接口Collection区分)比如shuffle()随机排序算法,sort()排序算法,binarySearch()二分法查找。
4.Map接口:它区别与所有容器接口的主要特点是他存放的对象是以键值对的方式存放。他的实现类主要有HashMap,TreeMap.它里面的键值对不能重复。
在jdk1.5之后增加了Auto-Boxing(自动打包)(自动将基础数据类型转换为对象),Unboxing(解包)自动将对象转换为基础类型。比如在jdk1.4之前向Map对象写入数据时写法为:Map m=new HashMap();(这里就是多态的运用父类是Map,子类是HashMap)
M.put("one",new Integer(1));
int i=((Integer)m.get("one")).intValue();
而在jkd1.5之后可以这么写方便:
Map m=new HashMap();
M.put("one",1);java虚拟机可以将1这个基础类型自动转换成Integer对象实现了打包机制。int i=(Integer)m.get("one");实现了解包机制。
5.Iterator接口(迭代器):这里存在着多态,我们的容器对象实现了iterator()方法,并且返回Iterator这个类的对象,然后通过这个对象去遍历我们的容器里面的数据。
Collection c=new HashSet();
c.add("aaa");
c.add("bbb");
Iterator i=c.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
6.Comparable接口:实现了这个方法的类他们的实例化对象都能比较大小。这个接口中只有一个方法(这个接口在java.lang包里)public int compareTo(Object obj)他的返回值分别是(-1,0,1),他的用途在比较对象类型的值的场合,而基本的类型直接用Collection.sort(m1);
三.泛型(Generic)
装入集合中的类型都被当成对象(Object)来对待,当取出来集合中的数据时不能明确他到底是什么类型,因此失去了其自身的类型.。所以出现了泛型。比如:List<String> c=new ArrayList<String>();这里明确了往List中存放的是String类型的变量。因此拿出来的时候就不需要强制转换。