HashMap()中的分组组数与阈值之间的关系是什么?

我就直接上图了
我在详细的说一下我想问的问题点:
为什么我下面的代码执行完并没有扩容,但是允许的个数为2,现在我存了3个???
图片说明

7个回答

更正一下
null != table[bucketIndex]表示的是数组中hash值取余冲突的情况,也就是说,即使存放的数据数量超过threshold,但是如果存放位置是数组上的闲置位置(为null的位置),那么数组是不会扩容的(充分利用空间)

以下是修改后内容

看jdk1.7实现源码

   /**
     * Associates the specified value with the specified key in this map.
     * If the map previously contained a mapping for the key, the old
     * value is replaced.
     *
     * @param key key with which the specified value is to be associated
     * @param value value to be associated with the specified key
     * @return the previous value associated with <tt>key</tt>, or
     *         <tt>null</tt> if there was no mapping for <tt>key</tt>.
     *         (A <tt>null</tt> return can also indicate that the map
     *         previously associated <tt>null</tt> with <tt>key</tt>.)
     */
    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 != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

indexFor方法是将hash值映射到你数组中的位置中(数组hash值与数组大小的&运算结果),再看addEntry方法

      /**
 * Adds a new entry with the specified key, value and hash code to
 * the specified bucket.  It is the responsibility of this
 * method to resize the table if appropriate.
 *
 * Subclass overrides this to alter the behavior of put method.
 */
void addEntry(int hash, K key, V value, int bucketIndex) {
    if ((size >= threshold) && (null != table[bucketIndex])) {
        resize(2 * table.length);
        hash = (null != key) ? hash(key) : 0;
        bucketIndex = indexFor(hash, table.length);
    }

    createEntry(hash, key, value, bucketIndex);
}

threshold是容量*加载因子,4*0.5=2,你存第三个确实满足了size >= threshold,但是不满足null != table[bucketIndex],也就是说你有两个key的hash值位运算之后存放在容量为4的数组中空闲位置里(如果下标在同一个位置(hash冲突),则同一个位置上数据以链表的形式纵向存储(假定在数组上的存储为横向存储)),所以没有扩容。至于有的人扩容了有的人没有扩容,那是因为存放的key不一样,所以hash值不一样,hash值不一样位运算结果就不一样,计算结果不一样存储在数组上的位置就不一样,只要存放的位置是闲置的,数组就不会扩容,但是这里有一个上限,当数组存满了,再继续存储便一定会产生冲突,从而扩容(一个优质的hash函数,应当避免散列后冲突的情况,我想当初设计者留下0.75的默认加载因子也应该是出于对hashmap的效率保护,避免过多的链表影响效率,在数组填满75%的空间下,hash冲突的几率应该是不大的)

以下是hash源码,以及获取数组下标源码

     final int hash(Object k) {
        int h = hashSeed;
        if (0 != h && k instanceof String) {
            return sun.misc.Hashing.stringHash32((String) k);
        }

        h ^= k.hashCode();

        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }


    transient int hashSeed = 0;

  int indexFor(int h, int length) {
            // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
            return h & (length-1);
        }

one,two,three没有扩容,但是one,two,three1扩容了,可以从debug看出

下面代码是从源码中提取出来的,用来获取字符串key在数组中的位置

 public static void main(String[] args) {
        System.out.println(indexFor(hash("one"),4));
        System.out.println(indexFor(hash("two"),4));
        System.out.println(indexFor(hash("three"),4));
        System.out.println(indexFor(hash("three1"),4));
    }

     static final int hash(Object k) {
            int h = 0;
            if (0 != h && k instanceof String) {
                return sun.misc.Hashing.stringHash32((String) k);
            }

            h ^= k.hashCode();

            // This function ensures that hashCodes that differ only by
            // constant multiples at each bit position have a bounded
            // number of collisions (approximately 8 at default load factor).
            h ^= (h >>> 20) ^ (h >>> 12);
            return h ^ (h >>> 7) ^ (h >>> 4);
        }


     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);
        }

执行结果
3
1
0
3
three1跟one在数组中的存储位置冲突了,如果不扩容就会在one之后形成并列的链表形式存储,这样会大大影响Hash查询效率
结合之前我的分析,应该不难看出hashmap的扩容机理

lp18036194881
lp180361* 我目前做的不是app这块,对视频通话也不是很了解,不过网上资料应该很多
接近 2 年之前 回复
lp18036194881
lp180361* 已经看过了
接近 2 年之前 回复
qq_39026415
梦里_人 最下面有我最新的对HashMap源码错误的理解,我诚挚邀请你去看看
接近 2 年之前 回复
qq_39026415
梦里_人 不好意思这么长时间才回复你信息。最近我们公司要在app上增加视频通话的功能,正在收集资料中,请问你做过这个功能吗?
接近 2 年之前 回复

当桶的数量不变,然后元素越来越多的时候,就会发生很多的hash冲突,所以达到一个阈值,就会重新对桶的数量进行扩容

ranyixu11
doggy_coder 回复梦里_人: 感谢,学习了
接近 2 年之前 回复
qq_39026415
梦里_人 最下面有我最新的对HashMap源码错误的理解,我诚挚邀请你去看看,本帖子我采纳的回答你更应该看看
接近 2 年之前 回复
qq_39026415
梦里_人 老铁看看我贴中下面的图,是回复给你的,可以看看,如有什么问题请指出
接近 2 年之前 回复
ranyixu11
doggy_coder 回复梦里_人: 我调试了一下我的代码,在put第三个之后,就会发现table的大小变成了8,阈值变成了4,所以扩容了的。不知道你是如何判断是否扩容的,方法是否正确
接近 2 年之前 回复
qq_39026415
梦里_人 我知道这个,但是你再次看看我增加的描述吧
接近 2 年之前 回复
ranyixu11
doggy_coder 具体的关系是 加载因子x容量 = 阈值; threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
接近 2 年之前 回复

阈值= 容量*加载因子

你说的分组组数就是容量吧

qq_39026415
梦里_人 最下面有我最新的对HashMap源码错误的理解,我诚挚邀请你去看看,本帖子我采纳的回答你更应该看看
接近 2 年之前 回复
qq_39026415
梦里_人 之前没有描述清楚,现在增加了描述
接近 2 年之前 回复
qq_39026415
梦里_人 最下面有我最新的对HashMap源码错误的理解,我诚挚邀请你去看看,本帖子我采纳的回答你更应该看看
接近 2 年之前 回复

ranxiyu11 请看如下图
图片说明

qq_39026415
梦里_人 你把你的测试截图行吗?
接近 2 年之前 回复
ranyixu11
doggy_coder 卧槽,神奇,我也不知道了,我的阈值变成了4,table大小变成了8,扩容了的,和你的结果不一样
接近 2 年之前 回复

看jdk1.7实现源码
/**
* Associates the specified value with the specified key in this map.
* If the map previously contained a mapping for the key, the old
* value is replaced.
*
* @param key key with which the specified value is to be associated
* @param value value to be associated with the specified key
* @return the previous value associated with key, or
* null if there was no mapping for key.
* (A null return can also indicate that the map
* previously associated null with key.)
*/
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 e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}
    indexFor方法是将hash值映射到你数组中的位置中,可以简单理解为求余操作,再看addEntry方法
     /**
 * Adds a new entry with the specified key, value and hash code to
 * the specified bucket.  It is the responsibility of this
 * method to resize the table if appropriate.
 *
 * Subclass overrides this to alter the behavior of put method.
 */
void addEntry(int hash, K key, V value, int bucketIndex) {
    if ((size >= threshold) && (null != table[bucketIndex])) {
        resize(2 * table.length);
        hash = (null != key) ? hash(key) : 0;
        bucketIndex = indexFor(hash, table.length);
    }

    createEntry(hash, key, value, bucketIndex);
}
    threshold是容量*加载因子,4*0.5=2,你存第三个确实满足了size >= threshold,但是不满足null != table[bucketIndex],也就是说你有两个key的hash值取余之后存放在容量为4的数组中同一个下标里,同一个位置是以以链表的形式存储,所以没有扩容,其实你在存放第三个元素的时候,数组只是用了两个位置而已,至于有的人扩容了有的人没有扩容,那是因为存放的key不一样,所以hash值不一样,hash值不一样取余获得的位置就不一样,只要存放的位置不重叠,map是一定会扩容的
lp18036194881
lp180361* 你的意思是?
接近 2 年之前 回复
qq_39026415
梦里_人 首先谢谢你的回答;但是请把put中的可以从上到下换为one,two,three,有惊喜等你^_^
接近 2 年之前 回复

这是一篇错误理解,大家可以看看

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
它们之间是什么关系?
罗云彬主页上的masm32v5包不含make.exe和nmake.exe。这两个文件需单独下载,当下来后是不是要放在bin目录下(与ml.exe同一目录)?rn 如果说nmake.exe可以依据原文件修改时间的变化而按makefile中规定的内容自动完成编译和链接,那么make.exe是用来干什么的?rn 另外,makefile的扩展名是什么?该用什么东东来建立呢?(该不会是文本编辑器吧,它的放置目录有什么要求吗?)masm32下有个qeditor.exe,在它的菜单中已有编译、链接、自动控制台等选项,为什么还要用命令行方式来使用ml.exe,link.exe呢?望大侠们指点迷津!
二进制放到数组组里面
File file = new File("G:\\aa.gif"); FileInputStream input = new FileInputStream(file);rnrnrn我怎么读出的二进制放到 byte[] c; 数组里面 。谢谢
在Struts2.x中theme和template之间是什么关系?
如题
连接数,任务数,线程数是什么关系?
任务数(同时下载文件个数,从相同或则不同的服务端下载)rn我是个新手,对三者的理解是如此。请暂时不要混入其他概念在以下例子中讨论。rnrn1、如果连接数为1,任务数为2,线程数为1。那这两个任务就不能同时下载,是这样吗?除非这条连接一会儿连接这个端口,一会儿连接那个端口,也就是断了再连接。rnrn2、如果连接数为2,任务数为2,线程数为1。那两个任务能同时下载,两个连接分别对应一个任务,让后线程轮流下载这两个任务?rnrn3、如果连接数为2,任务数为1,线程数为1。那可以把任务分为两段,然后两个连接分别对应其中一段进行下载。rnrn4、如果连接数为2,任务数为2,线程数为4。那么有两个线程空闲。是这样吗?rnrnrn5、其实不干线程数任何事情,只是任务数和连接数存在关联。是这样吗?
C++和MFC之间是什么关系?
C++和MFC之间的关系一直都没搞清楚。我的理解是C++是一系列的语法规则和数据结构,而实际应用中大量的程序都是用MFC来实现的,MFC面向应用,使用C++所规定的规则,时刻都体现着面向对象的编程的思想。不知道我这样理解二者之间的关系是否正确,请大家指正。谢谢。
jar与class之间是什么关系?
新手请教
概要设计,详细设计之间的关系是什么?
我的看法:rn概要设计只说明系统有多少个模块,各模块之间的接口和个模块本身的功能rn详细设计说明某个具体模块如何实现,粒度应该比程序略高一些rnrn但是问题来了,各个模块之间是有层次关系的,也有先后逻辑关系。这就说明,在概要设计中,还必须考虑模块的实现细节,否则,你怎么知道这个模块下面要划分子模块?你怎么知道各子模块的调用顺序?rn这就说明,概要设计和详细设计是重叠进行的,而软件工程书上说的确是顺序进行的,不知道是不是我的理解有问题。rnrn举个例子,例如排序程序,如果设计2个模块:rn一个主模块用于排序rn子模块用于交换2个变量,主模块调用子模块rn但是子模块是怎么设计出来的呢?肯定是你先想到了用冒泡等排序方式的时候需要交换数据,这已经考虑了主模块足够多的细节,似乎属于“详细设计”了,但是目前进行的是概要设计,这就产生了我所说的重叠的情况。
Struts和Spring之间是什么关系?
Struts和Spring之间是什么关系?rn还有那个Hibernate
uart与超级终端之间是什么关系
在程序中并没有显示调用超级终端,但可以使用,不知道为什么
表单和文档之间是什么关系?
假如我做一条类似数据库中的纪录,用了三个表单, 那么这三个表单中的数据是存放在同一个文档中吗? 我现在想把notes里的数据全部移到关系数据库中,不知道该怎么把数据库纪录和文档对应起来。
请问它们之间的关系是什么?
请问.ChannelContentBlock ,.ChannelContentBlock H2,.ChannelContentBlock DT ,.ChannelContentBlock DD,.ChannelContentBlock DD IMG 它们之间的关系是什么?rnH2,DT ,DD,DD IMG这标签是自己定义的吗?rnrnrn.ChannelContentBlock rn MARGIN: 0px 0px 12pxrnrn.ChannelContentBlock H2 rn FONT-SIZE: 12px; MARGIN: 7px 0px 2pxrnrn.ChannelContentBlock DT rn PADDING-RIGHT: 0px; rnrn.ChannelContentBlock DD rn PADDING-RIGHT: 4px; rnrn.ChannelContentBlock DD IMG rn BORDER-RIGHT: #000 rnrnrn
WM_CREATE与WM_PAINT之间是什么关系?
程序如:rnswitch(iMessage)rnrn case WM_CREATE:rn ...rn return 0;rn case WM_PAINT:rn ......rn return 0;rn case WM_SIZE:rn ......rn return 0;rn default:rn return(DefWndProc(hwnd,iMessage,wParam,lParam));rnrn我看有些程序在WM_CREATE里定义句柄,然后在WM_PAINT里使用它.rn请问,这两个消息处理上是什么关系?
LPTSTR 与 CString 之间是什么关系?
LPTSTR 与 CString 之间是什么关系?
wininet与httprequest之间是什么关系?
httprequest是不是前者的C#封装,如果我HOOK了WININET对象,会不会影响REQUEST的效率,或是内存泄露,如何释放呢,曾经删除过这个HOOK类的指针,但发现没用,还是可以从这个指针取到数据?希望懂C++的朋友指点一二。
pear和phplib之间是什么关系
最近几天才知道原来很多操作可以抽象出来,听有人介绍phplib也有人介绍pearrn我在php的站点上看到了pear,那个phplib又是什么东东。
hibernate3.jar 和 hibernate-core-4.1.4.Final.jar之间是什么关系?
hibernate3.jar 是不是包含了hibernate-core-4.1.4.Final.jar? hibernate3.jar还包含4 的那些jar包? rnrn
cpp之间的函数是什么关系
如题 很多个cpp文件 他们是怎么联系在一起的呢谢谢 是怎么调用别人的函数的呢
PHP和Apache之间是什么关系?
Apache是怎么知道PHP路径,并去调用PHP的,rnApache是怎么和php程序通信的呢?rn如果本机上有多个版本的PHP程序,是否可以设定不同目录下网站程序,Apache自动去调用不同版本的PHP呢?rn求指导:)
unixODBC 和 MyODBC 之间的关系是什么?
谁能够说一说?我如果使用MySql,那么只使用MyODBC就可以了么?rnrn
数据库管理系统与操作系统之间的关系是什么?
数据库管理系统与操作系统之间的关系是什么?rn是并发控制关系。还是数据库管理系统调用操作系统,还是其它……
云计算和大数据之间的关系是什么?
在互联网快速发展的时代,云计算和大数据似乎是两个流行的词汇,但许多人甚至许多计算机用户都不了解云计算与从概念到功能的大数据之间的差异。差异,所以本文云容科技将告诉你云计算和大数据之间的关系。 首先,我们讨论云计算。云计算基于互联网相关服务的增长、使用和交付。它通常涉及通过互联网提供动态、可扩展且经常是虚拟化的资源。云计算可以降低全社会的IT能耗,减少排放,真正实现绿色计算。提高全社会IT设备的利用...
MPP与Hadoop之间的关系是什么?
广义的Hadoop包括 Impala, Presto | Distributed SQL Query Engine for Big Data 这些MPP架构的SQL引擎。Hadoop社区还在持续发展,Spark还在持续给人们带来惊喜,开源软件的迷人之处也在于此。 先从NUMA说起吧,NUMA全称为Non-UniformMemoryAccess,是主流服务服务器为了提高SMP的可扩展性而...
ATL和WTL之间是什么关系??
如题
opengl和显卡驱动之间是什么关系
今天看《opnengl着色器语言》,看的一塌糊涂,(不知道是不是英文版的缘故),上面说(如果理解没错的话~)opengl是显卡的驱动程序,我郁闷了,那还装什么显卡驱动,直接下载个opengl函数库不就得了?应用程序,操作系统,opengl,显卡,显卡驱动,当一副三维图形显示在屏幕上师,它们之间是怎么分工的?我晕死了,完全搞不懂啊~有人说显卡驱动支持opengl,那么为什么不把opengl函数库直接写到驱动程序中?还有,opengl函数的源代码被固化在了显卡上还是在CPU上运行?一连串问题,有点乱,还望高手指教,谢谢~
系统语言之间是什么关系?
经常看到如rnrn936,2052, gb2312, zh-cnrnrn都代表是中文,那么,哪些函数能够得到这些值?它们之间用什么函数能得到对应转换?rnrn初步理解936是代码页,可代码页有什么用?rn2052好像是用GetSystemDefaultUILanguage()取得的LANGID,这个好像用的多一些rngb2312是编码方式,好像还有gbk之类,其它语言里还有哪些编码方式?rnzh-cn又是什么东西?rnrnrn
BITMAPFILEHEADER 和 BITMAPINFO 之间是什么关系
[code=C/C++]rnrnBITMAPFILEHEADER * DibLoadImage(PTSTR pstrFileName);rnstatic BITMAPFILEHEADER * pbmfh;rnstatic BITMAPINFO * pbmi;rnrnpbmfh = DibLoadImage(szFileName);rnpbmi = (BITMAPINFO *)(pbmfh+1); //不懂rnrn[/code]rnrnBITMAPFILEHEADER 和 BITMAPINFO 之间是什么关系,为什么 BITMAPFILEHEADER 的指针 加1 就可以转化为相应的BITMAPINFO
模块与进程之间是什么关系?
MFC程序初始化中会调用基类CWinApp::CWinApp的构造函数,其中有:rnAFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();rn这应该是获取一个指向模块的指针。rnrn我想请教的是模块、进程、实例之间的关系。rnrn一个应用程序可以启动多个实例,每个实例应该是单独的进程,似乎也应该是单独的模块,那模块与进程之间是什么关系,装载运行的那个环节建立模块数据,又保存在哪里,与操作系统会为进程建立一个object,与模块又什么关系?rnrn[code=c]CWinApp::CWinApp(LPCTSTR lpszAppName)rnrn if (lpszAppName != NULL)rn m_pszAppName = _tcsdup(lpszAppName);rn elsern m_pszAppName = NULL;rnrn // initialize CWinThread statern AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();rn ENSURE(pModuleState);rn AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;rn ENSURE(pThreadState);rn ASSERT(AfxGetThread() == NULL);rn pThreadState->m_pCurrentWinThread = this;rn ASSERT(AfxGetThread() == this);rn m_hThread = ::GetCurrentThread();rn m_nThreadID = ::GetCurrentThreadId();rnrn // initialize CWinApp statern ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object pleasern pModuleState->m_pCurrentWinApp = this;rn ASSERT(AfxGetApp() == this);rnrn .......rn m_nSafetyPoolSize = 512; // default sizern[/code]
在图像处理中阈值是什么意思?
的意思是界限,故阈值又叫临界值,是指一个效应能够产生的最低值或最高值。在图像处理中它的意思是颜色转换的临界点,该方法只用于二值化的图像中列如在自然中每一种颜色都有一个值,通常由RGB(即红、绿、蓝三原色)按比例混合就会得到各种不同的颜色。阈值处理图片是对颜色进行特殊处理的一种方法。详细说,阈值是一个转换临界点,不管你的图片是什么样的彩色,它最终都会把图片当黑白图片处理,也就是说你设定了一个阈值之后...
一个简单的递归实现数组组元素的组合
import java.util.*; import java.io.*; @SuppressWarnings("unchecked") public class Test { public static void main(String[] args) throws Exception { String[] array = new String[]{"1","2","3","4"};
hashmap ,hashtable,hashset 之间的区别是什么》?
hashmap ,hashtable,hashset 之间的区别是什么》?
Delphi中的TPUtilWindow是什么?与菜单之间是什么关系?
Delphi中的TPUtilWindow是什么?与菜单之间是什么关系?。。。。。。。谢谢!
求助一个二维数组组装成字符串的算法
求助一个算法,用一个二维数(String[][] addrArr = new String[][5];)组保存若干行政信息,数组的每行是一条完整的信息,如:[黑龙江省][哈尔滨市][南岗区],数组的列数不确定,但最多不超过5列,多出的数组元素用空字符串填充,需要将这些信息组装成一个长字符串,同一行政区划各级之间不分隔,直接连接,有重复的则下级行政区划用“、”分隔,没有重复的各行均用“、”分隔,例如下面几个例子rnrn例1:rn[黑龙江省][哈尔滨市][南岗区]rn[山东省][青岛市]rnrn组转完成为:黑龙江省哈尔滨市南岗区、山东省青岛市rnrn例2:rn[黑龙江省][哈尔滨市][南岗区]rn[黑龙江省][哈尔滨市][道里区]rnrn组转完成为:黑龙江省哈尔滨市南岗区、道里区rnrn例3:rn[黑龙江省][哈尔滨市][南岗区]rn[北京市][朝阳区]rn[黑龙江省][哈尔滨市][道里区]rn[黑龙江省][齐齐哈尔市][龙沙区]rnrn组转完成为:黑龙江省哈尔滨市南岗区、道里区、齐齐哈尔市龙沙区、北京市朝阳区rnrn不知这样的算法是否能够通过Java语言实现,望算法高人指点
java中=与==之间的关系
boolean flag=false;rn if(flag==false)rn System.out.println("true");rn elsern System.out.println("false");rn rn输出:turern而rn boolean flag=false;rn if(flag=false)rn System.out.println("true");rn elsern System.out.println("false");rn rn rnrn输出false.rn
HashMap是什么?
和Hashtable,Map有什么不同rn用在哪里?
hashMap是什么
我们要想知道HashMap是什么就先要了解Hash和Map是什么 一、Hash是什么 ① 哈希查找是一种数据结构中用于 查找 的算法,相比于其他查找算法,他的时间复杂度更 低,所以在实际应用中大量采取了哈希表的方式,Hashmap就是java内置的哈希查找的方法 ② 哈希函数的基本思想: 将记录的存储地址和关键字之间建立一个确定...
cpu核数与进程、线程之间的关系
我的理解:cpu在进程中来回切换,当一个进程得到cpu后,再在线程中切换,这么理解不知道对不对,希望能够得到解答。
关于字符串和16进制数之间的关系
这几天写个小程序,遇到点小问题,问题是解决了。可是我有个疑问且看代码:rn[code=C/C++]rn#includernusing namespace std;rnvoid main()rnrn char* p= "hello";rn cout <
HashSet与HashMap关系之源码分析
本文转帖自http://lukuijun.iteye.com/blog/340756   题目:请说出hashCode方法,equals方法,HashSet,HasMap之间的关系? 解答:策略,分析jdk的源代码:   1、HashSet底层是采用HashMap实现的。     public HashSet() { map = new HashMap&amp;lt;E...
Java 中的 HashMap 的工作原理是什么?
Java 中的 HashMap 的工作原理是什么? Java 中的 HashMap 是以键值对(key-value)的形式存储元素的。HashMap 需要一个 hash 函数,它使用 hashCode()和 equals()方法来向集合/从集合添加和检索元素。当调用 put()方法的时候,HashMap 会计算 key 的 hash 值,然后把键值对存储在集合中合适的索引上。如果 key已经
HashMap,.net中对应的是什么?
我了一篇关于权限角色的文章,文中提到这样一个jsp的东东,所以来问问
相关热词 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法 c# gmail 发邮件 c# 多层文件