hashmap

jdk8 hashmap 链表resize 源码分析

妖精的绣舞 提交于 2020-02-10 10:52:17
重点看这部分代码 for (int j = 0; j < oldCap; ++j) { Node<K,V> e; if ((e = oldTab[j]) != null) { oldTab[j] = null; if (e.next == null) newTab[e.hash & (newCap - 1)] = e; else if (e instanceof TreeNode) ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); else { // preserve order Node<K,V> loHead = null, loTail = null; Node<K,V> hiHead = null, hiTail = null; Node<K,V> next; do { next = e.next; if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e; loTail = e; } else { if (hiTail == null) hiHead = e; else hiTail.next = e; hiTail = e; } } while ((e = next) != null); if (loTail !

View(视图)——ListView之 SimpleAdapter

泪湿孤枕 提交于 2020-02-10 04:51:51
一.概念 列表视图;用来显示多个可滑动项列表的ViewGroup;需要适配器Adapter 将集合中数据和每一个Item所对应的布局动态适配到ListView中进行显示。 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="com.example.wang

数组

ⅰ亾dé卋堺 提交于 2020-02-10 04:27:23
1.List接口 ArrayList(查询快,增删慢,查询快)    内部通过数组实现,当数组大小不满足时需要增加存储能力,将已有的数组的数据复制到新的存储空间,当插入或者删除元素时候,需要对数组进行复制移动,代价高,   默认容量时10,扩容1.5倍 Vector(数组实现,线程同步)   支持线程同步,即某一时刻只有一个线程能够写vector,因为访问比ArrayList慢 LinkList(双链表结构,增删慢,查询快)    不支持高效的随机元素访问,LinkedList 是一个实现了 List 接口和 Deque 接口的双端链表。使得 LinkedList 类也具有队列的特性; LinkedList 不是线程安全的,如果想使   LinkedList 变 成 线 程 安 全 的 , 可 以 调 用 静 态 类 Collections 类 中 的 synchronizedList 方 法 : List list=Collections.synchronizedList(new LinkedList(...)); 2.Set接口     hashCode存储,如果想让两个不同的对象相等,必须覆盖object的hashCode方法和equals方法 HashSet(无序,哈希表)    按照哈希值存取数据,通过hashcode方法来获取,HashSet首先判断两个元素的哈希值

HashMap源码解析之resize方法

杀马特。学长 韩版系。学妹 提交于 2020-02-09 20:41:33
resize函数 因为HashMap的构造函数 并不会给内部的表开辟空间 而是在调用put函数时 如果表为空 调用resize方法 换句话说 resize函数不得不 考虑 任何不同形式的构造函数 及带一参 带两参 不带参的构造函数 调用resize方法 并且 当表中的数量 超过临界值时 也会调用resize方法 所以整个 大概思路 旧表保存下来 定义并赋值 旧表的长度 临界值 如果旧表为空则长度为0 定义新表长度 新表临界值 如果旧表中有元素 4.1 判断是否达最大长度 到达则无需再散列 4.2 否则 可以再散列 4.2.1 给新表长度和临界值赋值 分别都是是旧表的2倍 如果旧表中 没有元素 并且 旧表有临界值 那么 就是这种构造函数调用的 new HashMap(50); 所以要将 newCap=oldThr; 否则 在表为空 又没有临界值 指定新表的长度和临界值 如果newThr还没被指定吗 如果没有 则指定 也就是说在旧表有指定临界值时的时候调用 前期值的赋值准备做好了就可以再散列了 如何再散列 大概思路 如果表中的节点是树节点 则直接调用 splite (下篇讲) 如果不是树节点 也就是 普通的节点 这里有个很有意思的地方 e.hash & oldCap 这是为什么呢 根据源码表示的是链表中的每一个元素都要再散列 为什么都要再散列 首先必须明确的是

hbase thrift java util

ε祈祈猫儿з 提交于 2020-02-09 14:17:34
转载: https://github.com/ssw239/java-thrift-hbase-io/blob/master/HBaseThriftClient.java pom.xml <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-thrift</artifactId> <version>1.3.1</version> </dependency> ThriftUtil.java package hbase; import java.lang.Object; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.security.MessageDigest; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry;

集合各实现类的底层实现原理

回眸只為那壹抹淺笑 提交于 2020-02-07 15:46:26
转载自:http://blog.csdn.net/qq_25868207/article/details/55259978 ;##ArrayList实现原理要点概括 参考文献: http://zhangshixi.iteye.com/blog/674856l ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素。 底层使用数组实现 该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的1.5倍,这种操作的代价很高。 采用了Fail-Fast机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险 LinkedList实现原理要点概括 参考文献: http://www.cnblogs.com/ITtangtang/p/3948610.htmll LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。 底层的数据结构是基于双向链表的,该数据结构我们称为节点 双向链表节点对应的类Node的实例,Node中包含成员变量:prev,next,item。其中,prev是该节点的上一个节点,next是该节点的下一个节点,item是该节点所包含的值。 HashMap实现原理要点概括 参考文献: http://zhangshixi

面试专题 HashMap如何在Java中工作

萝らか妹 提交于 2020-02-07 15:35:47
通过优锐课的java学习分享中,了解了企业的面试题型,分享给大家学习。 HashMap问题在工作面试中很常见。 这是HashMaps在Java内部如何工作的一些深入说明。 HashMap在内部如何工作已成为几乎所有访谈中的一个普遍问题。 几乎每个人都知道如何使用HashMap或HashMap与Hashtable之间的区别。 但是,当问题为“ HashMap如何在内部工作?”时,许多人会失败。 这个问题的答案是,它基于哈希原理工作,但听起来并不那么简单。 哈希是一种使用算法将唯一代码分配给变量或属性的机制,从而可以轻松进行检索。 真正的哈希机制在应用于同一对象时应始终返回相同的hashCode()。 然后是一个问题:“哈希如何帮助存储和检索HashMap中的值?” 许多人会说该值将存储在存储桶中,并使用键进行检索。 如果你认为这是有效的,那么你绝对是错误的。 为了证明这一点,让我们看一下HashMap类: /** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry[] table; 那么HashMap中Entry []的用途是什么? HashMap将对象存储为Entry实例,而不是键和值。 什么是入门班? HashMap有一个称为Entry

leetcode 3. Longest Substring Without Repeating Characters

元气小坏坏 提交于 2020-02-07 14:39:29
题目内容 Given a string, find the length of the longest substring without repeating characters. Example: Input: "abcabcbb" Output: 3 Explanation: The answer is "abc", with the length of 3. Example 2: Input: "bbbbb" Output: 1 Explanation: The answer is "b", with the length of 1. Example 3: Input: "pwwkew" Output: 3 Explanation: The answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring. 分析过程 题目归类: array,遍历,dp 题目分析: 找到连续字串,输出最长的没有重复字母的连续字串。 采用循环法一定可以做出来,但是时间复杂度太差,最差是O(n^2),因为每次子串增长1都需要遍历一次看看有没有重复的数据,可以用一个hashmap来记录子串的数据。其中key为

leetcode刷题笔记20

こ雲淡風輕ζ 提交于 2020-02-07 05:13:22
有效的括号 利用栈先进后出的特性实现 class Solution { private HashMap < Character , Character > map ; public Solution ( ) { this . map = new HashMap < > ( ) ; map . put ( '(' , ')' ) ; map . put ( '{' , '}' ) ; map . put ( '[' , ']' ) ; } public boolean isValid ( String s ) { Stack < Character > st = new Stack < > ( ) ; for ( int i = 0 ; i < s . length ( ) ; i ++ ) { char c = s . charAt ( i ) ; if ( map . containsKey ( c ) ) { st . push ( c ) ; } else { if ( st . empty ( ) ) return false ; char topelement = st . pop ( ) ; if ( map . get ( topelement ) != c ) return false ; } } return st . empty ( ) ? true :

Java中HashMap和TreeMap

牧云@^-^@ 提交于 2020-02-07 05:08:19
Java中HashMap和TreeMap **HashMap 非线程安全 TreeMap 非线程安全 ** 在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。 HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 线程安全 关于线程以及线程安全的相关知识有待笔者继续学习,敬请关注。 在Java里,线程安全一般体现在两个方面: 多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。 每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样 两种常规Map实现 HashMap: 基于哈希表实现