zoukankan      html  css  js  c++  java
  • J2SE总结(一)-------容器

    最近大家都在讨论容器以及如何在项目中去实际的应用它,由于之前对容器没有什么概念,所以把J2SE里面讲的容器的一些基础知识看了一下,总结一下最基本的东西。

    围绕整章最核心的就属下面这张图了吧。

    一、概念理解

    为什么要有容器这个概念:刚接触,在我理解:在编程时,经常会遇到具有重复功能或属性的对象时,经常会大量的重复工作导致代码冗余,同时,随着用户的需求不断变更,改动的次数就不不断增加,如何避免大量的改动,同时减少模块之间的耦合度(如aop池),我们定义容器,凡是装在容器内部的对象全部具有容器的一切属性和方法,这便是容器的作用。

    容器:可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。

    通过上图可知,在JAVA容器中,有两个分支,collection和map,其中collection是一个独立元素的序列,list和set分别是实现collection接口的两种不同形式的容器,list运行对象重复且有序,而set容器的对象是无序且不能重复的。

    map是以键值对形式来表现的对象之间的映射关系类型的容器。

    在编码中,如果定义了一个容器,容器中具有一些属性和方法,那么向这个容器中添加一个对象,这个对象同时也具有了这个容器的属性和方法。

    例如:collection接口中所定义的方法,如果在collection容器中加入了一个普通的string或者其他对象,那么这个l对象也会自动拥有collection的所有方法。

    二、list和set

    在list接口中实现它的有linkedlist和arraylist

    1/arraylist来源于数组,只因数组必须制定固定的长度,且长度不可变,因此用arraylist来补充它的缺陷,arraylist拥有list的特点,可以根据对象的大小来成倍的扩充内存空间。linkedlist内部是按照链表来实现的。

    2、set

    实现set接口的只有一种就是hashset,开始以为是哈希表,后来才知道弄错了,它类似于数学里面的集合,无序且不重复。即相同的元素不会被加入集合中。

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
     
    1. public static void main(string args[]){  
    2.           Set s=new HashSet();  
    3.           s.add("hello");  
    4.            s.add("hello");  
    5.            s.add("world");  
    6.           System.out.print(s);  
    7. }  
    8. //输出结果[hello,world],重复的记录只会加入一次  

    小结:容器正如它的名字一样,用来承载大量的数据。同时可以减少很多重复的代码,在一定技术支持下,可以减少模块和模块之间的耦合度。运用容器可以给开发人员带来很多意想不到的效果。还是要多多深入的探讨和实践才行。

    1.对 List 的选择

     ArrayList 和LinkedList 都实现了List 接口,Vector 也是,不过已经废弃了。首选 ArrayList。

     

    2 ,对 Set 的选择,

     

    可以选择 TreeSet、HashSet,或者LinkedHashSet。HashSet 的性能总是比TreeSet 好(特别是最常用的添加和查询元素操作)。TreeSet存在的唯一原因是,它可以维持元素的排序状态。所以,只有当你需要一个排好序的Set时,才应该 使用TreeSet。

    注意,对于插入操作,LinkedHashSet 比HashSet 略微慢一点;这是由维护链表所带来

    额外开销造成的。不过,因为有了链表,遍历LinkedHashSet 会更快

    3,对 Map 的选择          

    对 Map 不同的实现做选择时,Map 的大小是影响性能最重要的因素,

    Hashtable 和HashMap 的效率大致相同。(你也看到了,HashMap 通

    常更快一点,所以HashMap 有意取代Hashtable。)TreeMap 通常比HashMap 慢,

    为什么还需要它?因为可以使用它生成一个排好序的队列。树的行为方式是:它总是处于

    排序状态,不需要专门进行排序操作。当TreeMap 被填充之后,就可以调用keySet(),

    取得由“键”组成的Set,然后使用toArray()生成“键”的数组。接下来使用static

    Arrays.binarySearch()方法(稍后会讨论),在已排序的数组中快速地查询对象。当然,

    你应该只在因为某些原因而无法使用HashMap 的时候,才去这么做。因为HashMap 正

    是为快速查询而设计的。而且,你可以很方便地通过TreeMap 生成HashMap。所以,当

    你需要使用Map 时,首选HashMap,只有在你需要一个总是排好序的Map 时,才使用

    TreeMap。

    LinkedHashMap 比HashMap 慢一点,因为它维护散列数据结构的同时还要维护链表。

    IdentityHashMap 则具有完全不同的性能,因为它使用==而不是equals()来比较元素     。

    java容器总结:

    1. 数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对
    结果做类型转换。它可以是多维的,可以保存基本类型的数据。但是,数组
    一旦生成,其容量就不能改变。
    2.Collection 保存单个的元素,而Map 保存相关联的键值对。
    3.像数组一样,List 也建立数字与对象的关联,可以认为数组和List 都是排好序
    的容器。List 能够自动扩充容量。但是List 不能保存基本类型,只能保存Object
    的引用,因此必须对从容器中取出的Object 结果做类型转换。
    4.如果要进行大量的随机访问,就使用ArrayList;如果要经常从List 中间插入或

      删除元素,则应该使用LinkedList。
    5. 队列、双向队列以及栈的行为,由 LinkedList 提供支持。
    6.Map 是一种将对象与对象相关联的设计。HashMap 着重于快速访问;TreeMap
    保持“键”始终处于排序状态,所以没有HashMap 快。LinkedHashMap 保
    持元素插入的顺序,也可以使用LRU 算法对其重排序。
    7. Set 不接受重复元素。HashSet 提供最快的查询速度,TreeSet 保持元素处于排
    序状态。LinkedHashSet 以插入顺序保存元素。
    8.新程序中不应该使用过时的 Vector、Hashtable 和Stack

  • 相关阅读:
    ASP.NET MVC之从控制器传递数据到视图
    ASP.NET MVC之从视图传递数据到控制器
    JQuery和ASP.NET之间的传值
    ASP.NET前台html页面AJAX提交数据后台ashx页面接收数据
    Variadic Templates 可变参数模板
    C++类型转换
    C++优化string,实现写时拷贝
    C++实现一个线程安全的单例模式
    C++ 实现简单的string
    C++实现简单的线程安全队列
  • 原文地址:https://www.cnblogs.com/jiafuwei/p/4423111.html
Copyright © 2011-2022 走看看