`
java_mzd
  • 浏览: 579870 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

为什么要使用集合框架?

阅读更多


  题序:很多时候,我们专心研究一个东西的时候,往往忘记了我们最初的目的是什么。

        曾经研究过那么久的Java集合框架,为了搞清里面的细节,甚至都跑去重新买了一本数据结构,终于知道了线性表,知道了树,知道了查找表。也自己动手实现了ArrayListLinkedListHashMap等。

        今天在公交车上,突然想到“我们为什么要使用Java集合框架呢?”竟然一时语塞,半天想不起来,也说不个所以然呢。顿时悲从中来啊。还是决定再次好好复习一把,现总结如下:



    PS.还是那句老话,如果这些问题您都能轻松解答,没必要再浪费时间看下去了。

  • Question one:我们为什么要使用集合框架?
  • Question two:关于ArrayList Vector  HashMapHashTable)PS
  • Question three:总体把握,集合框架的继承图
  • Question fourset map的关系(见李兴华书)
  • Question five:关于set(底层实现,关于TreeSet,关于排序,关于比较对象相等)
  • Question six 已经存在了那么多的动态结构,为什么需要hash表?
  • Question sevenTreeMap 底层实现


 

Question One:我们为什么使用集合框架?

  大家还记得我们为什么要使用数组嘛?

  当我们需要保持一组一样(类型相同)的元素的时候,我们应该使用一个容器来保存,数组就是这样一个容器。

  那么,数组的缺点是什么呢?

  数组一旦定义,长度将不能再变化。

  然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。

  而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。我们将数据结构在Java中实现,于是就有了我们的集合框架。

 

Question Two: ListVector,HashMap HashTable 的区别在哪里呢?

前者都是在JDK1.2后推出的,在前者中,因为采用异步处理方式,性能更高。

(其实就是删掉了后者中操作数据{add ,remove}时的线程同步锁,这样,效率更高了,但是却不再是线程安全的了,要线程安全,必须用户在程序中使用时自己控制。)


 

Question Three:集合框架继承图

本来想自己画个简图的,结果悲催的Rational Rose一直在抽风,也没时间去弄那个了。就网上Down了一个,暂且用着吧


                                       
 

从这个图中,我们可以发现:Collection 接口包括List和Set两个子接口(其实还有Queue和Sorted两个子接口)

另外,也验证了我们前面说的,ArrayCollection都是用来保存数据的容器。


Question FourSet Map 有什么关系?

Question Three的继承图中,我们很明显的发现:Map虽然不像Set那样属 于 Collection,但是SetMap的继承图是如此的相似。那么,他们之间到底有什么样的 关系呢?

从逻辑上来说:首先,如果我们只考察Map中的key,那么显然,这个key的集合就是一 set:不能重复,无序。(Map中有keyset()的方法,能直接得到keyset)另外一 个层面,如果我们 Map中的keyvalue当做一个整体,那么,显然,这个时候 Map其实就是一个Set(在Map的实现中,都是通过一个内部类来将keyvalue当做 一个整体entity),

从代码角度本身角度来看,无论是HashSet还是TreeSet其实使用的都是对应 Tree来实现的,我们用一个默认的Object,这样就可以存了。

而事实上Set的底层实现中,我们也可以发现,都是用对应的Map来实现的,只是,在每次存key-value 对的时候,都默认给了一个Object 类作为Value的默认值,

  

Question five:关于set(底层实现,关于TreeSet,关于排序,关于比较对象相等)

我们知道,Set是无序的,同时又是不能重复的,那么,这种不能重复性,是如何保证的呢? 其实这个问题问的还是不到位,Question Four已经说了,底层是由Map实现的,那么都是由Map来实现的。

为了唯一性,重点是能识别相同的元素(如何判断相等)

Java中,=号,表示内存地址相等,即是指向堆内存的同一引用,那么此时,显然两个元素是相等的。

当不是指向堆内存的同一引用时。我们就需要重写Object类的equals()方法了。在此,我们判断,如果我们需要比较的各个属性相等的话,那么则可认为这两个对象相等(关于属性相等的比较与此类似)

 

Question six 已经存在了那么多的动态结构,为什么需要Hash表?

其实这个问题其实问的不恰当,应该是,有了诸如顺序表和有序表这样的静态表,诸如二叉排序树 平衡二叉树这样的动态表,为什么还需要Hash表呢?

因为记录在表中的位置和它的关键字之间不存在一个确定的关系。查找的过程给定值依次和关键字集合中各个关键字进行比较查找的效率取决于和给定值进行比较的关键字个数


Question Seven: TreeMap 底层实现

TreeMap 底层由红黑树(Red-Black tree)实现。因为此部分内容包括算法分析,具体代码实现以及性能分析,内容比较多,所以本部分内容稍后专门用一个日志来推出。(形式类似HashMap那篇日志)

 

  • 大小: 4.4 KB
19
5
分享到:
评论
7 楼 scholers 2011-05-09  
重写了equals,那么必须要重写hashcode
否则在set,map中会出错,
这个也是一个规定!
6 楼 hastune 2011-04-22  
s929498110 写道
真的啊
打开JDK下面的src里面的源码看看、 一切就豁然开朗了
这些集合都有自己的实现机制、 了解了实现机制,他们的优缺点就一目了然了
没必要从别人对这些东西的看法理解中寻找属于自己的看法理解

源码看起来很容易的、 主要是其中有的算法需要琢磨琢磨


个人觉得需要琢磨的是怎么用好这些就行。算法的话,大可不必了。
源码有些地方也不太简单。原作者的一些思路还是可以琢磨一下吧。
如果需要自己写个容器的话,还是得想想算法吧。
5 楼 s929498110 2011-04-22  
真的啊
打开JDK下面的src里面的源码看看、 一切就豁然开朗了
这些集合都有自己的实现机制、 了解了实现机制,他们的优缺点就一目了然了
没必要从别人对这些东西的看法理解中寻找属于自己的看法理解

源码看起来很容易的、 主要是其中有的算法需要琢磨琢磨
4 楼 yaoohfox 2011-04-21  
写的不错。
3 楼 Durian 2011-04-19  
看文章,lz不是计算机专业
2 楼 java_mzd 2011-04-14  
悲剧了 写道
看来楼主没用好集合框架,看看源代码就知道了,及时它部提供,我们自己也要写,他提供了那就正好用他提供的,不用自己山寨写了


  呵呵,我水平不高,不会用。
也就明白明白道理,研究研究源码,自己写一写,检验自己懂不懂罢了。
高人面前,不敢称懂。
1 楼 悲剧了 2011-04-14  
看来楼主没用好集合框架,看看源代码就知道了,及时它部提供,我们自己也要写,他提供了那就正好用他提供的,不用自己山寨写了

相关推荐

    Java集合框架使用总结

    所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection Framework)。 Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了。这样...

    java 集合框架的原理及其使用

    Java集合框架 系统的介绍java集合框架的应用

    Java集合框架.ppt

    集合是将多个元素组成一个单元的...Java集合框架,为我们提供了一套性能优良、使用方便的接口和类,我们不必再重新发明轮子,只需学会如何使用它们,就可以处理实际应用中出现的问题了Java集合框架位于java.util包中

    java集合框架笔记

    List set ArraryList Map java集合框架笔记 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用

    集合框架的使用方法

    NULL 博文链接:https://532740149.iteye.com/blog/1827217

    java集合框架

    集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向对象的语言,接口通常形成一个层次。 实现(类):是集合...

    【Java】Java集合框架思维导图。

    xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...

    数据结构和Java集合框架(英文版)

    学生通过学习方法描述和应用,可以逐步理解并有效地使用数据结构,还可以了解这些数据结构的多种实现,包括在java集合框架中提供的一些实现。.  本书内容丰富,且在每章章尾提供编程项目,以帮助学生提高实践能力。...

    Java集合框架.pdf

    4、线程安全:Java集合框架中的某些数据结构和算法是线程安全的,可以在多线程环境中使用。 Java集合框架中的接口 Java集合框架中定义了一些接口,这些接口是实现各种数据结构的基础。 下面是Java集合框架中的一些...

    基于JAVA集合框架及实用类实现的超市会员管理系统

    基于JAVA集合框架及实用类实现的超市会员管理系统,包含:开卡、积分累计、积分兑换、查询剩余积分、修改密码等功能。

    数据结构和Java集合框架 英文版

    学生通过学习方法描述和应用,可以逐步理解并有效地使用数据结构,还可以了解这些数据结构的多种实现,包括在Java集合框架中提供的一些实现。 本书内容非常丰富,且在每章章尾提供编程项目,以帮助学生提高实践能力...

    JAVA集合框架

    ArrayList与LinkedList类的区别; HashMap与LinkedHashMap的区别 迭代器Iterator的使用

    集合框架的使用,可以很好的教你使用集合的框架!

    集合框架的使用和应用!可以用这个资源帮你学习集合的框架!

    java集合框架的使用。集合的运算

    原创代码,适合javaSE新手参考,也可作为数据结构课程设计(自己添加功能即可),可参考java版数据结构(叶核亚版就可以),了解java集合框架的使用

    使用Java集合框架实现一个简单的购物车.txt

    这段代码实现了一个简单的购物车类ShoppingCart,其中使用了Java的集合框架来管理商品和数量。在类的构造方法中,创建了一个HashMap对象来存储购物车中的商品和对应的数量。在addItem()方法中,将传入的商品和数量...

    Java高级程序设计:第7章-集合框架.pptx

    掌握Java集合框架中的三大类集合的特征和适用场合 掌握ArrayList类的使用 掌握HashMap类的使用 了解HashSet类的使用 掌握Collections类的使用 了解集合框架中的其它集合类 集合框架(Collection Framework) java.util...

    Java 集合方面的面试题

    Java 中集合框架的主要接口是什么? ArrayList 和 LinkedList 有什么区别? HashSet 和 TreeSet 有什么区别? HashMap 和 TreeMap 有什么区别? 什么是迭代器?如何使用它来遍历集合? 什么是 fail-fast 机制? 如何...

    精通java集合框架--List,Set..

    既然您已经具备了一些集的理论,您应该能够更轻松的理解“集合框架”。 “集合框架”由一组用来操作对象的接口组成。不同接口描述不同类型的组。 在很大程度上,一旦您理解了接口,您就理解了框架。 虽然您总要创建...

    Java基础笔记之集合框架和泛型

    详细的介绍了集合框架的用法,及其语法规则,剖析了使用的使用注意事项,帮助更牢靠的掌握集合框架的知识及泛型内容。谢谢

Global site tag (gtag.js) - Google Analytics