`
开心的笔记
  • 浏览: 4615 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Stringbuilder与String的对象,在HashMap的get方法差异.

 
阅读更多

 

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

}

 

分享到:
评论

相关推荐

    get方法编码组件包

    在HTTP请求中,GET方法通常与URL结合使用,用于指定要获取的资源路径。然而,URL不能直接包含所有字符,特别是非ASCII字符或者特殊字符。这就需要对URL进行编码,将这些字符转换为可以在URL中安全传输的形式。 1. *...

    Java中的API.docx

    2. 创建`String`对象有多种方式,如直接赋值、`new String()`构造器、`StringBuilder`或`StringBuffer`等。其中,`StringBuilder`和`StringBuffer`适用于字符串拼接操作,特别是多线程环境下,`StringBuffer`是线程...

    http请求,http get请求,http post请求

    Map&lt;String, String&gt; params = new HashMap(); params.put("key1", "value1"); params.put("key2", "value2"); String postData = params.entrySet().stream() .map(entry -&gt; entry.getKey() + "=" + entry....

    java面试feedback汇总.docx

    9. **String对象与字符串常量池**:String是不可变的,创建新String对象时,如果常量池已有相同内容,会复用该对象。 10. **线程安全**:当多个线程访问某个类时,即使进行多线程并发操作,也能保证其正确性和一致...

    Excel POI读取封装(文件+示范代码)

    List&lt;HashMap&lt;String, String&gt;&gt; dataList = new ArrayList&lt;HashMap&lt;String, String&gt;&gt;( 0);// 存放其他数据集合 for (int i = startRow; i ; i++) {// 循环行 // ;i的范围是xls坐标中的数字(A‘1’,C‘10’) ...

    于笑扬java综合知识点总结-必背.pdf

    在 Servlet 中,request.getSession() 方法用于获取当前会话对象。如果没有当前会话对象,request.getSession() 方法将创建一个新的会话对象。request.getSession(false) 方法用于获取当前会话对象,如果没有当前...

    android http post/get

    在Android开发中,HTTP通信是应用与服务器交互的重要方式,主要通过POST和GET两种方法进行数据传输。本篇文章将深入探讨Android中如何实现HTTP POST和GET请求,以及相关的上传和下载功能。 首先,GET和POST是HTTP...

    史上最全java面试,103项重点知识,带目录

    equals方法默认也是比较引用,但如String、Integer等类重写了equals方法,用于比较对象的内容。 3. **hashCode()与equals()关系**: 两个对象的hashCode()相同并不意味着equals()也一定为true,因为不同的对象可能...

    面试总结java工程师

    Java 面试题总结 本文总结了 Java 面试中的重要知识点,...HashMap 是基于 hashing 原理的,通过 put() 和 get() 方法来存储和获取对象。 本文总结了 Java 面试中的重要知识点,为 Java 开发者提供了系统的知识体系。

    java语言 句子词汇分析

    我们需要创建一个`BufferedReader`实例,传入`FileReader`对象,然后通过`readLine()`方法逐行读取TXT文件内容。 2. **字符串处理**: 读取到的每一行都是一个字符串,我们需要对其进行处理以提取单词。这通常包括...

    java编程题总结pdf文档

    首先创建一个`StringBuilder`对象用于临时存储当前编码,然后通过`InputStreamReader`和`read()`方法逐个读取字符。遇到逗号时,将`StringBuilder`内容转为字符串,检查该编码是否已存在于`HashMap`中,如果存在则...

    java 创建字符串缓存类

    它们提供了在不创建新对象的情况下进行字符串拼接的方法,如`append()`。与直接使用`+`运算符相比,这些类能显著减少对象创建的开销。 下面是一个简单的字符串缓存类实现示例,我们将称之为`StringCache`: ```...

    Java刷算法题常用API文档

    在处理字符串时,相比不可变的 String 对象,使用 `StringBuilder` 可以更高效地进行大量字符串的修改操作。`StringBuilder` 提供了 `append()`、`insert()`、`deleteCharAt()`、`reverse()` 和 `toString()` 等方法...

    JAVA面试题含答案

    1. **String、StringBuilder 和 StringBuffer 的差异**: - String 类型的对象一旦创建就不可改变,每次对 String 的修改都会创建一个新的对象,因此频繁操作可能导致性能下降。 - StringBuilder 和 StringBuffer ...

    JSON类解析数据文件

    4. 遍历和操作JSON对象:通过`get()`、`opt()`、`put()`等方法,可以获取或修改JSON对象的键值对。例如,遍历一个嵌套的JSON对象: ```java JSONObject person = jsonObject.getJSONObject("person"); String ...

    java综合知识

    4. **StringBuffer/StringBuilder与String的区别**:两者都是可变字符序列,但StringBuilder在单线程环境下效率更高,因为它不保证线程安全,而StringBuffer在多线程环境下更合适,因为它提供了同步方法。...

    阿里fastjson.jar

    3. JSON对象操作:Fastjson允许直接通过字段名操作JSON对象,如`get()`和`put()`方法,类似于HashMap的操作方式。 4. JSONPath支持:Fastjson实现了JSONPath表达式,用于查询JSON对象中的特定数据,类似于XPath在...

    于笑扬java综合知识点总结-必背.doc

    4. **抽象类与抽象方法**:允许子类选择性地实现方法。 #### 四、StringBuffer、StringBuilder、String的区别 1. **String**:不可变字符串,适合常量字符串。 2. **StringBuffer**:线程安全可变字符序列,效率较...

    java面试-leetcode面试题解之第13题罗马数字转整数-编程.zip

    在Java中,可以使用HashMap来实现映射,用StringBuilder或String来处理罗马数字字符串。下面是一个简单的Java代码实现: ```java import java.util.HashMap; import java.util.Map; public class RomanToInt { ...

    jakartaMultiPartRequest

    values = (List&lt;String&gt;) params.get(item.getFieldName()); else values = new ArrayList(); String charset = servletRequest.getCharacterEncoding(); if (charset != null) values.add(item.getString...

Global site tag (gtag.js) - Google Analytics