Stringbuilder与String的对象,在HashMap的get方法差异.
引言:之前需要使用对象来跨越不同方法进行传递,结果返回后再map方法中始终无法获得到...
经过源码分析,是由于hash()方法导致的,使用StringBuilder对象即使值与String一致,产生的索引
也是不同的;
public class Test{
public static void main(String[] args) {
StringBuilder name=new StringBuilder();
name.append("key");
Map<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("key","value");
//StringBulider对象的"key"并未获取到值
System.out.println(tempMap.get(name));//输出:null
System.out.println(tempMap.get("key"));//输出:value
//查看源码分析原因,是由hash方法导致的索引值指向不同位置,使得返回结果不一致;
System.out.println(hash(name));//输出:1883673307
//只需要将StringBuilder对象转换为String即可正确获取;
System.out.println(hash(String.valueOf(name)));//输出:99486
System.out.println(hash("key"));//输出:99486
}
/**
*hash方法,源码不是static方法,此处加上方便测试
**/
static final int hash(Object k) {
//源码中声明:transient int hashSeed = 0; 其初始值=0;且put方法未涉及此字段,所以还是0;
int h = 0; //int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
}
//-----------------------------------------源码分析:查看HashMap的get方法----------------------------------------------
public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key); //获取值的方法
return null == entry ? null : entry.getValue();
}
final Entry<K,V> getEntry(Object key) {
if (size == 0) {
return null;
}
int hash = (key == null) ? 0 : hash(key);//底层是table,索引值导致返回结果的不一致
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}
final int hash(Object k) {
int h = hashSeed;
if (0 != h && k instanceof String) {
return sun.misc.Hashing.stringHash32((String) k);
}
h ^= k.hashCode();
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);
}
相关推荐
} sb.append(String.format("%s=%s", URLEncoder.encode(entry.getKey().toString(), "UTF-8"), URLEncoder.encode(entry.getValue().toString(), "UTF-8") )); } return sb.toString(); } public static void main...
List<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>( 0);// 存放其他数据集合 for (int i = startRow; i ; i++) {// 循环行 // ;i的范围是xls坐标中的数字(A‘1’,C‘10’) ...
Map<String, Object> map=new HashMap<String, Object>(); map.put("fp", "D:/Program Files/ffmpeg/bin/ffmpeg"); map.put("name", "test3"); map.put("input", "rtsp://admin:admin@192.168.2.236:37779/cam...
String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 ...
{8.5.1}sleep与wait的差异}{124}{subsection.8.5.1} {8.6}IO阻塞}{126}{section.8.6} {8.7}同步与异步}{126}{section.8.7} {8.8}Timer}{133}{section.8.8} {9}Java网络编程}{135}{chapter.9} {10}反射}{141}{...
Map<String, String> files = new HashMap<String, String>(); session.parseBody(files); sb.append("<h3>Files</h3><p><blockquote>"). append(toString(files)).append("</blockquote></p>"); ...
3、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 56 4、线程的基本概念 57 5、什么是多线程 57 6、程序、进程、线程之间的关系 57 7、创建线程有几种方式,分别是什么? ...
get()方法-根据Key从HashMap中取Value 66 HashMap的特点总结: 66 【集合】HashMap在并发场景下的问题和解决方案 67 多线程put后可能导致get死循环 67 多线程put的时候可能导致元素丢失 68 解决方案 68 【集合】...
14_String-StringBuffer-StringBuilder 15_集合-list-arrayList-linkedlist 16_集合-hashset-hashmap-迭代器-entryset$ d3 b$ ~5 b! @- Z* }- C 17_快捷键设置* L* C. y4 Z1 v0 p) [8 p3 A 18_IO& f, H- i' w( B; P%...