zoukankan      html  css  js  c++  java
  • Hastable和Dictionary以及ArrayList和(List,LinkedList,数组)的区别

    Hastable和Dictionary的区别:(键值对)

    1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.
    2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减.
    3:Dictionary 有按插入顺序排列数据的特性 (注: 但当调用 Remove() 删除过节点后顺序被打乱), 因此在需要体现顺序的情境中使用 Dictionary 能获得一定方便.
    对于值类型,特定类型(不包括 Object)的 Dictionary<(Of <(TKey, TValue>)>) 的性能优于 Hashtable,这是因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。


    用Dictionary可以避免进行装箱拆箱操作


    线程安全性:

    Dictionary
    只要不修改该集合,Dictionary<TKey, TValue> 就可以同时支持多个阅读器。 即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。 当出现枚举与写访问互相争用这种极少发生的情况时,必须在整个枚举过程中锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。
    有关线程安全另类的信息,请参见 ConcurrentDictionary<TKey, TValue>。
    此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。

    HashTable
    Hashtable 是线程安全的,可由多个读取器线程和一个写入线程使用。 多线程使用时,如果只有一个线程执行写入(更新)操作,则它是线程安全的,从而允许进行无锁定的读取(若编写器序列化为 Hashtable)。 若要支持多个编写器,如果没有任何线程在读取 Hashtable 对象,则对 Hashtable 的所有操作都必须通过 Synchronized 方法返回的包装完成。
    从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。 即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。 若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。


    1.Dictionary<K,V>是以Hash技术为基础构建的。在理想情况下,查找时间复杂度为O(1)
    2.从项目实践上看,Dictionary在初始是以插入顺序排的。但MSDN上没有保证过这一点。
    3.Hashtable是明确不按插入顺序来排的。

    ArrayList和LinkedList的区别:(单个元素)

    1、ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构。

    2.、对于随机访问get(查询)和set(修改),ArrayList是优于LinkedList,因为LinkedList要移动指针。

     3. 对于新增和删除操作add(添加)和remove(删除),LinekList比较占优势,因为ArrayList要移动数据 

      

    ArrayList和List的区别:

    ArrayList添加成员过程中中会发生拆装箱操作,可以插入类型不同的值,因为他的传参是object类型的,当我们获取不当时,会报类型不匹配这样的错误!

    List在给它添加成员的时候不会发生拆装箱只能插入类型相同的值,可以确保类型安全

    ArrayList arrayList=new ArrayList();
    
    arrayList.Add(1); //发生装箱操作
    
    List<int> list=new list<int>();
    
    list.Add(1); //未发生装箱操作

    数组的优缺点:

    int[] ints=new int[2];
    ints[0]=2 ints[1
    ]=3

    优点:索引速度非常快,而且赋值与修改元素也很简单,直接根据索引找到对象来进行操作即可!

    缺点:在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候必须指定数组的长度,数组的长度过长,会造成内存浪费,

            过段会造成数据溢出的错误。如果在声明数组时我们不清楚数组的长度,就会变得很麻烦。

    针对数组的这些缺点,C#中最先提供了ArrayList和List对象来克服这些缺点。如上。 

    参考:http://blog.csdn.net/zhang_xinxiu/article/details/8657431

            http://www.xeclipse.com/?p=1324

  • 相关阅读:
    mybatis 错误 Invalid bound statement (not found)
    Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
    bug 记录 Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans
    解决:The Tomcat connector configured to listen on port 8182 failed to start. The port may already be in use or the connector may be misconfigured.
    jquery validate 验证插件 解决多个相同的Name 只验证第一个的方案
    phpStorm+xdebug调试(php7.3)
    小程序视频多个视频播放与暂停
    CSS实现单行、多行文本溢出显示省略号(…)
    Packet for query is too large (4,544,730 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
    idea自动在文件头中添加作者和创建时间
  • 原文地址:https://www.cnblogs.com/MrZivChu/p/list.html
Copyright © 2011-2022 走看看