zoukankan      html  css  js  c++  java
  • Java Collection

    在 Java2中,有一套设计优良的接口和类组成了Java集合框架Collection,使程序猿操作成批的数据或对象元素极为方便。这些接口和类有非常多对抽象数据类型操作的API,而这是我们经常使用的且在数据结构中熟知的。比如Map。Set,List等。

    而且Java用面向对象的设计对这些数据结构和算法进行了封装,这就极大的减化了程序猿编程时的负担。程序猿也能够以这个集合框架为基础,定义更高级别的数据抽象。比方栈、队列和线程安全的集合等,从而满足自己的须要。



    Java2的集合框架。抽其核心。主要有三种:List、Set和Map。

    例如以下图所看到的:

    须要注意的是,这里的 Collection、List、Set和Map都是接口(Interface)。不是详细的类实现。 List lst = new ArrayList(); 这是我们寻常常常使用的创建一个新的List的语句,在这里, List是接口,ArrayList才是详细的类。



    经常使用集合类的继承结构例如以下:
    Collection<--List<--Vector
    Collection<--List<--ArrayList
    Collection<--List<--LinkedList
    Collection<--Set<--HashSet
    Collection<--Set<--HashSet<--LinkedHashSet
    Collection<--Set<--SortedSet<--TreeSet
    Map<--SortedMap<--TreeMap
    Map<--HashMap

    -----------------------------------------------SB切割线------------------------------------------

    List:
    List是有序的Collection,使用此接口可以精确的控制每一个元素插入的位置。用户可以使用索引(元素在List中的位置。类似于数组下 >标)来訪问List中的元素,这类似于Java的数组。



    Vector:
    基于数组(Array)的List,事实上就是封装了数组所不具备的一些功能方便我们使用,所以它难易避免数组的限制,同一时候性能也不可能超越数组。所以。在可能的情况下,我们要多运用数组。另外非常重要的一点就是Vector是线程同步的(sychronized)的,这也是Vector和ArrayList 的一个的重要差别。

    ArrayList:
    同Vector一样是一个基于数组上的链表,可是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,可是当执行到多线程环境中时,可须要自己在管理线程的同步问题。



    LinkedList:
    LinkedList不同于前面两种List,它不是基于数组的,所以不受数组性能的限制。
    它每个节点(Node)都包括双方面的内容:
    1.节点本身的数据(data);
    2.下一个节点的信息(nextNode)。
    所以当对LinkedList做加入,删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。仅仅要更改nextNode的相关信息就能够实现了。这是LinkedList的优势。



    List总结:

    • 全部的List中仅仅能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。

      比如:[ tom,1,c ]


    • 全部的List中能够有同样的元素,比如Vector中能够有 [ tom,koo,too,koo ]

    • 全部的List中能够有null元素,比如[ tom,null,1 ]

    • 基于Array的List(Vector。ArrayList)适合查询,而LinkedList 适合加入,删除操作


    --------------------------------------NB切割线------------------------------------

    Set:
    Set是一种不包括反复的元素的无序Collection。



    HashSet:
    尽管Set同List都实现了Collection接口。可是他们的实现方式却大不一样。List基本上都是以Array为基础。

    可是Set则是在 HashMap的基础上来实现的。这个就是Set和List的根本差别。HashSet的存储方式是把HashMap中的Key作为Set的相应存储项。

    看看 HashSet的add(Object obj)方法的实现就能够一目了然了。

    Java代码  收藏代码
    1. public boolean add(Object obj) {   
    2.    return map.put(obj, PRESENT) == null;   
    3. }   

    这个也是为什么在Set中不能像在List中一样有反复的项的根本原因。由于HashMap的key是不能有反复的。

    LinkedHashSet:
    HashSet的一个子类,一个链表。

    TreeSet:
    SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。

    Set总结:
    • Set实现的基础是Map(HashMap)

    • Set中的元素是不能反复的。假设使用add(Object obj)方法加入已经存在的对象,则会覆盖前面的对象


    --------------------------------------2B切割线------------------------------------

    Map:
    Map 是一种把键对象和值对象进行关联的容器,而一个值对象又能够是一个Map,依次类推。这样就可形成一个多级映射。对于键对象来说,像Set一样,一个 Map容器中的键对象不同意反复,这是为了保持查找结果的一致性;假设有两个键对象一样,那你想得到那个键对象所相应的值对象时就有问题了,可能你得到的并非你想的那个值对象,结果会造成混乱,所以键的唯一性非常重要,也是符合集合的性质的。当然在使用过程中,某个键所相应的值对象可能会发生变化,这时会依照最后一次改动的值对象与键相应。对于值对象则没有唯一性的要求,你能够将随意多个键都映射到一个值对象上,这不会发生不论什么问题(只是对你的使用却可能会造成不便,你不知道你得到的究竟是那一个键所相应的值对象)。



    Map有两种比較经常使用的实现:HashMap和TreeMap。

    HashMap也用到了哈希码的算法,以便高速查找一个键,

    TreeMap则是对键按序存放,因此它便有一些扩展的方法,比方firstKey(),lastKey()等,你还能够从TreeMap中指定一个范围以取得其子Map。
    键和值的关联非常easy。用put(Object key,Object value)方法就可以将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所相应的值对象。

    --------------------------------------JB切割线------------------------------------

    其他:
    一、几个经常使用类的差别
    1.ArrayList: 元素单个。效率高,多用于查询
    2.Vector: 元素单个,线程安全,多用于查询
    3.LinkedList:元素单个。多用于插入和删除
    4.HashMap: 元素成对,元素可为空
    5.HashTable: 元素成对。线程安全。元素不可为空

    二、Vector、ArrayList和LinkedList
    大多数情况下,从性能上来说ArrayList最好。可是当集合内的元素须要频繁插入、删除时LinkedList会有比較好的表现。可是它们三个性能都比不上数组,另外Vector是线程同步的。所以:
    假设能用数组的时候(元素类型固定。数组长度固定),请尽量使用数组来取代List;
    假设没有频繁的删除插入操作。又不用考虑多线程问题,优先选择ArrayList。
    假设在多线程条件下使用,能够考虑Vector。
    假设须要频繁地删除插入。LinkedList就有了用武之地;
    假设你什么都不知道,用ArrayList没错。

    三、Collections和Arrays
    在 Java集合类框架里有两个类叫做Collections(注意。不是Collection。)和Arrays,这是JCF里面功能强大的工具。但刚開始学习的人往往会忽视。

    按JCF文档的说法,这两个类提供了封装器实现(Wrapper Implementations)、数据结构算法和数组相关的应用。
    想必大家不会忘记上面谈到的“折半查找”、“排序”等经典算法吧。Collections类提供了丰富的静态方法帮助我们轻松完毕这些在数据结构课上烦人的工作:
    binarySearch:折半查找。

    sort:排序,这里是一种类似于高速排序的方法,效率仍然是O(n * log n)。但却是一种稳定的排序方法。

    reverse:将线性表进行逆序操作,这个但是从前数据结构的经典考题哦!

    rotate:以某个元素为轴心将线性表“旋转”。

    swap:交换一个线性表中两个元素的位置。


    ……
    Collections另一个重要功能就是“封装器”(Wrapper),它提供了一些方法能够把一个集合转换成一个特殊的集合,例如以下:

    unmodifiableXXX:转换成仅仅读集合,这里XXX代表六种基本集合接口:Collection、List、Map、Set、SortedMap和SortedSet。假设你对仅仅读集合进行插入删除操作。将会抛出UnsupportedOperationException异常。

    synchronizedXXX:转换成同步集合。

    singleton:创建一个仅有一个元素的集合,这里singleton生成的是单元素Set,
    singletonList和singletonMap分别生成单元素的List和Map。

    空集:由Collections的静态属性EMPTY_SET、EMPTY_LIST和EMPTY_MAP表示。

    这次关于Java集合类概述就到这里,下一次我们来解说Java集合类的详细应用。如List排序、删除反复元素。


    原文出自:http://skyuck.iteye.com/blog/526358

  • 相关阅读:
    Reactor系列(十一)take获取
    Reactor系列(十)collectMap集合
    Reactor系列(九)collect集合
    C++线程安全队列
    C++编辑编译链接运行
    C++函数的返回值——返回引用类型&,非引用类型
    关于通过在代码中执行shell脚本启动其他应用方法
    linux指令中单杆和双杠区别
    关于浏览器屏蔽掉百度右侧广告热搜的方法
    C#异步方法 async、await用法和解析
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5135258.html
Copyright © 2011-2022 走看看