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);
}
相关推荐
在HTTP请求中,GET方法通常与URL结合使用,用于指定要获取的资源路径。然而,URL不能直接包含所有字符,特别是非ASCII字符或者特殊字符。这就需要对URL进行编码,将这些字符转换为可以在URL中安全传输的形式。 1. *...
2. 创建`String`对象有多种方式,如直接赋值、`new String()`构造器、`StringBuilder`或`StringBuffer`等。其中,`StringBuilder`和`StringBuffer`适用于字符串拼接操作,特别是多线程环境下,`StringBuffer`是线程...
Map<String, String> params = new HashMap(); params.put("key1", "value1"); params.put("key2", "value2"); String postData = params.entrySet().stream() .map(entry -> entry.getKey() + "=" + entry....
9. **String对象与字符串常量池**:String是不可变的,创建新String对象时,如果常量池已有相同内容,会复用该对象。 10. **线程安全**:当多个线程访问某个类时,即使进行多线程并发操作,也能保证其正确性和一致...
List<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>( 0);// 存放其他数据集合 for (int i = startRow; i ; i++) {// 循环行 // ;i的范围是xls坐标中的数字(A‘1’,C‘10’) ...
在 Servlet 中,request.getSession() 方法用于获取当前会话对象。如果没有当前会话对象,request.getSession() 方法将创建一个新的会话对象。request.getSession(false) 方法用于获取当前会话对象,如果没有当前...
在Android开发中,HTTP通信是应用与服务器交互的重要方式,主要通过POST和GET两种方法进行数据传输。本篇文章将深入探讨Android中如何实现HTTP POST和GET请求,以及相关的上传和下载功能。 首先,GET和POST是HTTP...
equals方法默认也是比较引用,但如String、Integer等类重写了equals方法,用于比较对象的内容。 3. **hashCode()与equals()关系**: 两个对象的hashCode()相同并不意味着equals()也一定为true,因为不同的对象可能...
Java 面试题总结 本文总结了 Java 面试中的重要知识点,...HashMap 是基于 hashing 原理的,通过 put() 和 get() 方法来存储和获取对象。 本文总结了 Java 面试中的重要知识点,为 Java 开发者提供了系统的知识体系。
我们需要创建一个`BufferedReader`实例,传入`FileReader`对象,然后通过`readLine()`方法逐行读取TXT文件内容。 2. **字符串处理**: 读取到的每一行都是一个字符串,我们需要对其进行处理以提取单词。这通常包括...
首先创建一个`StringBuilder`对象用于临时存储当前编码,然后通过`InputStreamReader`和`read()`方法逐个读取字符。遇到逗号时,将`StringBuilder`内容转为字符串,检查该编码是否已存在于`HashMap`中,如果存在则...
它们提供了在不创建新对象的情况下进行字符串拼接的方法,如`append()`。与直接使用`+`运算符相比,这些类能显著减少对象创建的开销。 下面是一个简单的字符串缓存类实现示例,我们将称之为`StringCache`: ```...
在处理字符串时,相比不可变的 String 对象,使用 `StringBuilder` 可以更高效地进行大量字符串的修改操作。`StringBuilder` 提供了 `append()`、`insert()`、`deleteCharAt()`、`reverse()` 和 `toString()` 等方法...
1. **String、StringBuilder 和 StringBuffer 的差异**: - String 类型的对象一旦创建就不可改变,每次对 String 的修改都会创建一个新的对象,因此频繁操作可能导致性能下降。 - StringBuilder 和 StringBuffer ...
4. 遍历和操作JSON对象:通过`get()`、`opt()`、`put()`等方法,可以获取或修改JSON对象的键值对。例如,遍历一个嵌套的JSON对象: ```java JSONObject person = jsonObject.getJSONObject("person"); String ...
4. **StringBuffer/StringBuilder与String的区别**:两者都是可变字符序列,但StringBuilder在单线程环境下效率更高,因为它不保证线程安全,而StringBuffer在多线程环境下更合适,因为它提供了同步方法。...
3. JSON对象操作:Fastjson允许直接通过字段名操作JSON对象,如`get()`和`put()`方法,类似于HashMap的操作方式。 4. JSONPath支持:Fastjson实现了JSONPath表达式,用于查询JSON对象中的特定数据,类似于XPath在...
4. **抽象类与抽象方法**:允许子类选择性地实现方法。 #### 四、StringBuffer、StringBuilder、String的区别 1. **String**:不可变字符串,适合常量字符串。 2. **StringBuffer**:线程安全可变字符序列,效率较...
在Java中,可以使用HashMap来实现映射,用StringBuilder或String来处理罗马数字字符串。下面是一个简单的Java代码实现: ```java import java.util.HashMap; import java.util.Map; public class RomanToInt { ...
values = (List<String>) params.get(item.getFieldName()); else values = new ArrayList(); String charset = servletRequest.getCharacterEncoding(); if (charset != null) values.add(item.getString...