`
mujun1209
  • 浏览: 20831 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 容器(持有对象)

阅读更多
  java 容器,也是面试当中问的频率比较高的问题。下面贴一张 thinking in java中的集合类库的完备图。

  图中不包括queue的实现。虚线框表示abstract类,这些类可能看起来有些困惑,但是他们只是实现了特定接口的工具。如果你在创建自己的set,那么并不用从Set接口开始并实现其中的全部方法,只需要从AbstractSet继承,然后创建新类必须的的工作。事实上容器类库已经包含了足够多的功能,任何时候都可以满足我们的需求,因此,我们通常可以忽略那些Abstract的类。

   下面介绍下,容器类当中这些接口,类各自的特性。
    Collection:一个独立的元素的序列,这些元素都服从一条或者多条规则。
          List 必须按照插入的顺序保存元素。
          Set 不能有重复的元素。
          Queue 按照排队规则来确定对象的产生的顺序(通常与他们的插入顺序相同,但有些实现是基于优先级的排序,priorityQueue实现的优先级是通过Comparator实现优先级规则)。

通常,Queue只允许在容器的一端插入对象, 在容器的另外一端移除对象。
       Map :一组成对的“键值对”对象,允许通过键查找值。List的get方法允许我们通过数字,即索引,相当于数组的下标来获取对象,map映射表允许我们通过另一个对象来查找某个对象,也被称作“关联数组”,因为他是将某些对象关联在一起。也称“字典”,可以通过像字典中使用的目录来查找对象,Map是强大的编程工具。
       
       List:承诺可以将元素维护在特定的序列中。list在collection的基础上添加了大量的方法。使得可以在list的中间插入和移除元素。
         有两种类型的List :基本的ArrayList(非同步),擅长随机访问元素,但是在List 中插入,移除元素较慢。LInkedList,它是通过代价较低的List中间进行插入和删除操作,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但它的特性集较ArrayList更大。 LinkedList:(非同步)在拥有和List相同的特性外,还添加了可以使用其作为 栈,队列或双端队列的方法。 基于LinekedList 的数据结构是链表,因此也可以用来实现Stack,Queue。
          Stack:(线程安全)实现了 LIFO 堆栈操作的更完整和更一致。stack是继承自Vector。
           Vector:(线程安全)的可增长的对象数组。
       Set :  是不允许重复元素。Set 中最常用的就是测试归属 性。可以很容易的询问某个元素是否存在某个Set中。所以查找就变成了Set中最重要的操作。因此你可以选择HashSet的实
现。它是通过散列函数,对快速查找做了优化。此外 Set接口和Collection接口是完全一样的方法。没有任何额外的功能,实际上Set就是Collection只是行为不同。
        也有两种类型的Set:没有顺序的HashSet(非同步) ,也是上面提到的通过散列函数自己维护期内部的序列,所以让用户看起来是无序的。此外,HashSet的实现其实是一个HashMap的keyset。因此它允许有一个空的值,且不能重复。另外一种就是TreeSet(非同步)是将元素存储在红黑树数据结构中,如果你需要对Set排序就可以选择treeSet,treeSet对元素用自然顺序排序,或者根据创建set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。LInkedHashSet:(非同步)保持了元素的插入顺序的Set,通过散列优化了访问速度。
     
       Map: 已经实现的有类有:HashMap :非同步的。影响其性能 :初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量
自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
         hashTable:同步的。 他的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。
         另外TreeMap:非同步的。排序的Map实现。
         LInkedHashMap:(非同步)保持了元素的插入顺序,也是通过散列函数提供了快速的访问能力。
      Queue:除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。
          PriorityQueue :非同步的优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。优先级队列不允许使用 null 元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。另外一个实现了Queue接口的就是LinkedList .


    上面基本上是常用到的集合类。以及各自的特点。具体的方法,功能,已经实现有兴趣的可以 看一下源代码,你会发现很多有趣的东西。 此外,在java容器里面还有两个接口是一定要

提的:Iterator 和 Comparable。
Iterator :对 collection 进行迭代的迭代器。该接口就三个方法:boolean hasNext(),E next() ,void remove()。
        Comparable:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。而且这个接口就只有唯一一个方法。
   最后是对java 持有对象的一个小结:
1,数组将数字与对象关联起来,它保存明确类型的对象,查询时不需要对结果做转换,也可以是多维的,可以保存基本数据类型。但是数组一旦生成,其容量不能改变。
2,Collection保存单一元素,而map 保存关联的键值对。有了java泛型,也可以指定容器中的存放对象类型,获取的时候就不必转换。容器类可以在你向其中添加更多的数据的时候自动调整其尺寸。容器不能持有基本数据类型,但是自动包装机制会自动的对到容器中的基本类型自动拆装箱。
3,如果要进行大量的随机访问,就是用ArrayList ,如果要经常进行插入删除操作,则应该使用:LinkedList。
4, 除了TreeSet以外的Set都拥有和Collection完全一样的接口。List,Collection存在明显的不同,尽管List 要求的方法都在Collection中。Queue中的方法都是独立的。Map 和Collection接口是重叠的,Map可以使用entrySet方法,values()产生Collection.



分享到:
评论

相关推荐

    java容器(持有对象)

    归纳了java中常用容器包括List、set、map等

    Java笔记整理:持有对象

     JAVA实用类库提供了一套容器类,其中基本的类型是List,Set,Queue和Map。也称为集合类?  可以将任意数量的对象放置到容器中?  JAVA中的容器都是类,也是说JAVA没有直接的关键字支持  泛型  泛型指定了...

    Thinking in java4(中文高清版)-java的'圣经'

    非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 第7章 复用类 第8章 多态 第9章 接口 第10章 内部类 第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java I/O系统 枚举类型 注解 并发 图形化用户界面 目标重点学习章节 5#初始化与清理 8#多态 9#接口 11#持有对象 14#类型信息 15#泛型 17#容器...

    Java并发编程(学习笔记).xmind

    复合操作:执行复合操作期间,要持有锁 锁的作用 加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的共享使用策略 线程封闭:线程封闭的对象只能由一个线程...

    JAVA集合(List,Set,Map)

     · Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。 · 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。 Java 2简化...

    java认证所有课程

    - GetModifiers-返回在执行动作时持有的修饰符。 9.3.2 事件处理器 事件处理器就是一个接收事件、解释事件并处理用户交互的方法。 第四节 JDK1.0的事件模型与JDK1.2的事件模型比较 在JDK1.1中,事件接收...

    thinkinjava源码-Thinking-in-Java:ThinkingInJava源代码和练习题

    持有对象 第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面 水平有限,...

    Java高并发高性能分布式框架从无到有微服务架构设计.doc

    最根本的区别就是,Con currentMap会持有所有添加的对象,直到被显示的移除。而缓存为了限制其内存的使用 ,通常都会配置成可以自动的将对象移除。在某些情况下即使不自动移除对象也是非常 有用的,如LoadingCache它...

    编程思想下篇

    第11章 持有对象 第12章 通过异常处理错误 第13章 字符串 第14章 类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面

    Java NIO缓冲

    它是一个持有数据,并扮演NIO通道端点的对象。缓冲区为数据访问和读写过程提供正式机制。  它是NIO和老版Java I/O的一个主要区别。之前数据是直接从流(stream)中读写的,现在数据可以从缓冲区读写。在NIO中,...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    Util通用工具类(轮子类)

    避免重复造轮子,开发中常用封装...渲染工具类,资源文件相关的操作类,对比两个对象的变化的工具类,Spring的ApplicationContext的持有者,可以用静态方法的方式获取spring容器中的bean,sql语句工具类,高频方法集合类

    spring源代码解析

    其中,首先需要建立的是根上下文,这个上下文持有的对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象。在这个上下文的基础上,和web MVC相关还会有一个上下文来保存控制器之类的MVC对象,这样就...

    struts2工作原理及拦截器和过滤器

    ActionProxy 为 Action 的代理对象。 5. ActionProxy 通过 ConfigurationManager 询问框架的配置文件,找到需要调用的 Action 类。然后,ActionProxy 创建一个 ActionInvocation 的实例。ActionInvocation 在 ...

    Spring.net框架

    SayHello类持有一个对EnHelloGenerator的引用,并负责将生成出来的问候字符串打印出来。 using System; namespace IocInCSharp { public class SayHello { private EnHelloGenerator _helloGen; public ...

Global site tag (gtag.js) - Google Analytics