hashmap

Java的HashMap

断了今生、忘了曾经 提交于 2020-02-04 01:08:55
HashMap 概述 HashMap是一个 jdk8源码 构造器 有4个构造器: public HashMap() public HashMap(int initialCapacity) public HashMap(int initialCapacity, float loadFactor) public HashMap(Map<? extends K, ? extends V> m) 除了显式设置loadFactor,其他情况都是设置为默认的0.75。 传入另外一个Map需要满足泛型上下界的要求,比如只能由<String,String>转成<Object,Object>。 主要成员变量 Node<K,V>[] table; 哈希表。 Set<Map.Entry<K,V>> entrySet; 用来遍历的Entry集合。 int size; map中元素个数。 int modCount; 源码上说的是结构化修改的次数,关系不大。 int threshold; 阈值,当size大于这个阈值,就要resize final float loadFactor; 加载因子,表示哈希表中元素的密集程度,默认是0.75。 put table 哈希表,就是一个Node数组,而Node是HashMap里一个静态内部类,实现了Map接口里的Entry接口,可以看出Node类其实是一个链表节点

Set,List,Map,Vector,ArrayList的区别

十年热恋 提交于 2020-02-03 14:05:32
Set,List,Map,Vector,ArrayList的区别 JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口   Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。   所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。   如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子

Why does specifying Map's initial capacity cause subsequent serializations to give different results?

帅比萌擦擦* 提交于 2020-02-03 10:08:11
问题 I am trying to compare 2 byte[] which are the results of serialization of the same object: 1 byte[] is created by serializing the object the other by deserializing the 1st byte[] and then serializing it again. I do not understand how these 2 arrays can be different. Deserializing the first byte[] should reconstruct the original object, and serializing that object is the same as serializing the original one. So, the 2 byte[] should be the same. However, under certain circumstances they can be

数据结构之HashMap详解(一)

醉酒当歌 提交于 2020-02-03 07:30:03
在之前有一篇博客介绍了HashMap, 数据结构之Hash表(哈希表) 现在对之前的内容做一个补充。 说HashMap之前,看下数组: 数组的优点在于查找速度快,每个区域都是紧挨着的,并且有下标,可以根据下标快速找到要查找的元素。 缺点:增删麻烦,如果在第二个元素后面再添加个元素的话,那么就需要重新建一个数组,填入对应的信息。 链表:每个内存除了存放自身的元素外,还保留下个内存区域的地址, 优点:插入新元素方便,只需要将指针指向新元素,新元素指向原来的下一个指针即可。 缺点:查找速度慢。链表不像数组那样有下标,链表查找元素只能从head结点开始,一个一个向下找。 而散列表则是综合了两者优点于一身的结构: 上面是数组,数组每个区域内是链表。 说到散列表,就应当说哈希,没有哈希,散列表就无法寻址找数据, 哈希 哈希:Hash也称散列、哈希,对应的英文都是Hash,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出,这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash特点: 1、hash值不可以反向推导出原始的数据 2、输入的数据的微小变化会得到完全不同的hash值,相同的数据可以得到相同的值。 3、哈希算法的执行效率要高效 4、hash算法的冲突概率要小 hash原理是将输入空间的值映射成hash空间内

详解 HashMap

会有一股神秘感。 提交于 2020-02-03 01:47:37
本篇博文的知识点,在我们的日常生活中,应用十分广阔。比如:每个学生,都有自己的对应的学号、每一个公民,都有自己的身份证号… … 相信看到这里,有的同学基本上已经猜到了这个类的主要用途。那么,话不多说,我们开始主题的讲解吧! (有关Map集合的基本性质,请观看本人博文—— 《详解 Map集合》 ) HashMap: 特点 : 允许插入null键 null值 线程不安全,效率高 注意事项 : 注意 键 的类型 是否重写了equals()方法 : (是否录入是靠 已存在HashMap集合中的键值对的 键 与 要录入的键值对的 键 的 equals()的返回值 : 返回true,则 用新键值对覆盖旧键值对 返回false,则 直接录入新键值对) HashMap在Map集合中,基于Map接口,并没有专属常用API,所以,本人在这里就直接来展示下对这个类的使用: 首先,本人来给出一个例子: package about_hashtable ; import java . util . HashMap ; public class Test { public static void main ( String [ ] args ) { HashMap < String , String > hashMap = new HashMap < > ( ) ; hashMap . put ( new

35个Java代码优化的细节,你知道几个

倾然丶 夕夏残阳落幕 提交于 2020-02-02 23:28:07
目录 前言 代码优化细节 1、尽量指定类、方法的final修饰符 2、尽量重用对象 3、尽可能使用局部变量 4、及时关闭流 5、尽量减少对变量的重复计算 6、尽量采用懒加载的策略,即在需要的时候才创建 7、慎用异常 8、不要在循环中使用 try…catch… ,应该把其放在最外层 9、如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度 10、当复制大量数据时,使用 System.arraycopy() 命令 12、循环内不要不断创建对象引用 13、基于效率和类型检查的考虑,应该尽可能使用 array ,无法确定数组大小时才使用 ArrayList 14、尽量使用 HashMap 、 ArrayList 、 StringBuilder ,除非线程安全需要,否则不推荐使用 Hashtable 、 Vector 、 StringBuffer ,后三者由于使用 同步机制 而导致了 性能开销 15、不要将数组声明为 public static final 16、尽量在合适的场合使用单例 17、尽量避免随意使用静态变量 18、及时清除不再需要的会话 19、实现 RandomAccess 接口的集合比如 ArrayList ,应当使用最普通的for循环而不是 foreach 循环来遍历 20、使用同步代码块替代同步方法 21、将常量声明为 static final

Modifying this 8-puzzle code to print the intermediate states to reach the solution

霸气de小男生 提交于 2020-02-02 16:34:50
问题 About the 8 Puzzle Problem // Breadth First Search Usage in the common Eight Puzzle Problem. import java.util.*; class EightPuzzle { Queue<String> q = new LinkedList<String>(); // Use of Queue Implemented using LinkedList for Storing All the Nodes in BFS. Map<String,Integer> map = new HashMap<String, Integer>(); // HashMap is used to ignore repeated nodes public static void main(String args[]){ String str="087465132"; // Input the Board State as a String with 0 as the Blank Space EightPuzzle

Modifying this 8-puzzle code to print the intermediate states to reach the solution

怎甘沉沦 提交于 2020-02-02 16:32:47
问题 About the 8 Puzzle Problem // Breadth First Search Usage in the common Eight Puzzle Problem. import java.util.*; class EightPuzzle { Queue<String> q = new LinkedList<String>(); // Use of Queue Implemented using LinkedList for Storing All the Nodes in BFS. Map<String,Integer> map = new HashMap<String, Integer>(); // HashMap is used to ignore repeated nodes public static void main(String args[]){ String str="087465132"; // Input the Board State as a String with 0 as the Blank Space EightPuzzle

RocketMQ NameServer协调者

∥☆過路亽.° 提交于 2020-02-02 03:41:04
从3.x之前使用Zookeeper,之后改成NameServer NameServer是整个集群的状态服务器 NameServer部署,相互独立(相当于热备份) 为什么不用Zookeeper,因为根据业务需要不需要主从选举(相对来说比较重量级),NameServer只需要维护节点的状态和一些元数据信息 NameServer维护的主要信息: private final HashMap<String/* topic */, List<QueueData> > topicQueueTable; List<QueueData>的长度 指的是master Broker的个数 private final HashMap<String/* brokerName */, BrokerData > brokerAddrTable; BrokerData 存储的是节点地址的一些信息 private final HashMap<String/* clusterName */, Set<String/*brokerName */ > clusterAddrTable; 维护一个clusterName和一组brokerName的组成 private final HashMap<String/* brokerAddr */, BrokerLiveInfo > brokerLiveTable;

剑指Offer(类库)——HashMap、HashTable、ConcurrentHashMap(上)

℡╲_俬逩灬. 提交于 2020-02-02 03:02:50
Map是由一对对的key-value组成的,key要求是唯一的,value不要求。 通过看源码可以得出:key自带去重功能是Set类型的,value是Collection接口可存放任意集合。 来看一下Map的实现类: HashMap、HashTable、ConcurrentHashMap之间的区别? HashMap JDK8之前HashMap是由数组+链表组成的,数组查找快增删慢,链表增删快查找慢,HashMap结合了两者的优势,HashMap不是线程安全的效率很高,组织键位如图: 没有给HashMap初始长度的时候 HashMap默认初始长度是16 ,初始长度16的数组中每个数组的位置存放的是 链表的头结点 ,可以通过模运算得到头结点的存放位置:hash(key.hashCode())%len,hashCode的运算本身是通过位运算得到的。 但是存在一种特殊情况,通过模运算得到的位置每次都是同一个这样的话就不断在一条链表中去插入, 最坏的情况是时间复杂度从O(1)变成O(n)。 JDK8之后对HashMap进行了优化,将原先的HashMap由 数组+链表 组成的道理变成了 数组+链表+红黑树 。 添加红黑树之后再次遇到特殊的情况时就可以使用 TREEIFY_THRESHOLD 去判断是否将链表转换成一颗红黑树,这种情况下 最坏的时间复杂度从O(n)变成O(nlogn)。