Map:HashMap、HashTable 
  如何在它们之间选择 
  一、Array , Arrays 
  Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。 
  1、 
  效率高,但容量固定且无法动态改变。 
  array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。 
  2、Java中有一个Arrays类,专门用来操作array。 
  arrays中拥有一组static函数, 
  equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。 
  fill():将值填入array中。 
  sort():用来对array进行排序。 
  binarySearch():在排好序的array中寻找元素。 
  System.arraycopy():array的复制。 
  二、Collection , Map 
  若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。 
  1、Collection 和 Map 的区别 
  容器内每个为之所存储的元素个数不同。 
  Collection类型者,每个位置只有一个元素。 
  Map类型者,持有 key-value pair,像个小型数据库。 
  2、各自旗下的子类关系 
  Collection 
  --List:将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。 
  --ArrayList / LinkedList / Vector 
  --Set: 不能含有重复的元素 
  --HashSet / TreeSet 
  Map 
  --HashMap 
  --HashTable 
  --TreeMap 
  3、其他特征 
  * List,Set,Map将持有对象一律视为Object型别。 
  * Collection、List、Set、Map都是接口,不能实例化。 
  继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。 
  * vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。 
  三、Collections 
  Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。 
  相当于对Array进行类似操作的类——Arrays。 
  如,Collections.max(Collection coll); 取coll中最大的元素。 
  Collections.sort(List list); 对list中元素排序 
  四、如何选择? 
  1、容器类和Array的区别、择取 
  * 容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。 
  * 一旦将对象置入容器内,便损失了该对象的型别信息。 
  2、 
  * 在各种Lists中,最好的做法是以ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList(); 
  Vector总是比ArrayList慢,所以要尽量避免使用。 
  * 在各种Sets中,HashSet通常优于HashTree(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。 
  HashTree存在的唯一理由:能够维护其内元素的排序状态。 
  * 在各种Maps中 
  HashMap用于快速查找。 
  * 当元素个数固定,用Array,因为Array效率是最高的。 
  结论:最常用的是ArrayList,HashSet,HashMap,Array。 
  注意: 
  1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 
  2、Set和Collection拥有一模一样的接口。 
  3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get) 
  4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。 
  5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。 
  HashMap会利用对象的hashCode来快速找到key。 
  * hashing 
  哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。 
  我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。 
   
  发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。 
  6、Map中元素,可以将key序列、value序列单独抽取出来。 
  使用keySet()抽取key序列,将map中的所有keys生成一个Set。 
  使用values()抽取value序列,将map中的所有values生成一个Collection。 
  为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。 
  这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 
  有序否 允许元素重复否 
  Collection 否 是 
  List 是 是 
  Set AbstractSet 否 否 
  HashSet 
  TreeSet 是(用二叉树排序) 
  Map AbstractMap 否 使用 key-value 来映射和存储数据, Key 必须惟一, value 可以重复 
  HashMap 
  TreeMap 是(用二叉树排序) 
  List 接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器 中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而LinkedList的内 部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历,而 ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法。 
  Set接口也是 Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常 用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方 法,它使用了前面说过的哈希码的算法。而TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外 两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就 不需要在每分别重复定义相同的排序算法,只要实现Comparator接口即可。集合框架中还有两个很实用的公用类:Collections和 Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法,Arrays则是对一 个数组进行类似的操作。 
  Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可 形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得 到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使 用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一 个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现: HashMap和TreeMap。HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap则是对键按序存放,因此它便有一些扩展的方 法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用pub (Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

Collection与Map的对比的更多相关文章

  1. Java特性-Collection和Map

    创建博客的目的主要帮助自己记忆和复习日常学到和用到的知识:或有纰漏请大家斧正,非常感谢! 之前面试,被问过一个问题:List和Set的区别. 主要区别很明显了,两者都是数组形式存在的,继承了Colle ...

  2. Java Collection或Map的同步

    新集合也提供了能防止多个进程同时修改一个容器内容的机制.若在一个容器里反复,同时另一些进程介入,并在那个容器中插入.删除或修改一个对象,便会面临发生冲突的危险.我们可能已传递了那个对象,可能它位于我们 ...

  3. 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

    原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...

  4. Collection和Map

    (1)Collection和Map的继承体系. (2)ArrayList(数组).LinkedList(链表).Vector(线程同步).Stack(继承Vector先进后出的栈).PriorityQ ...

  5. Java集合类根接口:Collection 和 Map

    前言 在前文中我们了解了几种常见的数据结构,这些数据结构有着各自的应用场景,并且被广泛的应用于编程语言中,其中,Java中的集合类就是基于这些数据结构为基础. Java的集合类是一些非常实用的工具类, ...

  6. spark提示Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Lscala.collection.immutable.Map;

    spark提示Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot b ...

  7. 初识Java集合框架(Iterator、Collection、Map)

    1. Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 注意: 既有接口也有类,图中画实线的是类,画虚线的是接口 使用之前须要到导入java.util包 List ...

  8. JAVA集合详解(Collection和Map接口)

    原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...

  9. Java集合框架(Collection Framework)学习之 Collection与Map概貌

    写过Java的人都知道Java集合类,也用过Java集合类.Java集合类位于 java.util 这个包下,就像它的包名暗示的那样,Java集合类就是一套工具.它就像工匠的工具箱一样,它能给使用它的 ...

随机推荐

  1. Leecode刷题之旅-C语言/python-21.合并两个有序链表

    /* * @lc app=leetcode.cn id=21 lang=c * * [21] 合并两个有序链表 * * https://leetcode-cn.com/problems/merge-t ...

  2. UVa Problem 100 The 3n+1 problem (3n+1 问题)

    参考:https://blog.csdn.net/metaphysis/article/details/6431937 #include <iostream> #include <c ...

  3. [Cracking the Coding Interview] 4.6 Successor 后继节点

    Write an algorithm to find the 'next' node(i.e. in-order successor) of a given node in a binary sear ...

  4. python2.7入门---正则表达式

        正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.re 模块使 Pytho ...

  5. Koa基本使用

    简介 koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架. 使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的 ...

  6. cadence17.2的OrCAD启动找不到license的问题

    1. cadence17.2的OrCAD每次启动都说找不到license 2. 提示是找不到licence,看下系统变量,licence的路径是在的 3. 估计是读取licence的路径的服务未开启, ...

  7. redis学习资料汇总

    redis学习资料汇总 2017年01月07日 22:10:37 阅读数:281 转载:http://blog.csdn.net/wtyvhreal/article/details/50427627 ...

  8. spring 给静态变量注入值

    一般在spring中,给static变量加上@Autowired注解的时候会报空指针异常错误. 解决: 1.通过xml配置文件配置 这个就不多说了. 2.通过注解 @Component public ...

  9. 第十一篇 Python函数之定义&形参&实参&位置参数&关键字参数&可变长参数&默认参数

    函数的定义:函数是为了完成某一特定功能的,函数是逻辑结构化和过程化的一种编程方法 函数的定义格式,函数一般都是有返回值的 #语法 #函数名要能反映其意义 def 函数名(参数1,参数2,参数3,... ...

  10. CodeForces - 948C(前缀和 + 二分)

    链接:CodeForces - 948C 题意:N天,每天生产一堆雪体积 V[i] ,每天每堆雪融化 T[i],问每天融化了多少雪. 题解:对 T 求前缀和,求每一堆雪能熬过多少天,再记录一下多余的就 ...