hashmap初试数组大小为什么一定要是2 分别求出数组中所有3的倍数之和

用HashMap存数据,然后赋值给另外一个Map类型的变量,更新另外一个变量后,原始的变量的值也更新了。_百度知道
用HashMap存数据,然后赋值给另外一个Map类型的变量,更新另外一个变量后,原始的变量的值也更新了。
目前,我有如下两个变量:Mapmap1=newHashMap();Mapmap2=newHashMap();现在我把map2的值赋给map1,然后更新map1,由于HashMap好像是地址引用,所以map2的值也被更新了。但是我希望,更...
目前,我有如下两个变量:Map map1=new HashMap();Map map2=new HashMap();现在我把map2的值赋给map1,然后更新map1,由于HashMap好像是地址引用,所以map2的值也被更新了。但是我希望,更新map1的值,不改变map2的值。不知道有没有哪位大侠有好的办法,帮忙解决下。
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
花落千殇泪知道合伙人
花落千殇泪
获赞数:20
其实这和数组的复制时一样的:从指定源数组中复制一个数组,若是用int[] array1=int[] array2; 那么将来 得到的数组 改变一个 另一个跟着改变 使用System.arraycopy()方法可以实现数组复制。那么 对于hashMap好像没有这样的方法,但是可以使用遍历hashMap的方法:public static void main(String[] args) {
Map&Integer,String& map1 = new HashMap&Integer, String&();
for(int i=0;i&10;i++){
map1.put(i, i+&--test&);
System.out.println(map1.size());
Map&Integer,String& map2=new HashMap&Integer, String&();
for (int i = 0; i & map1.size(); i++) {
Iterator iter = map1.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
map2.put(i, map1.get(key));
} }你可以试验一下 ,应该没有问题的。PS:为什么一定要把数据copy到新的map里去?给个理由先。这又不是C++,对象脱离作用域就会被销毁。直接把map的引用拿去用不就行了吗?
谢谢,我已经解决了。您的方法确实是可行的。至于我为什么要这样,是因为,我需要把一个map1的值,拿来跟多个map去比较,有相同的就删除,不同的就记录下来。所以,第一次比较下来,map1的值就发生了变化,剩下的map再次来比较就不行了。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。韬光养晦,有所作为。
Hashmap为什么容量是2的幂次,什么是负载因子
本人在准备求职面试的时候,面经里经常会有这样的一个面试题:“Hashmap为什么容量是2的幂次,什么是负载因子?”
在最初的时候,我也反复搜索,但是没有一篇博文能完整或清晰解答这个问题。
在下此文为博采众长,总结了多篇文章对于这个问题的解答,希望对大家有所帮助。
本文来自:,原文地址:,转载请注明。
HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构,我们总会在不经意间用到它,很大程度上方便了我们日常开发。在很多Java的笔试题中也会被问到,最常见的,“HashMap和HashTable有什么区别?”,这也不是三言两语能说清楚的,这种笔试题就是考察你来笔试之前有没有复习功课,随便来个快餐式的复习就能给出简单的答案。
HashMap计划写两篇文章,一篇是HashMap工作原理,也就是本文,另一篇是多线程下的HashMap会引发的问题。这一年文章写的有点少,工作上很忙,自己业余时间也做点东西,就把博客的时间占用了,以前是力保一周一篇文章,有点给自己任务的意思,搞的自己很累,文章质量也不高,有时候写技术文章也是需要灵感的,为了举一个例子可能要绞尽脑汁,为了一段代码可能要验证好多次,现在想通了,有灵感再写,需要一定的积累,才能把自己了解的知识点总结归纳成文章。
言归正传,了解HashMap之前,我们需要知道Object类的两个方法hashCode和equals,我们先来看一下这两个方法的默认实现:
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
equals方法我们太熟悉了,我们经常用于字符串比较,String类中重写了equals方法,比较的是字符串值,看一下源码实现:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
if (anObject instanceof String) {
String anotherString = (String) anO
int n = value.
if (n == anotherString.value.length) {
char v1[] =
char v2[] = anotherString.
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
return true;
return false;
重写equals要满足几个条件:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
下面来说说hashCode方法,这个方法我们平时通常是用不到的,它是为哈希家族的集合类框架(HashMap、HashSet、HashTable)提供服务,hashCode 的常规协定是:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
当我们看到实现这两个方法有这么多要求时,立刻凌乱了,幸好有IDE来帮助我们,Eclipse中可以通过快捷键alt+shift+s调出快捷菜单,选择Generate hashCode() and equals(),根据业务需求,勾选需要生成的属性,确定之后,这两个方法就生成好了,我们通常需要在JavaBean对象中重写这两个方法。
好了,这两个方法介绍完之后,我们回到HashMap。HashMap是最常用的集合类框架之一,它实现了Map接口,所以存储的元素也是键值对映射的结构,并允许使用null值和null键,其内元素是无序的,如果要保证有序,可以使用LinkedHashMap。HashMap是线程不安全的,下篇文章会讨论。HashMap的类结构如下:
类 HashMap&K,V&
java.util.HashMap&K,V&
所有已实现的接口:
直接已知子类:
HashMap中我们最长用的就是put(K, V)和get(K)。我们都知道,HashMap的K值是唯一的,那如何保证唯一性呢?我们首先想到的是用equals比较,没错,这样可以实现,但随着内部元素的增多,put和get的效率将越来越低,这里的时间复杂度是O(n),假如有1000个元素,put时需要比较1000次。实际上,HashMap很少会用到equals方法,因为其内通过一个哈希表管理所有元素,哈希是通过hash单词音译过来的,也可以称为散列表,哈希算法可以快速的存取元素,当我们调用put存值时,HashMap首先会调用K的hashCode方法,获取哈希码,通过哈希码快速找到某个存放位置,这个位置可以被称之为bucketIndex,通过上面所述hashCode的协定可以知道,如果hashCode不同,equals一定为false,如果hashCode相同,equals不一定为true。所以理论上,hashCode可能存在冲突的情况,有个专业名词叫碰撞,当碰撞发生时,计算出的bucketIndex也是相同的,这时会取到bucketIndex位置已存储的元素,最终通过equals来比较,equals方法就是哈希码碰撞时才会执行的方法,所以前面说HashMap很少会用到equals。HashMap通过hashCode和equals最终判断出K是否已存在,如果已存在,则使用新V值替换旧V值,并返回旧V值,如果不存在
,则存放新的键值对&K, V&到bucketIndex位置。文字描述有些乱,通过下面的流程图来梳理一下整个put过程。
现在我们知道,执行put方法后,最终HashMap的存储结构会有这三种情况,情形3是最少发生的,哈希码发生碰撞属于小概率事件。到目前为止,我们了解了两件事:
HashMap通过键的hashCode来快速的存取元素。当不同的对象hashCode发生碰撞时,HashMap通过单链表来解决,将新元素加入链表表头,通过next指向原有的元素。单链表在Java中的实现就是对象的引用(复合)。
来鉴赏一下HashMap中put方法源码:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry&K,V& e = table[i]; e != null; e = e.next) {
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.
e.recordAccess(this);
return oldV
modCount++;
addEntry(hash, key, value, i);
return null;
到这里,我们了解了HashMap工作原理的一部分,那还有另一部分,如,加载因子及rehash,HashMap通常的使用规则,多线程并发时HashMap存在的问题等等,这些会留在下一章说明。
比较深入的分析了HashMap在put元素时的整体过程,中实际操作的都是数组或者链表,而我们通常不需要显示的维护集合的大小,而是集合类框架中内部维护,方便的同时,也带来了性能的问题。
HashMap有两个参数影响其性能:初始容量和加载因子。默认初始容量是16,加载因子是0.75。容量是哈希表中桶(Entry数组)的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 rehash 方法将容量翻倍。
HashMap中定义的成员变量如下:
static final int DEFAULT_INITIAL_CAPACITY = 16;
static final int MAXIMUM_CAPACITY = 1 && 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
transient Entry&K,V&[]
transient int
final float loadF
我们看字段名称大概就能知道其含义,看Doc描述就能知道其详细要求,这也是我们日常编码中特别需要注意的地方,不要写让别人看不懂的代码,除非你写的代码是一次性的。需要注意的是,HashMap中的容量MUST
be a power of two,翻译过来就是必须为2的幂,这里的原因稍后再说。再来看一下HashMap初始化,HashMap一共重载了4个构造方法,分别为:
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
(int initialCapacity,
float loadFactor)
构造一个带指定初始容量和加载因子的空 HashMap。
extends& m)
构造一个映射关系与指定 Map 相同的 HashMap。
看一下第三个构造方法源码,其它构造方法最终调用的都是它。
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity & 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity & MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor &= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
int capacity = 1;
while (capacity & initialCapacity)
capacity &&= 1;
this.loadFactor = loadF
threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
table = new Entry[capacity];
useAltHashing = sun.misc.VM.isBooted() &&
(capacity &= Holder.ALTERNATIVE_HASHING_THRESHOLD);
我们在日常做底层开发时,必须要严格控制入参,可以参考一下Java源码及各种开源项目源码,如果参数不合法,适时的抛出一些运行时异常,最后到应用层捕获。看第14-16行代码,这里做了一个移位运算,保证了初始容量一定为2的幂,假如你传的是5,那么最终的初始容量为8。源码中的位运算随处可见啊=。=!
到现在为止,我们有一个很强烈的问题,为什么HashMap容量一定要为2的幂呢?HashMap中的数据结构是数组+单链表的组合,我们希望的是元素存放的更均匀,最理想的效果是,Entry数组中每个位置都只有一个元素,这样,查询的时候效率最高,不需要遍历单链表,也不需要通过equals去比较K,而且空间利用率最大。那如何计算才会分布最均匀呢?我们首先想到的就是%运算,哈希值%容量=bucketIndex,SUN的大师们是否也是如此做的呢?我们阅读一下这段源码:
static int indexFor(int h, int length) {
return h & (length-1);
又是位运算,高帅富啊!这里h是通过K的hashCode最终计算出来的哈希值,并不是hashCode本身,而是在hashCode之上又经过一层运算的hash值,length是目前容量。这块的处理很有玄机,与容量一定为2的幂环环相扣,当容量一定是2^n时,h
& (length - 1) == h % length,它俩是等价不等效的,位运算效率非常高,实际开发中,很多的数值运算以及逻辑判断都可以转换成位运算,但是位运算通常是难以理解的,因为其本身就是给电脑运算的,运算的是二进制,而不是给人类运算的,人类运算的是十进制,这也是位运算在普遍的开发者中间不太流行的原因(门槛太高)。这个等式实际上可以推理出来,2^n转换成二进制就是1+n个0,减1之后就是0+n个1,如16
-& 10000,15 -& 01111,那根据&位运算的规则,都为1(真)时,才为1,那0≤运算后的结果≤15,假设h &= 15,那么运算后的结果就是h本身,h &15,运算后的结果就是最后三位二进制做&运算后的值,最终,就是%运算后的余数,我想,这就是容量必须为2的幂的原因。HashTable中的实现对容量的大小没有规定,最终的bucketIndex是通过取余来运算的。注:我在考虑这样做是否真的是最好,规定容量大小一定为2的幂会浪费许多空间成本,而时间上的优化针对当今越来越牛逼的CPU是否还提升了许多,有些资料上说,CPU处理除法和取余运算是最慢的,这个应该取决于语言调用CPU指令的顺序和CPU底层实现的架构,也是有待验证,可以用Java写段程序测试一下,不过我想,CPU也是通过人来实现,人脑运算的速度应该是加法&减法&乘法&除法&取模(这里指的是正常的算法,不包括速算),CPU也应是如此。
通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数
HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点,可以想想为什么)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地降低 rehash 操作次数。如果初始容量大于最大条目数除以加载因子(实际上就是最大条目数小于初始容量*加载因子),则不会发生 rehash 操作。
如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。 当HashMap存放的元素越来越多,到达临界值(阀值)threshold时,就要对Entry数组扩容,这是Java集合类框架最大的魅力,HashMap在扩容时,新数组的容量将是原来的2倍,由于容量发生变化,原有的每个元素需要重新计算bucketIndex,再存放到新数组中去,也就是所谓的rehash。HashMap默认初始容量16,加载因子0.75,也就是说最多能放16*0.75=12个元素,当put第13个时,HashMap将发生rehash,rehash的一系列处理比较影响性能,所以当我们需要向HashMap存放较多元素时,最好指定合适的初始容量和加载因子,否则HashMap默认只能存12个元素,将会发生多次rehash操作。
HashMap所有集合类视图所返回迭代器都是快速失败的(fail-fast),在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败。注意,迭代器的快速失败行为不能得到保证,一般来说,存在不同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出
ConcurrentModificationException。至于为什么通过迭代器自身的remove或add方法就不会出现这个问题,可以参考我之前的文章中第三个和第四个示例。
HashMap是线程不安全的实现,而HashTable是线程安全的实现,关于线程安全与不安全可以参考我之前的文章,所谓线程不安全,就是在多线程情况下直接使用HashMap会出现一些莫名其妙不可预知的问题,多线程和单线程的区别:单线程只有一条执行路径,而多线程是并发执行(非并行),会有多条执行路径。如果HashMap是只读的(加载一次,以后只有读取,不会发生结构上的修改),那使用没有问题。那如果HashMap是可写的(会发生结构上的修改),则会引发诸多问题,如上面的fail-fast,也可以看下,这里就不去研究了。
那在多线程下使用HashMap我们需要怎么做,几种方案:在外部包装HashMap,实现同步机制使用Map m = Collections.synchronizedMap(new HashMap(...));,这里就是对HashMap做了一次包装使用java.util.HashTable,效率最低使用java.util.concurrent.ConcurrentHashMap,相对安全,效率较高
知道为啥HashMap里面的数组size必须是2的次幂?
HashMap的长度为什么要是2的n次方
HashMap的默认容量为何为16?为何是2的整数倍?
2、HashMap的扩容是怎样扩容的,为什么是2的N次幂的大小?
Hashmap的容量为什么是2的幂次
深入理解HashMap(原理,查找,扩容)
HashMap的容量与扩容
HashMap扩容机制、线程安全
HashMap的长度为什么设置为2的n次方
HashMap的扩容机制---resize()
没有更多推荐了,发布于 01/30 17:19
1、先看结果
Map&String, String& m0 = new HashMap&&(0);// 不创建内部存储数组
m0.put("k","v");// 内部空间开辟了 1 (数组长度=1)
Map&String, String& m1 = new HashMap&&(1);// 不创建内部存储数组
m1.put("k","v");// 内部空间开辟了 1 (数组长度=1)
Map&String, String& m2 = new HashMap&&(2);// 不创建内部存储数组
m2.put("k","v");// 内部空间开辟了 2 (数组长度=2)
Map&String, String& m3 = new HashMap&&(3);// 不创建内部存储数组
m3.put("k","v");// 内部空间开辟了 4 (数组长度=4)
首先,我们应该知道HashMap内部是用数组存储数据的。
没错,下面这句话,是不创建数组的,所以结论是 0
Map&String, String& m3 = new HashMap&&(3);
2、为什么是0?
new HashMap&&(3) 只是设置了threshold(扩容阈值)和loadFactor 加载因子,请看代码
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity & 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity & MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor &= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadF
threshold = initialC
3、什么时候创建数组?
只有调用put的方法的时候才真正的创建数组,具体创建多大的数组呢?从上面的代码可以看出m3 创建了 长度=4的数组
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold); // 这句话会去创建数组
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry&K,V& e = table[i]; e != e = e.next) {
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.
e.recordAccess(this);
return oldV
modCount++;
addEntry(hash, key, value, i);
4、数组的长度为什么不是3?
k=数组长度-1,因为要保证k这个值的二进制全是1,所以new HashMap(3),实际数组长度=4,这样k=3,k的二进制值:11
如果new HashMap(5),内部数组长度=8, k=7,k的二进制:111
private void inflateTable(int toSize) {
// Find a power of 2 &= toSize
int capacity = roundUpToPowerOf2(toSize); // 这句话保证了k(k=数组长度capacity-1)的二进制值全是1
threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
table = new Entry[capacity];
initHashSeedAsNeeded(capacity);
5、分析roundUpToPowerOf2方法
private static int roundUpToPowerOf2(int number) {
// assert number &= 0 : "number must be non-negative";
return number &= MAXIMUM_CAPACITY
? MAXIMUM_CAPACITY
: (number & 1) ? Integer.highestOneBit((number - 1) && 1) : 1;
p = number-1 ,然后左移一位p&&1,&Integer.highestOneBit(p),获取最高位,其他位都是0
例子:number=3,p=(二级制0010),p左移一位等于4(二级制0100),然后获取最高位的结果是4(二级制100)
&number=6,p=5(二级制0101),p左移一位等于10(二级制1010),然后获取最高位的结果是8(二级制1000)
这样就可以的结果就可以保证k的二级制都是1了
6、为什么要保证k的二进制全是1?
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
因为要根据hash 值来索引,当前数据存放在哪个下标数组里,同时还不能越界,如上代码,把hash和length-1 进行一下与操作,就能找到该数据存放的下标,同时还不越界。
分析的jdk版本jdk7_75
如有不对,请指出!谢谢
& 著作权归作者所有
人打赏支持
码字总数 9269
笔主前言: 众所周知,String是Java的JDK中最重要的基础类之一,在笔主心中的地位已经等同于int、boolean等基础数据类型,是超越了一般Object引用类型的高端大气上档次的存在。 但是稍有研究...
本文通过介绍如何从XML文件中读入,操作DOM和输出DOM到文件来说明如何在DOM4J中通过XPath操作DOM节点. 1,读入XML Document originalTemplate1 = TemplateUtil.getDocument("com/test/xml/dom...
一、 整体诉说: 1.ArrayList是不固定的,比如用sql查询数据库,不知道有多少记录返回,用Arraylist。 2.HashMap/Hashtable 和 Vector/ArrayList 都是放一组对象,一个是用key object来定位e...
1、数组 2、切片 切片可以通过数组构建,这里不讨论这种方式 可以发现[]中有数字的是固定长度的数组,没有数字的表示切片 3、map // 先声明map var m1 map[string]string // 再使用make函数创...
package wolf. import java.util.ArrayL import java.util.HashM import wolf.love1.Love1_1; import android.os.B import android.app.A import android.content......
Map&String, String& map = new HashMap&String, String&(); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); //第一种:普遍使用,二次取值 System.out.println......
hello菜bird
集合框架介绍 我们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,之前学习的数组可以用来存储并处理大量类型相同的数据,但是通过上面的...
的书法上的
/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置。 / 两种方法: 方法一: /* * 思路:套用排序算法,并修改比较器。这里比较器用来指示两个字符串胡伟变位词就是相等的。 ...
Map Map:Map集合一次添加一对元素,Collection一次添加一个元素。 所以Map集合也称为双列集合,而Collection称为单列集合。 其实Map集合存储的就是键值对。 Map集合必须保证键的唯一性。 常...
一只小恶狼
问题:我想要利用badgeview 实现在gridview中如此的效果? 其中在gridview中 Integer[] m_ImageID= { R.drawable.a1,R.drawable.a2,R.drawable.a3, R.drawable.a4,R.drawable.a5,R.drawable......
songxiaobo
没有更多内容
加载失败,请刷新页面
分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。 分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起...
又是一个实践,这次准备爬取豆瓣电影top250,并把数据保存到mysql中,虽说数据量不大,对速度没有太大的要求,不过为了练习多进程爬虫,还是用多进程的方法写了这个爬虫。 多进程有什么用呢?...
本图转载自黄勇老师……^_^ ...
writeademo
概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了...
校验你的设置 查看你 Confluence 当前使用的设置,请参考 Viewing System Properties 页面中的内容。 识别系统属性 请参考 Recognized System Properties 页面中的内容来找到针对你安装 Conf...
怼人界“灭霸”:牛姐一句话,抹除死对头的存在 毛西
1.今日导读 你会对你讨厌的人做什么?背后捅刀子 or 当面辱骂之?看看美国流行天后玛丽亚·凯莉的做法,或许能给你一些启发。...
一、大数据是什么? 大数据,big data,《大数据》一书对大数据这么定义,大数据是指不能用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。 这句话至少传递两种信息: 1、大数据...
最近一致在更新Spring Cloud Config的相关内容,主要也是为这篇埋个伏笔,相信不少调研过Spring Cloud Config的用户都会吐槽它的管理能力太弱。因此,就有了下面为讲推荐的这个开源项目,希望...
Git提交代码时,总出现SSL certificate problem: unable to get local issuer certificate while accessing错误 在命令行执行: set GIT_SSL_NO_VERIFY=true git push...
记录一下自己的搭建经历,先看一下图片记录下整理结构 这里主要讲述elk套件的配置,其它前置环境的安装请自行百度或者脑补, 前置条件:JKD1.8(注意必须1.8或者以上),Redis(单点或者Clust...
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有}

我要回帖

更多关于 hashmap和数组哪个速度快 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信