集合接口体系:
iterable
---->collection
---->list
---->set
---->sortedset
---->navigableset(6.0)
---->queue
---->deque
map
---->sortedmap
---->navigablemap(6.0)
集合类体系:
collection
---->abstractcollection
---->abstractlist(implements list)
---->abstractsequentiallist
---->linkedlist
---->arraylist
---->abstractqueue(implements queue)
---->priorityqueue
---->abstractset(implements set)
---->enumset
---->hashset
---->treeset
---->arraydeque(implements deque)
map
---->abstractmap
---->enummap
---->hashmap
---->identityhashmap
---->treemap
---->weakhashmap
1、iterable里面只有一个方法iterator<t> iterator(),该方法返回集合内部元素的叠代.在abstractcollection 中就可以看出这种设计的好处了,在abstractcollection中有两个未实现的方法iterator()跟size(),还有一个特殊的方法是add(e e),总会抛出unsupportedoperationexception。
其他collection接口的方法实现均可以通过前两个方法来实现。当需要一个不可修改的集合时,只需要在子类实现iterator()与size()方法即可,如果还想可以修改内部的元素,在子类还需实现add(e e)方法。
2、与abstractcollection类似,abstractlist也最大程度实现了list接口的方法,内部类里面还默认实现了一个iterator,留下了add(int,e),remove(int i),set(int,e),get(int i),size()方法给子类实现。abstractqueue、abstractset同理。
3、map与collection是平行的,并没有相互继承,从技术上来说可以把(key,value)作为一个entity看待,从而让map继承collection,但这样做会大大增加复杂度甚至可能导致接口的污染。map属于集合,但不继承collection,这种以引用代替继承的做法值得推荐,也告诉了我们一个道理:不要为了继承而继承!
4、list与set的区别是set中的元素不允许重复,而map中的key默认就是不允许重复的,事实上jdk中的set就是通过引用map来实现的,set元素作为map的key,value是一个默认的object。
5、arraydeque是一个双向队列,内部是一个由一个数组和两个指针组成的循环数组组成。
6、arraylist里面也是一个数组,在大学数据结构中也学过,由于位置是连续的,get(i)这种随机操作速度快,而remove(i)因为删除之后要把i之后的元素向前移,速度慢。
7、在jdk1.0时候有一个接口dictionary现在已经被map代替了,它的实现类hashtable也被hashmap代替了,不过hashtable的每个方法都是有synchronized关键字的。
8、enummap以enum作为key,由于enum内部维护了枚举成员的位置(从0开始),所以get(key)类似的操作定位相当快,比hashmap要快。
9、enumset是一个抽象类,提供了n个静态方法来创建具有多个enum的set。64个以内元素个数时用regularenumset,64个以上时用jumboenumset
10、hashmap,这个最经常使用的类,很多人还不了解其内部实现。其实他内部也是维护了一个entity数组,把key做hash后再经过余位等运算便可以找到其在数组中的位置。当元素个数 > 加载因子*容量 时会将容量增加一倍,如果hashmap较大,复制操作也颇为耗时,所以对于元素大小范围确定的hashmap,在new时就提供其初始容量是一个明智的选择。
11、hashset,内部其实就维护着一个hashset,linkedhashset内部维护的是linkedhashmap。
12、identityhashmap,把equal换成了=,内部的rehash算法颇复杂。
13、iterator里面三个方法hasnext(),next(),remove(),代替了enumeration的很长的方法,listiterator是一个可以双向移动的iterator
14、linkedhashmap,链式结构的hashmap,里面是一个双向链表,做put或get操作时先把已有的元素删除,再把新元素加到头里。这样近期最活跃的元素就处在顶端了,所以能用来做lru实现。
15、linkedlist,list的链式实现,它的特性决定能作为堆栈、队列、双端队列使用。
16 navigableset接口扩展了sortedset & navigablemap接口扩展了sortedmap,提供了更细致的“子集合”方法。
17、stack直接继承自废弃类vector,vector里每一个方法均为sychronized的,建议继承arraylist实现一个非同步的stack以得到在单线程下效率更高的堆栈实现。
18、treemap与treeset里面维护的是一个堆数据结构,大顶堆或小顶堆实现有序结构。
19、weakhashmap,如果key为软引用,那么其value是会丢失的,gc会自动回收。
20、collections里面包含n个static方法可以对collection操作(包括map)或查询(如二分查询etc.),里面有或干个包装器如synchronizedmap返回map的包装器,返回同步实现。
21、其实数组是一个最原始的集合,arrays类提供了n个static方法可以用数组进行操作或查询。
iterable
---->collection
---->list
---->set
---->sortedset
---->navigableset(6.0)
---->queue
---->deque
map
---->sortedmap
---->navigablemap(6.0)
集合类体系:
collection
---->abstractcollection
---->abstractlist(implements list)
---->abstractsequentiallist
---->linkedlist
---->arraylist
---->abstractqueue(implements queue)
---->priorityqueue
---->abstractset(implements set)
---->enumset
---->hashset
---->treeset
---->arraydeque(implements deque)
map
---->abstractmap
---->enummap
---->hashmap
---->identityhashmap
---->treemap
---->weakhashmap
1、iterable里面只有一个方法iterator<t> iterator(),该方法返回集合内部元素的叠代.在abstractcollection 中就可以看出这种设计的好处了,在abstractcollection中有两个未实现的方法iterator()跟size(),还有一个特殊的方法是add(e e),总会抛出unsupportedoperationexception。
其他collection接口的方法实现均可以通过前两个方法来实现。当需要一个不可修改的集合时,只需要在子类实现iterator()与size()方法即可,如果还想可以修改内部的元素,在子类还需实现add(e e)方法。
2、与abstractcollection类似,abstractlist也最大程度实现了list接口的方法,内部类里面还默认实现了一个iterator,留下了add(int,e),remove(int i),set(int,e),get(int i),size()方法给子类实现。abstractqueue、abstractset同理。
3、map与collection是平行的,并没有相互继承,从技术上来说可以把(key,value)作为一个entity看待,从而让map继承collection,但这样做会大大增加复杂度甚至可能导致接口的污染。map属于集合,但不继承collection,这种以引用代替继承的做法值得推荐,也告诉了我们一个道理:不要为了继承而继承!
4、list与set的区别是set中的元素不允许重复,而map中的key默认就是不允许重复的,事实上jdk中的set就是通过引用map来实现的,set元素作为map的key,value是一个默认的object。
5、arraydeque是一个双向队列,内部是一个由一个数组和两个指针组成的循环数组组成。
6、arraylist里面也是一个数组,在大学数据结构中也学过,由于位置是连续的,get(i)这种随机操作速度快,而remove(i)因为删除之后要把i之后的元素向前移,速度慢。
7、在jdk1.0时候有一个接口dictionary现在已经被map代替了,它的实现类hashtable也被hashmap代替了,不过hashtable的每个方法都是有synchronized关键字的。
8、enummap以enum作为key,由于enum内部维护了枚举成员的位置(从0开始),所以get(key)类似的操作定位相当快,比hashmap要快。
9、enumset是一个抽象类,提供了n个静态方法来创建具有多个enum的set。64个以内元素个数时用regularenumset,64个以上时用jumboenumset
10、hashmap,这个最经常使用的类,很多人还不了解其内部实现。其实他内部也是维护了一个entity数组,把key做hash后再经过余位等运算便可以找到其在数组中的位置。当元素个数 > 加载因子*容量 时会将容量增加一倍,如果hashmap较大,复制操作也颇为耗时,所以对于元素大小范围确定的hashmap,在new时就提供其初始容量是一个明智的选择。
11、hashset,内部其实就维护着一个hashset,linkedhashset内部维护的是linkedhashmap。
12、identityhashmap,把equal换成了=,内部的rehash算法颇复杂。
13、iterator里面三个方法hasnext(),next(),remove(),代替了enumeration的很长的方法,listiterator是一个可以双向移动的iterator
14、linkedhashmap,链式结构的hashmap,里面是一个双向链表,做put或get操作时先把已有的元素删除,再把新元素加到头里。这样近期最活跃的元素就处在顶端了,所以能用来做lru实现。
15、linkedlist,list的链式实现,它的特性决定能作为堆栈、队列、双端队列使用。
16 navigableset接口扩展了sortedset & navigablemap接口扩展了sortedmap,提供了更细致的“子集合”方法。
17、stack直接继承自废弃类vector,vector里每一个方法均为sychronized的,建议继承arraylist实现一个非同步的stack以得到在单线程下效率更高的堆栈实现。
18、treemap与treeset里面维护的是一个堆数据结构,大顶堆或小顶堆实现有序结构。
19、weakhashmap,如果key为软引用,那么其value是会丢失的,gc会自动回收。
20、collections里面包含n个static方法可以对collection操作(包括map)或查询(如二分查询etc.),里面有或干个包装器如synchronizedmap返回map的包装器,返回同步实现。
21、其实数组是一个最原始的集合,arrays类提供了n个static方法可以用数组进行操作或查询。