开发者社区 > 云原生 > 容器服务 > 正文

JAVA中什么是容器?

已解决

容器是什么?跟接口是什么关系?集合又是什么?

展开
收起
WM云建站 2016-04-05 23:10:56 3370 0
1 条回答
写回答
取消 提交回答
  • 阿里云论坛版主,QQ 1978638808
    采纳回答

    Java集合容器主要有以下几类:
    1,内置容器:数组
    2,list容器:Vetor,Stack,ArrayList,LinkedList,
    CopyOnWriteArrayList(1.5),AttributeList(1.5),RoleList(1.5),RoleUnresolvedList(1.5),
    ConcurrentLinkedQueue(1.5),ArrayBlockingQueue(1.5),LinkedBlockingQueue(1.5),
    PriorityQueue(1.5),PriorityBlockingQueue(1.5),SynchronousQueue(1.5)
    3,set容器:HashSet(1.2),LinkedHashSet(1.4),TreeSet(1.2),
    CopyOnWriteArraySet(1.5),EnumSet(1.5),JobStateReasons。
    4,map容器:Hashtable,HashMap(1.2),TreeMap(1.2),LinkedHashMap(1.4),WeakHashMap(1.2),
    IdentityHashMap(1.4),ConcurrentMap(1.5),concurrentHashMap(1.5)。
    注意:Vector,Stack,Hashtable是Java1.2前的容器。
    虽然在Java2之前,Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类。
    但是在Java2后他们还是被融入到了集合框架的,不过只是历史遗留而已。它们和1.2前应该还是有些变化的,虽然本质没什么变化。
    Set接口继承于Collection,但不允许重复,使用自己内部的一个排列机制。
    List接口继承Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
    Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。
    一、Java1.2之前的容器类库
    其实在Java2之前,Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类,比如Vector,Stack,Hashtable等。
    Java1容器类库设计的一个重大失误是竟然没有对容器进行排序的工具。比如你想让Vector容器中的对象按字典顺序进行排序,你就要自己实现。
    1.1、Vector
    java.util.Vector中包含的元素可以通过一个整型的索引值取得,它的大小可以在添加或移除元素时自动增加或缩小。Vector的操作很简单,通过addElement()加入一个对象,用elementAt()取出它,还可以查询当前所保存的对象的个数size();
    另外还有一个Enumeration类提供了连续操作Vector中元素的方法,这可以通过Vector中的elements()方法来获取一个Enumeration类的对象,
    可以用一个While循环来遍历其中的元素。用hasMoreElements()检查其中是否还有更多的元素。
    用nextElement()获得下一个元素。Enumeration的用意在于使你能完全不用理会你要遍历的容器的基础结构,只关注你的遍历方法,
    这也就使得遍历方法的重用成为可能。由于这种思想的强大功能,所以在Java2中被保留下来,不过具体实现,方法名和内部算法都改变了,
    这就是Java2中的Iterator以及ListIterator类。然而Enumeration的功能却十分有限,比如只能朝一个方向进行,只能读取而不能更改等。
    更多内容请参考《Vector》
    1.2、Stack
    java.util.Stack最常用的操作便是压入和弹出,最后压入的元素最先被弹出。它遵循后进先出(LIFO)原则。
    在Java中Stack的的用法也很简单,有push()压入一个元素,用pop()弹出一个元素。
    更多内容请参考《Stack容器》
    1.3、Hashtable
    Hashtable与Java2中的Map类似,可以看成一种关联或映射数组,可以将两个毫无关系的对象相关联。
    它的基本目标是实现两个对象之间进行关联。
    更多内容请参考《Hashtable》
    二、Java2中的容器类库
    自Java1.2之后Java版本统称为Java2,Java2中的容器类库才可以说是一种真正意义上的集合框架的实现。
    基本完全重新设计,但是又对Java1中的一些容器类库在新的设计上进行了保留,这主要是为了向下兼容的目的,
    当用 Java2开发程序时,应尽量避免使用它们,Java2的集合框架已经完全可以满足你的需求。
    在Java1中容器类库是同步化的,而 Java2中的容器类库都是非同步化,这可能是对执行效率进行考虑的结果。
    Java2中的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素极为方便。
    这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结构中熟知的。例如Maps,Sets,Lists,Arrays等。
    并且Java用面向对象的设计对这些数据结构和算法进行了封装,这就极大的减化了程序员编程时的负担。
    程序员也可以以这个集合框架为基础,定义更高级别的数据抽象,比如栈、队列和线程安全的集合等,从而满足自己的需要。
    Java2的集合框架,抽其核心,主要有三类:List(包括List,Queue,BlockingQueue)、Set和Map。List和Set继承了Collection,而Map则独成一体。
    初看上去可能会对Map独成一体感到不解,它为什么不也继承Collection呢?但是这种设计是合理的。
    一个Map提供了通过Key对Map中存储的Value进行访问,也就是说它操作的都是成对的对象元素,比如put()和get()方法,
    而这是一个Set或List 所不就具备的。当然在需要时,你可以由keySet()方法或values()方法从一个Map中得到键的Set集或值的Collection集。
    集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法, Arrays则是对一个数组进行类似的操作。
    2.1、Collection
    Collection接口提供了一组操作成批对象的方法。(它只是个接口)
    它提供了基本操作如添加、删除。它也支持查询操作如是否为空isEmpty()方法等。
    为了支持对Collection进行独立操作,Java的集合框架给出了一个Iterator,它使得你可以泛型操作一个Collection,
    而不需知道这个 Collection的具体实现类型是什么。它的功能与Java1中的Enumeration类似,只是更易掌握和使用,功能也更强大。
    在建立集合框架时,Sun的开发团队考虑到需要提供一些灵活的接口,用来操作成批的元素,又为了设计的简便,
    就把那些对集合进行可选操作的方法与基本方法放到了一起。因为一个接口的实现者必须提供对接口中定义的所有方法的实现,
    这就需要一种途径让调用者知道它正在调用 的可选方法当前不支持。最后开发团队选择使用一种信号,
    也即抛出一种不支持操作例外(UnsupportedOperationException),如果你在使用一个Collection中遇到一个上述的例外,
    那就意味着你的操作失败,比如你对一个只读Collection添加一个元素时,你就会得到一个不支持操作例外。
    在你实现一个集合接口时,你可以很容易的在你不想让用户使用的方法中抛出UnsupportOperationException来告诉使用者这个方法当前没有实现,
    UnsupportOperationException是RuntimeException的一个扩展。
    另外Java2的容器类库还有一种Fail fast的机制。比如你正在用一个Iterator遍历一个容器中的对象,
    这时另外一个线程或进程对那个容器进行了修改,那么再用next()方法时可能会有灾难性的后果,
    而这是你不愿看到的,这时就会引发一个ConcurrentModificationException例外。
    这就是 fail-fast。

    2019-07-17 18:38:09
    赞同 展开评论 打赏
问答分类:
问答标签:

国内唯一 Forrester 公共云容器平台领导者象限。

相关电子书

更多
阿里云文件存储 NAS 在容器场景的最佳实践 立即下载
何种数据存储才能助力容器计算 立即下载
《容器网络文件系统CNFS》 立即下载