而爸爸妈妈时常告诉我,要养成“东西放回原位”的习惯,所以我借助人工智能的知识做了一个物品自动识别并提示把东西放回原位的小提醒器,让我和弟弟都养成好习惯。...然后,在爸爸的帮助下,通labelImg软件对图片进行标注,以得到满足PaddleX要求的训练标注格式。 ? 然后,启动PaddleX选择目标检测类应用,按照要求导入数据并启动训练。...让程序在计算机上启动,然后通过远程摄像头进行了实验所需的实时摄像数据采集。程序对识别出来是危险文具标签的物品进行警告处理,然后显示在屏幕上。 ?...下面是实验测试的视频,在摄像头扫过的地方能把危险的剪刀圈出来并提示警示信息: ? 有了这个人工智能程序,还可以结合提示屏幕或者喇叭,进行声音提示。这个在后续Jetson固件集成中再做尝试。...在制作“小提醒器”的过程中,还学习了如何通过PaddleX可视化客户端进行目标检测的模型训练,包括如何标注实验样本数据。
---- 扩容方案 当HashMap中的数据越来越多,那么发生hash冲突的概率也就会越来越高,通过数组扩容可以利用空间换时间,保持查找效率在常数时间复杂度。那什么时候进行扩容?...从图中我们可以看到,在新数组中的hash结果,仅仅取决于高一位的数值。如果高一位是0,那么计算结果就是在原位置,而如果是1,则加上原数组的长度即可。...HashMap把每个链表拆分成两个链表,对应原位置或原位置+原数组长度,再分别插入到新的数组中,保留原来的节点顺序,如下: ? 前面还遗留一个问题:头插法会形成链表环。这个问题在线程安全部分讲解。...,原位置+老数组长度 // 把原链表拆成两个链表,然后再分别插入到新数组的两个位置上 // 不用多次调用put方法...找了需要判断是否更新并返回旧value,没找到需要插入新的Node、更新节点数并判断是否需要扩容。 查找分为三种情况:数组、链表、红黑树。
,影响查询效率,比如,把0.75改成1,这个时候数组的长度为16的时候,才会进行扩容。...元素添加的逻辑 在获取Node位置后,如果存在不在哈希表中,就新增一个Node,并添加哈希表中,整个流程如下 ?...HashMap扩容 在1.7jdk中,HashMap整个扩容过程就是分别取出数组元素,一般该元素是最后一个放入链表的元素,然后遍历以该元素为头的链表元素,一次遍历元素的hash值,计算在新数组中的下标,...因此证明,扩容之后,元素要么在原位置,要么在原位置加原位置的长度 ?...可以看到,扩容之后元素的位置是否改变,完全取决于紫色框中的运算结果是0还是1,如果是0则新位置和原位置相同,如果是1,新位置=原位置+原数组长度,说明在jdk1.8中扩容并不用重新计算hash值。
扩容方案 当HashMap中的数据越来越多,那么发生hash冲突的概率也就会越来越高,通过数组扩容可以利用空间换时间,保持查找效率在常数时间复杂度。那什么时候进行扩容?...img 从图中我们可以看到,在新数组中的hash结果,仅仅取决于高一位的数值。如果高一位是0,那么计算结果就是在原位置,而如果是1,则加上原数组的长度即可。...HashMap把每个链表拆分成两个链表,对应原位置或原位置+原数组长度,再分别插入到新的数组中,保留原来的节点顺序,如下: ?...,原位置+老数组长度 // 把原链表拆成两个链表,然后再分别插入到新数组的两个位置上 // 不用多次调用put方法...找了需要判断是否更新并返回旧value,没找到需要插入新的Node、更新节点数并判断是否需要扩容。 查找分为三种情况:数组、链表、红黑树。
简介 在编程开发中,我们经常会需要频繁创建和销毁同类对象的情形。这样的操作很可能会对性能造成影响。这时,常用的优化手段就是使用对象池(object pool)。需要创建对象时,我们先从对象池中查找。...如果有空闲对象,则从池中移除这个对象并将其返回给调用者使用。只有在池中无空闲对象时,才会真正创建一个新对象。另一方面,对象使用完之后,我们并不进行销毁。而是将它放回到对象池以供后续使用。...,然后调用这个对象的方法写入数据,使用完成之后再调用bytebufferpool.Put()将对象放回对象池中。...优化细节 在将对象放回池中时,会根据当前切片的容量进行相应的处理。...calls数组记录放回的对象容量落在各个区间的次数。
一、用到的模块 Markdown pygments re 安装直接使用 pip 安装最新版本即可 二、支持的 markdown格式 目前只支持 Typora编辑器所支持的 markdown格式。...三、解析思路 先用正则将代码块从文档中提取出来,再用 pygments对代码进行上色,并生成 html标签。...四、遇到的问题 1、如何将上色后的代码放回原位 一开始我想直接使用占位符替换原来的代码,然后再根据占位符来将代码插入回原来的位置。...但是在仔细看过 re库的使用后,我发现 re.sub() 方法是可以接受一个函数来返回需要替换的字符串。...返回的字符串可以直接插入 html页面中(Django中记得使用 safe过滤器)。
JSON其实是一个网络对象,它比XML、更简洁更方便在网络传输。DOM、和JSON、的关系是DOM、是JOSN串在内存中的表示。...在插入节点的过程中需要注意 `document` 和 `value` 的生命周期并且正确地使用 allocator 进行内存分配和管理。...当要解析一个 JSON 并生成 DOM,这种分配器是非常合适的。...从外部传入一个定义好一个大数组也可以算是内存分配器。...实际应用中,这些场合是非常普遍的,例如反序列化 JSON 至 C++ 对象、处理以 JSON 表示的 web 请求等。 使用原位解析的前置限制条件 整个 JSON 须存储在内存之中。
大彬:以JDK1.8为例,当往HashMap放入元素时,如果元素个数大于threshold时,会进行扩容,使用2倍容量的数组代替原有数组。...大彬:由于数组的容量是以2的幂次方扩容的,那么一个Entity在扩容时,新的位置要么在原位置,要么在原长度+原位置的位置。...大彬:也就是说,在元素拷贝过程不需要重新计算元素在数组中的位置,只需要看看原来的hash值新增的那个bit是1还是0,是0的话索引没变,是1的话索引变成“原索引+oldCap”(根据e.hash & (...大彬:进行查找操作时,首先在根节点进行二分查找,找到key所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的数据项。...大彬:因为B树的分支结点存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫。而由于B+树的数据都存储在叶子结点中,叶子结点均为索引,方便扫库,只需要扫一遍叶子结点即可。
Java 中所有的对象都有 Hash 方法,Java中的所有对象都继承 Object 类中定义的 hashCode() 函数的默认实现。...table中存放指向链表的引用,table 它在resize()方法中初始化,并不是在构造方法里面初始化的" transient int size; "HashMap数组中的元素个数...3、将hashMap的临界值修改为扩容后的临界值4、根据扩容后的容量新建数组,然后将hashMap的table的引用指向新数组。5、将旧数组的元素复制到table中。...在该过程中, 涉及到几种情况, 需要分开进行处理(只存有一个元素, 一般链表, 红黑树)JDK1.8 HashMap 扩容阶段重新映射元素时不需要像 1.7 版本那样重新去一个个计算元素的 hash 值...具体原因如下:因为我们使用的是 2 次幂的扩展(指长度扩为原来 2 倍),所以,元素的位置要么是在原位置,要么是在原位置再移动 2 次幂的位置。
获取元素 如果没有冲突,即该下标对应的bucket中只有一个元素,则直接取该元素 如果产生了冲突,则通过key.equals(k)去查找对应的entry:若为树则在树中通过key.equals(k)查找...O(logn); 若为链表则在链表中通过key.equals(k)查找O(n) 扩容 当put元素时,如果bucket中的元素超过容器容量大小*负载因子就要扩容 创建一个新数组,容量是之前的2倍,然后将之前的元素拷贝到新数组中...在1.8中元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置 LinkedHashMap HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap元素插入的顺序,也就是无序...属性值为null,则创建一个ThreadLocalMap对象并赋值给当前线程的threadLocals属性,然后以ThreadLocal本身为key,将值存到ThreadLocalMap对象中 get元素时...,获取当前线程的threadLocals属性值(即ThreadLocalMap对象),然后以ThreadLocal本身为key从ThreadLocalMap对象中获取值 HashMap采用拉链法处理哈希冲突
扩展后Node对象的位置要么在原位置,要么移动到原偏移量两倍的位置。...因此逻辑相对简单:在准备好新的数组后,map会遍历数组的每个“桶”,然后遍历桶中的每个Entity,重新计算其hash值(也有可能不计算),找到新数组中的对应位置,以头插法插入新的链表。...元素迁移的过程中在多线程情境下有可能会触发死循环(无限进行链表反转)。...全部按照原来方法进行计算(即hashCode ->> 扰动函数 ->> (h&length-1)) 按照扩容后的规律计算(即扩容后的位置=原位置 or 原位置 + 旧容量) 数组+链表改成了数组+链表或红黑树...扩容的时候1.7需要对原数组中的元素进行重新hash定位在新数组的位置,1.8采用更简单的判断逻辑,位置不变或索引+旧容量大小; 在插入时,1.7先判断是否需要扩容,再插入,1.8先进行插入,插入完成再判断是否需要扩容
在这种情况下,这意味着从数组中取出一个数字,将其加倍,然后将其放回新的数组中。...) } 因此:map()将从其容器中取出一个值,使用您指定的代码对其进行转换,然后将其放回其容器中。...这意味着map()方法也存在于可选对象上:从容器中取出值(可选),使用我们提供的闭包对其进行转换,然后将其放回容器中(另一个可选对象)。...“Unknown user”) 因此,如果name包含字符串,则map()会将解包,将其转换为“ Hi, name包含的字符串”,然后将整个拼接后的字符串放入一个可选对象中并返回以存储在greeting...然后,我们研究了map()在可选对象上的工作方式:如果它具有一个值,则可以对其进行解包,转换和重新包装,但是如果它为nil,则保持为nil。
= null); } } return null; } jdk7中的问题 在多线程环境下,JDK 7中数组+链表的HashMap实现,链表有可能出现成环...,然后查找的时候遍历链表就产生死循环了,因为多线程环境下线程调度不可预知,这种情况很难重现。...1就可以知道它rehash的位置,如果hash的第5位是0,就还在原位置,如果第5位是1,那么就在原位置加2^4的位置上,因此,我们可以将链表以第5位来将链表拆分成两个部分,在将第5位是0的链表放在原位置...,如果默认的equals是==作用相同,如果是基本数据类型比较的是值,如果是引用类型比较的对象在内存中的地址,hashCode()则是根据内存地址生成的,在Object源码注释中,有这样的规范 当obj1...在hashMap中,判断两个对象相不相等先判断两者hashCode值相不相等,如果hashCode不相等就没必要比较了,如果相等在调用equals方法判断两者对象是否相等。
四、深入理解Java中的HashMap「网易面试快答」文章中主要针对面试中常见的面试问题进行简单解答。...五、深入理解JDK1.7中HashMap哈希冲突解决方案 和 六、深入理解JDK1.8中HashMap哈希冲突解决方案 中对HashMap中哈希冲突及减少哈希冲突的解决方案做详细的介绍,并通过源码加深大家的理解...-1)相 * 与得到 e该存放到新数组中的下标 * 然后把e放入对应新数组的下标中。...rehash之后,元素的位置要么是在原位置,要么是在原位置加原数组长度的位置?...总结 jdk1.8中在计算新位置的时候并没有跟1.7中一样重新进行hash运算,而是用了原位置+原数组长度这样一种很巧妙的方式,而这个结果与hash运算得到的结果是一致的,只是会更块。
冒泡排序 例子(对数字排序): 假设有这样一组数字:32, 8, 128, 2, 64 现在对其进行冒泡排序(*表示下次比较的开始数字): 32>8?...现在找出剩余数字 8, 32, 2, 64 中的最大数: 8>32? false: 保持原位置不动 8, 32*, 2, 64; 32>2 ?...例子(对上述排序好的数字进行查找): 有如下排序好的数字:2, 8, 32, 64, 128 索引值分别为 0, 1, 2, 3, 4 如何查找数字 2 的索引呢?...false,说明数值2的索引在索引2的前面; 取索引0和索引2的中间索引值1,索引1处的值为8, 8<2 ? false,说明数值2的索引在索引1的前面; ......依次取值比较即可得到数值2的索引为1; 程序实现如下: 参数表示在数组intArr中查找值value所在的索引 public static int binarySearch(int value, int
是否为红黑树,添加数据到红黑树中。 上面都不符合,就是普通链表,遍历链表,如果链表存在相同key就替换,否则在链表最后添加数据。 不存在节点,就创建新的节点并赋值。...链表有多个元素,是否为红黑树 是红黑树,在红黑树查找 不是红黑树,就遍历普通链表,直到匹配到相同的hash和key值。...流程图: 总结 本文主要讲解了元素的添加、查找、扩容等主要方法,其中添加和查询都需要先获取数组的下标,然后进行对应的操作。 put添加 首次添加数据需要对数组进行扩容。...红黑树,在红黑树中查找 否则就是普通链表,遍历链表直到匹配到相同的hash和key。 不是,返回null。 是的话,是否是红黑树。 没有值,返回null 有值 *hash和key相等的话,返回节点。...因为数组长度都是2的幂次方,扩容后元素的位置*要么是在原位置,要么是在原位置再移动2次幂的位置。 hash&与运算原数组长度,等于0,存在原来的位置。 不等于0,就存放下标原来位置+原数组长度位置处。
一、原位粘贴技巧 CTRL+C 复制 CTRL+F 原位贴到前面 CTRL+B 原位贴到后面 二、页面切换技巧 在开多个AI文档的情况下。...六、查找/替换字体时查看字体预览的小技巧 当使用AI文件使用字体显示框和可替换字体列表框中,使用右键点击字体名称,可出现文件中使用该字体的头几个文字,这样就比较容易查找和确认。...2.把字应用一下图形样式里中的默认样式,要记得是图形样式里的第一个样式默认,而不是其它样式。 3.然后把字体里的描边再变成无,在这个基础上就可以应用渐变了,还能编辑字体。...在ai cs2中,灰度可以直接对灰度图片进行填充专色,前提是图片要转为灰度,在ai cs却不能!...】+【C】 将剪贴板的内容粘到当前图形中 【Ctrl】+【V】或【F4】 将剪贴板的内容粘到最前面 【Ctrl】+【F】 将剪贴板的内容粘到最后面 【Ctrl】+【B】 删除所选对象 【DEL】 选取全部对象
在JDK1.8中,对HashMap这二点进行了优化。第一点是经过rehash之后元素的位置,要么是在原位置,要么是在原位置再移动2次幂的位置。...所以经过rehash之后,元素的位置要么是在原位置,要么是在原位置加原数组长度的位置。...会有内存占用问题,在复制的时候只是复制容器里的引用,只是在写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所以有两份对象内存。...不保证原子性:线程1从主内存中拿了一个值为1的数据到自己的工作空间里面进行加1的操作,值变为2,写回主内存,然后还没有来得及通知其他线程,线程1就被线程2抢占了,CPU分配,线程1被挂起,线程2还是拿着原来主内存中的数据值为...在查找时也是先落桶,然后在key[index++]中逐个比较key。所以,对比整个数据结构,省的不止是int vs Integer,还有每个Node的内容。
领取专属 10元无门槛券
手把手带您无忧上云