Hashtable

Linux:Hashlist/hashtable: [积木] 文章目录DEFINE_HASHTABLE使用实例 DEFINE_HASHTABLE struct hlist_head { struct hlist_node *first; }; struct hlist_node { struct hlist_node *next, **pprev; }; #define HLIST_HEAD_INIT { .first = NULL } #define DEFINE_HASHTABLE(name, bits) \ 定义一个hash表,名称,以及 阅读详情

一.概述

1.定义

Hashtable类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
HashMap是Hashtable的轻量级实现。
Hashtable定义:

public class Hashtable<K,V>  
    extends Dictionary<K,V>  
    implements Map<K,V>, Cloneable, java.io.Serializable  

HashMap定义:

public class HashMap<K,V>
         extends AbstractMap<K,V>
         implements Map<K,V>, Cloneable, Serializable

Hashtable是基于陈旧的Dictionary类的,HashMap是 Java 1.2引进的Map接口的一个实现。
Hashtable也是继承了Map接口。它们的不同是 Hashtable(since JDK1.0)就继承了Dictionary这个抽象类,而HashMap(since JDK1.2)继承的则是AbstractMap这个抽象类。因为在Hashtable中看到继承Map后所实现的方法是JDK1.2版本时加上去的,估计是在JDK 1.2开发时出于统一的考虑使得Hashtable也继承了Map接口。

2.重要参数

(1)table

为一个Entry[]数组类型,Entry代表了“拉链”的节点,每一个Entry代表了一个键值对,哈希表的”key-value键值对”都是存储在Entry数组中的。

(2)count

HashTable的大小,这个大小并不是HashTable的容器大小,而是他所包含Entry键值对的数量。

(3)threshold

Hashtable的阈值,用于判断是否需要调整Hashtable的容量。
threshold的值=容量count * 加载因子loadFactor。

(4)loadFactor

加载因子。

(5)modCount

用来实现“fail-fast”机制的(也就是快速失败)。所谓快速失败就是在并发集合中,其进行迭代操作时,若有其他线程对其进行结构性的修改,这时迭代器会立马感知到,并且立即抛出ConcurrentModificationException异常,而不是等到迭代完成之后才告诉你(你已经出错了)。

二.构造函数

1.Hashtable()

初始大小为11(Hashmap桶的初始大小为16)

public Hashtable() {
  this(11, 0.75f);
}

2.Hashtable(int initialCapacity)

自定义初始化的容量大小和默认的加载因子 (0.75) 构造一个新的空哈希表。

public Hashtable(int initialCapacity) {
  this(initialCapacity, 0.75f);
}
public Hashtable(int initialCapacity, float loadFactor) {
       //初始容量是否合法
       if (initialCapacity < 0)
           throw new IllegalArgumentException("Illegal Capacity: "+
                                              initialCapacity);
       //加载因子是否合法
       if (loadFactor <= 0 || Float.isNaN(loadFactor))
           throw new IllegalArgumentException("Illegal Load: "+loadFactor);

       if (initialCapacity==0)
           initialCapacity = 1;

       this.loadFactor = loadFactor;

       //初始化table,获得大小为initialCapacity的table数组
       table = new Entry[initialCapacity];
       //计算阀值
       threshold = (int)Math.min(initialCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
       //初始化HashSeed值
       initHashSeedAsNeeded(initialCapacity);
   }

initHashSeedAsNeeded方法用于初始化hashSeed参数,其中hashSeed用于计算key的hash值,它与key的hashCode进行按位异或运算。这个hashSeed是一个与实例相关的随机值,主要用于解决hash冲突。

private int hash(Object k) {
     return hashSeed ^ k.hashCode();
}

3.Hashtable(Map map)

构造一个与给定的 Map 具有相同映射关系的新哈希表。

public Hashtable(Map<? extends K, ? extends V> t) {
   //设置table容器大小,其值==t.size * 2 + 1
     this(Math.max(2*t.size(), 11), 0.75f);
     putAll(t);
 }

三.主要方法

1.put(K key, V value)

put方法的整个处理流程是:计算key的hash值,根据hash值获得key在table数组中的索引位置,然后迭代该key处的Entry链表(我们暂且理解为链表),若该链表中存在一个这个的key值,那么就直接替换其value值即可,否则在将该key-value节点插入该index索引位置处。

//同步
public synchronized V put(K key, V value) {
    // 不允许value为null
      if (value == null) {
          throw new NullPointerException();
      }

      /*
       * 确保key在table[]是不重复的
       * 处理过程:
       * 1、计算key的hash值,确认在table[]中的索引位置
       * 2、迭代index索引位置,如果该位置处的链表中存在一个一样的key,则替换其value,返回旧值
       */
      Entry tab[] = table;
      int hash = hash(key);    //计算key的hash值
      //寻找该key的索引位置
      //hash & 0x7FFFFFFF为确保结果hash值为正,然后对table.length取余找到位置
      int index = (hash & 0x7FFFFFFF) % tab.length;     
      //迭代,寻找该key,替换
      for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
          if ((e.hash == hash) && e.key.equals(key)) {
              V old = e.value;
              e.value = value;
              return old;
          }
      }

      modCount++;
      if (count >= threshold) {  //如果容器中的元素数量已经达到阀值,则进行扩容操作
          rehash();
          tab = table;
          hash = hash(key);
          index = (hash & 0x7FFFFFFF) % tab.length;
      }

      // 在索引位置处插入一个新的节点
      Entry<K,V> e = tab[index];
      tab[index] = new Entry<>(hash, key, value, e);
      //容器中元素+1
      count++;
      return null;
  }

2.rehash()

HashTable的扩容操作,在put方法中,如果需要向table[]中添加Entry元素,会首先进行容量校验,如果容量已经达到了阀值,HashTable就会进行扩容处理rehash(),扩大为新容量=旧容量 * 2 + 1

protected void rehash() {
      int oldCapacity = table.length;
       //元素
       Entry<K,V>[] oldMap = table;

       //新容量=旧容量 * 2 + 1
       int newCapacity = (oldCapacity << 1) + 1;
       if (newCapacity - MAX_ARRAY_SIZE > 0) {
           if (oldCapacity == MAX_ARRAY_SIZE)
               return;
           newCapacity = MAX_ARRAY_SIZE;
       }

       //新建一个size = newCapacity 的HashTable
       Entry<K,V>[] newMap = new Entry[];

       modCount++;
       //重新计算阀值
       threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
       //重新计算hashSeed
       boolean rehash = initHashSeedAsNeeded(newCapacity);

       table = newMap;
       //将原来的元素拷贝到新的HashTable中
       for (int i = oldCapacity ; i-- > 0 ;) {
           for (Entry<K,V> old = oldMap[i] ; old != null ; ) {
               Entry<K,V> e = old;
               old = old.next;

               if (rehash) {
                   e.hash = hash(e.key);
               }
               int index = (e.hash & 0x7FFFFFFF) % newCapacity;
               e.next = newMap[index];
               newMap[index] = e;
           }
       }
   }

3.hash()

计算hash值,由hash值得出key对应的索引

private int hash(Object k) {
    return hashSeed ^ k.hashCode();
}

4.get(Object key)

计算key的hash值,判断在table数组中的索引位置,然后迭代链表,匹配直到找到相对应key的value,若没有找到返回null。

public synchronized V get(Object key) {
     Entry tab[] = table;
     int hash = hash(key);
     int index = (hash & 0x7FFFFFFF) % tab.length;
     for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
         if ((e.hash == hash) && e.key.equals(key)) {
             return e.value;
         }
     }
     return null;
 }

四.遍历方式

前置条件:

    Hashtable<String, Object> hashtable = null; 
    @Before 
    public void init(){
        hashtable = new Hashtable<String, Object>();  
        hashtable.put("now", "you");
        hashtable.put("see", "me");
        hashtable.put("cause", "i");
        hashtable.put("let", "be");
    }

1. 遍历Hashtable的键值对

  • 由entrySet()获取Hashtable的“键值对”的Set集合
  • 通过Iterator迭代器遍历Set集合
@Test
public void HashTableTraversalTest1(){
    Iterator<Map.Entry<String, Object>> iterator =  hashtable.entrySet().iterator();
    while (iterator.hasNext()) {
         Map.Entry<String, Object> entry = (Map.Entry<String, Object>)iterator.next();
         System.out.println(entry.getKey()+":"+entry.getValue());
    }
}

结果打印:

see:me
now:you
let:be
cause:i

2.通过Iterator遍历Hashtable的键

(1)获取keys集合方式1

  • 由keySet()获取Hashtable的“键”的Set集合
  • 通过Iterator迭代器遍历Set集合的key
  • 如需要获取value,由key再定位获取到value
@Test
public void HashTableTraversalTest2(){
    Iterator<String> iterator =  hashtable.keySet().iterator();
    while (iterator.hasNext()) {
         String key = iterator.next();
         System.out.println(key+":"+hashtable.get(key));
    }
}

(2)获取keys集合方式2

  • 由hashtable.keys()方法获取keys获取Hashtable的Enumeration集合
  • 通过Iterator迭代器遍历Enumeration集合的值
  • 如需要获取value,由key再定位获取到value
@Test
public void HashTableTraversalTest3(){
    Enumeration<String> enumeration =  hashtable.keys();
    while (enumeration.hasMoreElements()) {
        String string = (String) enumeration.nextElement();          
        System.out.println(string+":"+hashtable.get(string));
    }
}

3.通过Iterator遍历Hashtable的值

(1)获取values集合方式1

  • 由keySet()获取Hashtable的“键”的Collection
  • 通过Iterator迭代器遍历Collection
@Test
public void HashTableTraversalValuesTest4(){
    Collection<Object> c = hashtable.values();
    Iterator<Object> iterator = c.iterator();
    while (iterator.hasNext()) {
        Object object = (Object) iterator.next();
        System.out.println(object);
    }
}

(2)获取values集合方式2

  • 由hashtable.keys()方法获取keys获取Hashtable的Enumeration集合
  • 通过Iterator迭代器遍历Enumeration集合的值
  • 如需要获取value,由key再定位获取到value

4.通过Enumeration遍历Hashtable的键

五.HashMap和Hashtable区别

这里写图片描述

这里写图片描述

1.继承的父类

两个类的继承体系有些不同。虽然都实现了Map、Cloneable、Serializable三个接口。但是HashMap继承自抽象类AbstractMap,而HashTable继承自抽象类Dictionary。其中Dictionary类是一个已经被废弃的类。

初始化大小

Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

2.拥有的方法

HashTable比HashMap多了两个公开方法。一个是elements,这来自于抽象类Dictionary,鉴于该类已经废弃,所以这个方法也就没什么用处了。另一个多出来的方法是contains,这个多出来的方法也没什么用,因为它跟containsValue方法功能是一样的。

public synchronized boolean contains(Object value) {
     if (value == null) {
         throw new NullPointerException();
     }

     Entry tab[] = table;
     for (int i = tab.length ; i-- > 0 ;) {
         for (Entry<K,V> e = tab[i] ; e != null ; e = e.next) {
             if (e.value.equals(value)) {
                 return true;
             }
         }
     }
     return false;
 }

 public boolean containsValue(Object value) {
     return contains(value);
 }

3.线程安全性

Hashtable的方法是同步的,几乎每个方法都做了同步。而HashMap则是非同步的,所以在多线程场合要手动同步HashMap,这个区别就像Vector和ArrayList一样。

java.util.HashTable

public synchronized V get(Object key) {
    Entry tab[] = table;
    int hash = hash(key);
    int index = (hash & 0x7FFFFFFF) % tab.length;
    for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
        if ((e.hash == hash) && e.key.equals(key)) {
            return e.value;
        }
    }
    return null;
}

public Set<K> keySet() {
    if (keySet == null)
    //使用了Collections.synchronizedSet进行了同步包装。
        keySet = Collections.synchronizedSet(new KeySet(), this);
    return keySet;
}

4.Null Key 和 Null Value

HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常。即Hashtable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

5.遍历方式

两个遍历方式的内部实现上不同。
Hashtable使用Enumeration,HashMap使用Iterator。
Hashtable比HashMap多一个elements方法用于遍历。
哈希值的使用不同,Hashtable直接使用对象的hashCode,而HashMap重新计算hash值,而且用于代替求模。

六.淘汰问题

HashTable已经被淘汰了。新写代码不推荐使用HashTable。

//HashTable的类注释:
If a thread-safe implementation is not needed, it is recommended to use HashMap in place of Hashtable. If a thread-safe highly-concurrent implementation is desired, then it is recommended to use java.util.concurrent.ConcurrentHashMap in place of Hashtable.

翻译过来即不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。

七.参考

http://www.cnblogs.com/xinzhao/p/5644175.html
http://cmsblogs.com/?p=618
http://blog.youkuaiyun.com/zheng0518/article/details/42199477

centos7安装Ambari 2.7.5 + HDP3.1.5 准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9 阅读详情

相关推荐

ESP32-S3 USB下载模式深度解析:从UART0到TinyUSB的硬件设计与避坑指南

本文深度解析ESP32-S3的三种USB下载模式:UART0、Hardware CDC和基于TinyUSB的USB-OTG CDC。详细探讨各模式的硬件设计要点、电平异常问题、eFuse配置及避坑指南,帮助开发者优化设计,提升量产效率和系统稳定性。

gold的博客 1290

Java Hashtable keySet()方法与示例

哈希表类keySet()方法 (Hashtable Class keySet() method) keySet() method is available in java.util package. keySet()方法在java.util包中可用。 keySet() method is used to return a set of keys to be viewed in a set in ...

cumt951045的博客 743

python——体育收入排行2012-2019

请分析文件并读取数据,完成以下功能: 1. 某年的收入排名前若干名选手 如果输入n是2012-19之间的年份,则可以输入整数k,输出n年的前k名排名信息。如果k大于当年排名运动员人数,则输出当年所有的信息。每行一名运动员信息,以' | '间隔该行各项信息。 2. 某年属于某个运动项目的所有运动员信息,和收入总和 如果输入的是'sport'(不区分大小写),则可以继续输入一个年份201*,输出一个当年排行中的运动项目菜单,按照字符串升序排列,格式见示例,再输入运动项目对应的数字来输出该项运动当

m0_62488776的博客 2257

论HashMap、Hashtable、TreeMap、LinkedHashMap的内部排序

HashMap、Hashtable的存储顺序跟key 所对应的hashCode有关,但是有小规律,当key的值不超过16时,HashMap的存取是按照从小到大的顺序来存取的, 当key的个数不超过11且key的值不超过11时,Hashtable的存取是按照从大到小的顺序来存取的。 TreeMap 的顺序按照从小到大,LinkedHashMap的顺序有两种,一种是按插入顺序,一种是按访问顺序,取决于accessOrder是否为true。

单行线的专栏 2500

2.1 跟网型控制原理与局限性

本文深入分析了并网变流器的跟网型(GFL)控制技术及其局限性。GFL控制将变流器视为受控电流源,依赖锁相环(PLL)跟踪电网电压,在强电网下表现良好,但在弱电网中面临严峻挑战。研究发现,当电网短路比降低时,PLL动态与电网阻抗的负交互会导致系统失稳,同时GFL变流器缺乏电压支撑能力和惯量响应能力,在故障时易脱网。相比之下,构网型(GFM)控制具有电压源特性,能自主构建电网电压,更适合弱电网环境。随着新能源占比提高,GFL控制正逐渐被更具主动支撑能力的GFM控制所替代。

技术工作者 998

从“破解”到应用:三菱数控系统M80协议逆向分析与工业数据采集网关搭建指南

本文深入解析三菱数控系统M80协议的逆向分析方法与工业数据采集网关搭建技术。通过TCP协议实现跨平台通信,详细介绍了M80协议的数据包结构、多语言实现方案(C#、Java、C/C++)以及Linux数据采集网关的架构设计与容器化部署。为工业自动化领域的开发者提供从协议分析到企业级数据采集落地的完整解决方案。

weixin_29228781的博客 1212

数据结构--哈希表

在哈希表中,输入空间是所有 key ,输出空间是所有桶(数组索引)。「哈希表 hash table」,又称「散列表」,其通过建立键 key 与值 value 之间的映射,实现高效的元素查询。当发生冲突时,平方探测不是简单地跳过一个固定的步数,而是跳过“探测次数的平方”的步数,即1,4,9,…对于上述示例中的哈希函数,当输入的 key 后两位相同时,哈希函数的输出结果也相同。从本质上看,哈希函数的作用是将所有 key 构成的输入空间映射到数组所有索引构成的输出空间,而输入空间往往远大于输出空间。

xd__xy的博客 1986

基于PLC的图书馆机器人设计与仿真

本文设计了一种基于PLC的图书馆机器人系统,该系统能提升图书馆自动化管理水平,选用西门子S7-1200系列PLC作为核心控制单元,结合电机驱动、传感器采集以及超声波避障等技术,设计出机器人行走、图书识别与分拣的功能模块,系统借助条形码扫描模块获取图书信息,将其分析后与设定的存放位置做对比,精准达成图书的存取和归还。仿真结果显示,机器人执行任务时运动控制响应时间是0.35秒,避障成功率为98.3%,图书识别准确率高达99.4%,在控制系统方面,运用STEP7-MICRO/WIN软件编程,结合WINCC设计组态

weixin_44553616的博客 1926

哈希表(Hash Table)详解

✅ 查找、插入、删除速度快(O(1) 平均)✅ 适合需要频繁查询的数据结构。

FHKHH的博客 929

直线型一阶倒立摆1---从理论到实践的桥梁

本文深入探讨了直线型一阶倒立摆在控制理论中的核心地位,从非线性控制、鲁棒性到实时反馈等关键问题。通过实际案例和硬件搭建指南,帮助读者理解从理论到实践的过渡,特别适合控制工程初学者和研究人员。文章还提供了算法选型建议和硬件避坑手册,是掌握倒立摆控制的实用指南。

weixin_29047545的博客 319

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节

本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。

e4f5g6h7的博客 437

HashTable的五种遍历方式

package com.xing.lab.util; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class TraverseHashTab

zcl1199的博客 3万+

告别Selenium!纯Python+Requests搞定微信视频号登录Cookie(附完整代码与避坑指南)

本文详细介绍了如何利用纯Python和Requests库实现微信视频号的自动化登录,替代传统的Selenium方案。通过解析HTTP请求交互流程,提供完整的代码实现和避坑指南,显著提升爬虫效率和隐蔽性,适用于轻量化爬虫开发。

weixin_30642561的博客 312

遍历HashTable

<br />HashTable遍历与数组类似,都可以使用foreach语句。这里需要注意的是,由于HASHTABLE中的元素是一个键值对,因此需要使用DICTIONARYENTRY类型来进行遍历。DICTIONARYENTRY类型表示已个键值对的集合<br /> <br />            Hashtable hashtable = new Hashtable();<br />            hashtable.Add("钻石蓝", "DiamondBlue.ssk");<br />    

德仔 1641

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Hash、HASHTABLE底层原理【Redis对象篇】

Hash、HASTABLE【Redis对象篇】

席万里的博客 1525

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

HashTable

扩容是数据太多存不下了,那如果太富裕呢,比如原来可能数据较多,发生了扩容,但后面数据不再需要,被删除了,此时多余的空间就是一种浪费。Redis的扩容策略基于负载因子和写时复制机制的权衡:当负载因子≥1时,哈希表性能开始下降,本应触发扩容,但如果此时正在执行BGSAVE或BGREWRITEAOF(会fork子进程并使用写时复制技术),扩容将导致内存页被大量修改,使内存占用量短时间内近翻倍增长,因此Redis选择暂不扩容以优先保证内存稳定;此时,rehash 完成,旧哈希表被释放,新哈希表替换旧哈希表,

2301_79567474的博客 553

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

HashMap和Hashtable ConcurrentHashMap 和 HashTable

HashMap和HashtableHashMap是 JDK 1.2 引入的现代实现,牺牲线程安全换取高性能,支持null值,适合单线程场景。Hashtable是 JDK 1.0 的古老实现,通过全表加锁保证线程安全,性能低下且不支持null,已被替代。实际开发中,HashMap是默认选择;多线程场景推荐,而非Hashtable。

2502_92141759的博客 746

Hashtable 与 HashMap 的区别,以及为何 Hashtable 已经过时

本文对比了Java中Hashtable和HashMap的主要区别,分析了Hashtable过时的原因。Hashtable作为早期线程安全实现,采用粗粒度锁导致性能低下,不支持null键值,且使用过时的Enumeration遍历方式。相比之下,HashMap功能更全面、灵活性更高,在多线程场景下推荐使用ConcurrentHashMap。官方已明确建议用HashMap(非并发场景)和ConcurrentHashMap(并发场景)替代Hashtable,新项目应避免使用这一过时类。

笑衬人心的博客 559

HashMap 与 HashTable 区别

HashMap和Hashtable线程安全性HashMap是非线程安全的,而Hashtable是线程安全的。性能:由于没有同步开销,HashMap在单线程环境中的性能优于Hashtable。Null键和Null值HashMap允许一个null键和多个null值,而Hashtable不允许null键和null值。继承关系HashMap继承自并实现了Map接口,而Hashtable继承自Dictionary类,属于Java的早期类。迭代器机制HashMap使用Fail-Fast迭代器,而。

Flying_Fish_roe的博客 2271

HashMap和HashTable

hashMap基于哈希表,底层结果由数组实现,添加到map里的元素以 key-value的形式存储在数组中,在数组中key-value已一个实体的形式存储, 也就是继承至map接口中的entry,下图是map源码enrty。

Small_white_528的博客 1237

Hashtable的原理,并说出HashMap与Hashtable的区别

HashTable Hashtable 是一个散列表,与HashMap相同,它存储的内容是键值对(key-value)映射。 Hashtable 方法都是synchronized修饰的,说明Hashtable是线程安全的, 它的key、value都不可以为null。 Hashtable<String, Object> map = new Hashtable<>()...

yongxuezhen的博客 1301

HashMap,HashTable,TreeMap,HashSet,TreeSet

本文承接上文 https://blog.csdn.net/worn_xiao/article/details/105900828 2.2 map Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。 2.2.1 map常用元素 1 添加,删除操作: ...

worn_xiao的博客 909

java hashtable 初始化_java hashtable 初始化为啥是11

et = entry;int i = index;Entry[] t = table;/* Use locals for faster loop iteration */while (et == null && i > 0) {et = t[--i];}entry = et;index = i;if (et != null) {Entrye = lastReturned = ...

weixin_34434843的博客 1148

java hashtable 初始化_Java中HashTable和HashMap

首先介绍一下HashTable和HashMap的区别:1.HashMap是非线程安全的,HashTable是线程安全的;(线程安全就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问)2.HashMap的键或值都允许有null,而HashTable则不行。3.因为线程安全的问题, Hash...

weixin_31100203的博客 843

ConcurrentHashMap 和 Hashtable 的区别

Hashtable是 Java 中最早引入的线程安全的Map实现之一。Hashtable是通过对整个映射表进行同步来实现线程安全的,即所有对Hashtable的读写操作都被同步在同一个锁上。这样虽然保证了线程安全性,但也导致了严重的性能瓶颈,尤其是在多线程环境下,当多个线程同时访问Hashtable时,由于锁的争用,性能会显著下降。和Hashtable都是用于实现线程安全的Map线程安全机制Hashtable采用简单的全表同步机制,而则采用分段锁和 CAS 操作,锁的粒度更细,并发性能更高。性能。

Flying_Fish_roe的博客 1750
上一篇: HashMap(2): EntrySet、KeySet实现原理
下一篇: HashSet
nowseeme
博客等级 码龄10年 11粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值