java.ulti中的接口和抽象类梳理与分析

梳理一下java中我们常用的java.ulti包中的数据结构对象,如set,list,map,collection,queue之间的关系, 以及实现的LinkedList, ArrayList,HashSet,TreeSet,HashTable,HashMap,TreeMap等等

1. 接口继承关系

首先关于接口,我们需要知道以下:

  1. 接口通过关键字interface声明,一个类可以通过关键字implements实现多个接口,一个接口也能被多个类实现,
  2. 接口中包含的方法都是类要实现的抽象方法,因此接口无法实例化
  3. 一个实现接口的类,必须实现接口内所有方法,否则就必须声明为抽象类
  4. 接口不能包含成员变量,除了 static 和 final 变量,没有构造方法

-

我们对java.ulti中比较常用和重要的接口画出继承图,图中的箭头代表继承关系,由extends关键字声明,对,接口除了被实现也是可以被接口继承的,继承后的接口比被继承的接口要更加具体:

  • Collection接口定义了一切对象的集合,这个集合能够被遍历和迭代
  • List继承Collection接口,并将这个集合变得有序,不保证元素重复
  • Set也继承Collection接口,集合是无序的,但保证元素不重复,而SortedSet进一步继承Set使集合有序而且不重复
  • Queue继承Collection接口,集合有序但限制了对集合的操作,如插入和删除,Deque继承Queue使对集合的操作更加细化,如双向的插入和删除
  • Map接口则定义了一个能映射key集合到value集合的对象,而SortedMap继承Map让key集合有序,NavigableMap和NavigableSet接口则定义了基于树(红黑树)排序相关的方法

这里写图片描述

2. 抽象类和实现类的继承关系

首先对于抽象类,我们需要知道以下:

  1. 抽象类通过abstract关键字声明,通过extends关键字继承,一个类只能继承一个抽象类
  2. 抽象类不能被实例化,抽象类中可以实现方法,而且成员变量,构造方法与普通类一样
  3. 抽象类中不一定要有抽象方法,但是有抽象方法的一定是抽象类或者接口,而且抽象方法一定要被继承的子类具体实现,除非子类也是抽象类
  4. 类方法(static)不能声明为抽象方法

-

我们同样对java.utli中的常见一些抽象类和实现的具体类进行梳理,如下图,我们用实线框代表普通类,用虚线框代表抽象类,箭头为extends的继承关系,由于接口的实现太多太杂,不易于展现,因此只有继承关系,但是基本上接口能根据类名猜出,例如类名中带Set的,都有实现Set接口,如AbstractSet, HashSet, TreeSet等。


这里写图片描述

下面我们通过继承稍微解释一下我们常用的一些java数据结构对象:

  • AbstractCollection: 直接继承Object对象,虽然作为一个抽象类但它提供了Collection接口中方法的最小实现,而AbstractSet也没有重写父类的方法,仅增加一些Set接口方法的实现, 同样的有AbstractList和AbstractQueue
  • HashSet:Set接口实现,集合元素无序,元素之间不相等,通过equals和hashCode比较元素是否相等,插入删除操作时间为O(1)
  • TreeSet: Set接口和NavigableSet接口实现,集合元素有序,元素之间互不相等,每次插入删除操作后会保持集合元素的排列顺序(默认升序),因此插入的对象(非基本数据类型的对象)需要实现Comparable接口的compareTo方法,时间复杂度O(log(n))
  • LinkHashSet: 继承HashSet,实现了双向链表来使所有集合元素按照插入的顺序排列,插入删除操作时间为O(1)
  • HashMap: 继承AbstractMap和实现Map接口,与HashSet类似,HashMap储存key, value键值对,key集合元素唯一但无序,接受null作为键值,线程不安全
  • HashTable: 继承Dictionary,与HashMap基本等价,但不接受null作为键值,线程同步安全的,速度比HashMap慢
  • TreeMap:继承AbstractMap并实现NavigableMap接口,与TreeSet类似,储存key,value键值对,key集合元素唯一且有序
  • LinkedHashMap:继承HashMap,通过实现双向链表记录key,value键值对的插入顺序,key集合元素唯一
  • ArrayList: 继承AbstractList,实现List接口,相当于一个长度可变的数组,数组元素按照插入的顺序储存,数组元素不唯一,通过get(i)可以直接通过索引访问数组元素,时间为O(1),当删除前面的元素时,后面的元素都需要向前移动,时间为O(n)。
  • Stack:继承Vector类(集合元素可增长的类),作为先进后出栈的实现
  • LinkedList:继承AbstractSequentialList,实现List接口和Deque接口,使用双向链表储存元素,每个元素节点包含前后节点的引用,删除某个元素节点时,只需改变其前后节点的引用即可,时间O(1),通常作为先进先出队列的实例化,也可以实现栈的功能。虽然对中间元素的访问也有get(i)方法,但还是需要对所有节点进行遍历,时间为O(n)
  • Collections,Arrays,Objects:这三个类里封装着static类方法,不用实例化即可调用,比如集合对象的排序操作Collections.sort(),Arrays.toString()等

equals()方法与==区别:

==操作符比较的是两个对象的储存地址,Object类的equals()本身也与==一样是比较的储存地址,但是String等一些类在继承Object之后对equals进行重写,因此两个String对象用equals比较时候是储存值比较,而非储存地址比较。equals只能用于非基本数据类型的变量,基本数据类型用==也是值比较

-

整型: byte(1 byte), short(2 byte), int(4 byte), long(8 byte),
浮点型: loat(4 byte), double(8 byte)
字符型:char(2 byte)
布尔型:boolean

1 byte 字节 = 8 bits 比特,范围-128~127

Reference:

http://docs.oracle.com/javase/7/docs/api/java/util/package-summary.html

http://www.cnblogs.com/dolphin0520/p/3592500.html

猜你喜欢

转载自blog.csdn.net/ppp8300885/article/details/78226994
今日推荐