`
joyocaowei
  • 浏览: 32781 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java容器的整理(version0.1)

 
阅读更多

这方面的内容是根据thinking in java这本书为基本参考资料的,首先看一下java中的Container的简化图:


可能有人会做thinking in java(4th)的练习,那么参考答案在这里:http://greggordon.org/java/tij4/solutions.htm 感谢这位大哥的无私贡献……

 

1、Comparable与Comparator的区别:

 

public interface Comparable<T>此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较 器。

public interface Comparator<T>强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给
sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控
制某些数据结构(如有序set-TreeSet或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

 

使用Comparable有其局限性,对于一个给定的类,只能实现这个接口一次。如果在一个集合中需要按照编号对部件进行排序,在另一个集合中需要对此种部件按照另一种属性(比如按照描述信息)排序,而这个类的创建者并没有实现Comparable接口,那么在这种情况下,可以通过将Comparator对象传递给TreeSet构造器来告诉树集使用不同的比较方法。

 

SortedSet<Item> sortByDescription = new TreeSet<Item>(new 
Comparator<Item>()
{
	public int compare(Item a, Item b){
	String descA = a.getDescription();
	String descB = b.getDescription();
	return descA.compareTo(descB);
}});
 

参考:http://zhanghu198901.iteye.com/blog/1575164 (看评论思考)

API: http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

        http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

 

2、Set和存储顺序

 


Set (interface)
Each element that you add to the Set must be unique; otherwise, the Set doesn’t add the duplicate element. Elements added to a Set must at least define equals( ) to establish object uniqueness. Set has exactly the same interface as Collection. The Set interface does not guarantee that it will maintain its elements in any particular order.
HashSet*
For Sets where fast lookup time is important. Elements must also define hashCode( ).
TreeSet
An ordered Set backed by a tree. This way, you can extract an ordered sequence from a Set. Elements must also implement the Comparable interface.
LinkedHashSet
Has the lookup speed of a HashSet, but internally maintains the order in which you add the elements (the insertion order) using a linked list. Thus, when you iterate through the Set, the results appear in insertion order. Elements must also define hashCode( ).

 


Set (interface) 存入Set的每个元素都必须是唯一的,因为Set的不保存重复元素。加入Set的元素必须定义equals()方法一确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet* 为快速查找而设计的Set。存入的元素必须实现hashcode()方法,至多包含一个null元素。
TreeSet 保持次序的Set,底层为树结构。使用它可以从Set中提取有序的序列,元素必须实现Comparable接口,它是SortedSet的唯一实现。
LinkedHashSet

具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。当遍历Set时,结果会按照插入的顺序的显示,元素也必须定义hashcode()方法。

 

 

散列表(hash table):可以快速的查找对象,在java中散列表用链表数组实现。每个列表被称为桶(bucket),要想查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的索引。,如某个对象的散列码为76268,并且有128个桶,对象应该保存在地108号桶中。有时候会遇到桶被占满的情况,这也是不可避免的,这种现象被称为散列冲突(hash collision)。散列表可以实现几个重要的数据结构,其中最简单的就是set类型(HashSet)。

 

3、Queue

队列(Queue)是一个典型的先进先出的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的的顺序与取出的顺序一致。队列常被当做一种可靠的将对象从程序的某个区域传输到另一个区域的途径。队列在并发编程中特别重要,因为他们可以安全的将对象从一个任务传输给另一个任务。

 

抛出异常 返回特殊值
插入 add(e) offer(e)
移除 remove() poll()
检查 element() peek()

 

插入操作的后一种形式(返回特殊值)是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。具体内容可以查看Queue的API: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

 

LinkedList提供了方法以支持队列的行为,并且实现了Queue接口,因此LinkedList可以作为Queue的一种实现。你可以将LinkedList向上转型为Queue以使用。

LinkedList本身还具有实现栈的所有功能方法,因此可以将LinkedList作为栈使用(“栈”通产是指后进先出的容器,你可以类比的事物是装有弹簧的储存器中的自助餐托盘,最后装入的肯定是最先拿出来使用的 )。

 

 

4、理解Map

HashMap* Map基于散列表的实现(它取代了Hashtable)。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器的性能。如果要用自己的类作为HashMap的键,那么要同时覆盖equals()方法和hashcode()方法。
LinkedHashMap 类似于HashMap,但是迭代遍历它时,取得”键值对“的顺序是它的插入顺序,或者是最近最少使用(LRU-Least-recently-used)的次序。比HashMap慢一点,但是迭代遍历时反而更快,因为它使用链表维护内部次序。
TreeMap 基于红黑树的实现,查看”键“或者”键值对“时,他们会被排序(次序由Comparable或者Comparator决定)。TreeMap的特点在于,所得到的结果是经过排序的。

 

对Map中使用键的要求与对Set中使用键的要求一致。任何键都必须有一个equals()方法;如果键被用于散列Map,那么它需要恰当的hashcode()方法;如果键被用于TreeMap,那么它必须实现Comparable。再次强调,默认的Object.equals()只是比较对象的地址,如果要使用自己的类作为HashMap的键没那么必须同时重载hashcode()和equals()。

使用散列的目的在于:想使用一个对象来查找另一个对象。

(未完待续)

 

  • 大小: 11.4 KB
分享到:
评论

相关推荐

    android 数据库操作代码生成器(version 0.1)-32位

    "android 数据库操作代码生成器(version 0.1)-32位" 是一个专为提高开发效率而设计的工具,它能够自动生成数据库操作的相关代码,帮助开发者免去手动编写基础代码的繁琐过程。 首先,我们要理解Android中的SQLite...

    《Linux0.11源码分析》Version0.1潘晓雷著

    《Linux0.11源码分析》这本书是潘晓雷所著,专注于引导读者深入理解Linux内核的运作机制。Linux作为开源操作系统的核心,其源码对于任何希望深入理解操作系统原理或者想要进行系统级编程的开发者来说都是宝贵的资源...

    android获取XML中使用的控件(Version 0.1)-32位

    "获取XML中使用的控件(Version 0.1)-32位"是一个专为32位系统设计的代码生成器,它能够帮助开发者快速地从XML布局文件中提取并自动生成对应的Java代码,从而减少手动编码的时间和错误。 XML布局文件是Android应用...

    android ViewPager引导页(Version 0.1)-32位

    在这个"ViewPager引导页(Version 0.1)-32位"项目中,我们看到一个工具或代码生成器,旨在帮助开发者快速生成引导页的基础代码,提高开发效率。 ViewPager的核心概念和特性包括: 1. **适配器(Adapter)**:...

    商业源码-编程源码-TCG CMS Version 0.1.19源码.zip

    TCG CMS Version 0.1.19是一个商业级别的内容管理系统(CMS)源代码,它提供了网站建设和管理的全套解决方案。作为一个重要的IT知识点,CMS是Content Management System的缩写,其核心功能在于帮助用户无需深入理解...

    WEB开发Flash头像上传ZwyUpload_Version0.1插件的使用

    在WEB开发中,Flash头像上传插件ZwyUpload_Version0.1是一个常见的工具,它为用户提供了方便快捷的头像上传功能。该插件主要适用于那些需要用户自定义头像或者图片上传的网站,例如社交平台、论坛或个人博客等。通过...

    Android常用控件(Version 0.1)-32位代码生成器

    "Android常用控件(Version 0.1)-32位代码生成器" 提供了一种高效的方法,帮助开发者快速生成常见的UI组件代码,从而提高开发速度,降低出错概率。这款工具特别适合初学者和希望提升开发效率的专业人士。 首先,我们...

    ViewPager引导页(Version 0.1)-64位

    在"ViewPager引导页(Version 0.1)-64位"这个压缩包中,我们可以推测它提供了一种自动化生成ViewPager引导页的方法,以提高开发效率,避免手动编写大量的基础代码。 在Android Studio中,虽然可以通过自定义布局和...

    android Fragment底部菜单代码生成器(Version 0.1)-64位

    这个"android Fragment底部菜单代码生成器(Version 0.1)-64位"工具正是为了简化这一过程而设计的,它可以帮助开发者快速生成与底部菜单配合使用的Fragment代码,从而提高开发效率。 首先,我们要理解Fragment的基本...

    Fragment底部菜单代码生成器(Version 0.1)-32位

    Fragment底部菜单代码生成器(Version 0.1)-32位是一个专为Android开发者设计的工具,旨在提高开发效率,特别是在构建应用时涉及到底部导航菜单的场景。在Android应用开发中,底部菜单(Bottom Navigation)通常包含...

    Android常用控件(Version 0.1)-64位

    这个名为"Android常用控件(Version 0.1)-64位"的压缩包很可能是为了帮助开发者提高效率,避免手动编写重复的基础代码而设计的工具。以下是关于Android常用控件以及使用此类工具的一些详细知识点: 1. **Android控件...

    FastReport.Net Version 0.1 (alpha)

    FastReport.Net是一款功能齐全的报表分析解决方案。它适用于那些使用Microsoft Visual Studio 2005与2008或其它与.NET Framework 2.0及更高版本兼容的开发工具的开发人员。

    html_mytest_code_and_note_version0.1

    标题“html_mytest_code_and_note_version0.1”暗示了这是一个关于HTML的学习资源,可能包含了一些代码示例和笔记,版本号为0.1,表示这可能是早期版本或初步整理的资料。描述中提到的“博文链接:...

    获取XML中使用的控件(Version 0.1)-64位

    "获取XML中使用的控件(Version 0.1)-64位"可能是一个专门设计用于解析和分析XML文档的工具,特别适用于64位操作系统。这个工具可能包含了以下功能: 1. **XML解析**:工具能够自动读取XML文件,解析其结构,识别出...

    Micro Payment Transfer Protocol (MPTP) Version 0.1

    移动微支付协议(MPTP,Micro Payment Transfer Protocol)是一种专为小额交易设计的支付协议,版本0.1。该协议旨在解决互联网上小额支付的处理问题,适用于那些需要即时响应且金额微小的交互式应用。MPTP的设计考虑...

    深入浅出物联网操作系统 Mbed Version 0.1.pdf

    2014 年,ARM 宣布了针对物联网低功耗设备的操作系统 Mbed OS。mbed OS 部分开源,其余部分控制在 ARM 手中,理由是为了确保操作系统不会碎片化。ARM 声称 Mbed OS 只需要 256kb 内存,它希望开发商能使用 Mbed 开发...

    ape.public.version_0.1.0.13beta-cxlrb汉化版

    《ape.public.version_0.1.0.13beta-cxlrb汉化版》是一款针对公众开放的软件版本,其核心在于提供了对原始英文版本的汉化支持,以方便中文用户更加流畅地使用。该版本的命名方式揭示了几个关键信息,包括软件名、...

    Java Servlet Specification__ Version 2.3

    Java Servlet Specification Version 2.3是开发基于Java的Web应用程序的关键规范,它定义了Servlet和Servlet容器的行为,以及它们如何协同工作来处理Web请求和生成动态内容。Servlet技术的灵活性和强大的功能使其...

    Introduction+to+Java Comprehensive+Version+(11th+Edition).zip

    《Introduction to Java Comprehensive Version (11th Edition)》是一本深度涵盖Java编程语言的综合性教程,特别适合初学者和有经验的程序员进一步提升Java技能。第11版更新至了最新的Java版本,提供了全面的Java...

    Java 17,JDK17 version "17.0.2"

    Java 17是一款十分专业的编程...java version "17.0.2" 2022-01-18 LTS Java(TM) SE Runtime Environment (build 17.0.2+8-LTS-86) Java HotSpot(TM) 64-Bit Server VM (build 17.0.2+8-LTS-86, mixed mode, sharing)

Global site tag (gtag.js) - Google Analytics