java集合总结

SmallMouseWu 2017-12-30 08:24:11
首先是继承了Collection接口的两个接口,分别是List和Set。由于分析了下部分源码,所以总结一下:
List接口下有两个常用的类,分别是ArrayList和LinkedList。
对于ArrayList来说,其底层是使用Object类型的数组进行维护的,元素是可以重复的,个人认为重要的地方是有这几个:
第一个是数组扩容的实现,分几种情况,首先默认的数组的大小是10。(1)如果添加的元素不超过10个的话是不需要扩容的;(2)如果已经有了10个元素,添加第11个元素是扩容5个,而不是1个,实现的算法是这样的
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
也就是说,数组的空间扩大为原来的1.5倍(3)如果一次添加的个数超过了原个数的1.5倍,即扩容之后还是不足,比如使用了
list.addAll(Collection 对象);则会以当前元素的总个数为容量的大小,也就是数组的length=size;
第二个是添加元素时数组中元素位置的移动,底层是使用System.arraycopy();这个函数来实现的,这跟我们自己用for循环写应该是一样的。
对于LinkedList来说,其底层是使用双向链表来进行维护的,元素是可以重复的,对于LinkedList来说,因为双向链表的使用,所以他有自己的一些特性,比如说头插法和尾插法就可以实现stack和queue的功能,通过addFirst,addLast,removeLast等等方法来实现栈和队列的一些功能。LinkedList中的很多方法虽然方法名称不一样,但是实现的功能完全是一样的,其底层调用的都是同一个函数。比如peek和getFirst等等。

Set接口下常用的两个类是HashSet和TreeSet,两个类的共同点是元素不能重复,对于HashSet来说,其底层是用HashMap来实现的,利用了hash Map的键是不能重复的,底层的HashMap的key用来存值,而value始终是一个final的常量,默认的初始容量是16,装载因子是0.75(也就是说如果元素的个数已经超过了75%,那么将进行二次散列)。对于TreeSet来说,他是实现了SortedSet接口,让元素之间有序,默认的排序方式使用自然排序,如果进行其他的排序需要使用Comparator接口。

另外的Map接口下的两个常用的类是HashMap和TreeMap,HashMap的底层是用Entry对象来进行维护的,当向map中存入键值对的时候,底层会将每对都封装成Entry对象,所有说在遍历HashMap的时候要先获得entrySet集合,通过map.entrySet()方法,然后进行遍历。对于TreeMap来说,其元素是有序的,默认是按键进行自然排序,跟set一样,如果想按其他方式排序需要实现Comparator这个接口。

List,Set,Map的比较:
List和Set是Collection的子接口,而Map不是;
List元素是可重复的,Set和Map不能重复,当add新值的时候,如果值重复的,set的做法是拒绝加入,而map的做法是覆盖
key值相等的键值对。
这三个都属于集合,都实现了Iterator接口,所以他们的遍历都可以使用Iterator对象,对于List来说有一个ListIterator,它实现了遍历顺序可以逆序的方法,比如有previous方法等等,另外,list有get方法,所以对于list的遍历完全可以是普通的for循环,而对于set和map来说是不能这么遍历的,当然遍历是可以使用foreach循环的,但是一般情况下set和map的遍历一定要使用iterator对象进行。for(Iterator iter = set.iterator();iter.hasNext();){iter.next()}进行取值等等。
对于ArrayList和LinkedList来说,使用的时候是有区别的,当需要进行的增删改比较多的时候建议用LinkedList,因为效率比较高,而对于普通的取值建议用ArrayList。

以上论述纯属个人理解,如果有误请及时改正,不胜感激!!
...全文
512 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chineselikan 2017-12-31
  • 打赏
  • 举报
回复
正需要,看看不错。支持一下
oyljerry 2017-12-31
  • 打赏
  • 举报
回复
感谢分享。
自由自在_Yu 2017-12-31
  • 打赏
  • 举报
回复
总结的真好,赞一个

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧