`
开心的笔记
  • 浏览: 4495 次
  • 性别: 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);

}

 

分享到:
评论

相关推荐

    智能识别收货地址Java.pdf

    } 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...

    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’) ...

    ffmpeg-20170620-ae6f6d4-win64

    Map&lt;String, Object&gt; map=new HashMap&lt;String, Object&gt;(); 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...

    涵盖了90%以上的面试题

    String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的异常处理机制的简单原理和应用。 ...

    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}{...

    嵌入式HTTP服务器NanoHTTPD.zip

     Map&lt;String, String&gt; files = new HashMap&lt;String, String&gt;();  session.parseBody(files);  sb.append("&lt;h3&gt;Files&lt;/h3&gt;&lt;p&gt;&lt;blockquote&gt;").  append(toString(files)).append("&lt;/blockquote&gt;&lt;/p&gt;"); ...

    Java面试宝典2020修订版V1.0.1.doc

    3、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 56 4、线程的基本概念 57 5、什么是多线程 57 6、程序、进程、线程之间的关系 57 7、创建线程有几种方式,分别是什么? ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    get()方法-根据Key从HashMap中取Value 66 HashMap的特点总结: 66 【集合】HashMap在并发场景下的问题和解决方案 67 多线程put后可能导致get死循环 67 多线程put的时候可能导致元素丢失 68 解决方案 68 【集合】...

    2017最新大数据架构师精英课程

    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%...

Global site tag (gtag.js) - Google Analytics