hashcode

HashMap在Java1.7与1.8中的区别

风流意气都作罢 提交于 2020-04-06 00:24:23
基于 JDK1.7.0_80 与 JDK1.8.0_66 做的分析 JDK1.7中 使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,如果hashcode相同,或者hashcode取模后的结果相同(hash collision),那么这些key会被定位到Entry数组的同一个格子里,这些key会形成一个链表。 在hashcode特别差的情况下,比方说所有key的hashcode都相同,这个链表可能会很长,那么put/get操作都可能需要遍历这个链表 也就是说时间复杂度在最差情况下会退化到O(n) JDK1.8中 使用一个Node数组来存储数据,但这个Node可能是链表结构,也可能是红黑树结构 如果插入的key的hashcode相同,那么这些key也会被定位到Node数组的同一个格子里。 如果同一个格子里的key不超过8个,使用链表结构存储。 如果超过了8个,那么会调用treeifyBin函数,将链表转换为红黑树。 那么即使hashcode完全相同,由于红黑树的特点,查找某个特定元素,也只需要O(log n)的开销 也就是说put/get的操作的时间复杂度最差只有O(log n) 听起来挺不错,但是真正想要利用JDK1.8的好处,有一个限制: key的对象,必须 正确的实现了Compare接口 如果没有实现Compare接口

java HashSet

醉酒当歌 提交于 2020-04-05 23:13:16
Set集合的功能和Collection是一致的。 HashSet:底层数据结构是哈希表,线程非同步。 HashSet保证元素唯一性:hashCode()和equals() 如果元素的hashCode值相同,才会判断equals是否为true。 如果元素的hashCode值不同,不会调用equals。 存人对象。同姓名同年龄,视为同一个人。 public class HashSetDemo { public static void main(String[] args) { HashSet hs = new HashSet(); hs.add(new Person("a1",1)); hs.add(new Person("a2",2)); hs.add(new Person("a3",3)); hs.add(new Person("a2",2)); Iterator it = hs.iterator(); while (it.hasNext()){ Person p = (Person) it.next(); System.out.println(p.getName()+"**"+p.getAge()); } } } class Person { private String name; private int age; public Person(String name, int

ysoserial分析【二】7u21和URLDNS

落花浮王杯 提交于 2020-03-30 02:49:19
目录 7u21 gadget链分析 hashCode绕过 参考 URLDNS 7u21 7u21中利用了TemplatesImpl来执行命令,结合动态代理、AnnotationInvocationHandler、HashSet都成了gadget链。 先看一下调用栈,把ysoserial中的调用栈简化了一下 LinkedHashSet.readObject() LinkedHashSet.add() Proxy(Templates).equals() AnnotationInvocationHandler.invoke() AnnotationInvocationHandler.equalsImpl() Method.invoke() ... TemplatesImpl.getOutputProperties() TemplatesImpl.newTransformer() TemplatesImpl.getTransletInstance() TemplatesImpl.defineTransletClasses() 对_bytecodes属性的值(实例的字节码)进行实例化 RCE 其中关于 TemplatsImpl 类如何执行恶意代码的知识可以参考另一篇文章中对CommonsCollections2的分析,这里不再赘述。只要知道这里调用 TemplatesImpl

HashMap的工作原理【文字版】

混江龙づ霸主 提交于 2020-03-27 12:12:53
3 月,跳不动了?>>> HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道 Hashtable和HashMap之间的区别 ,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入让这道题变得更加复杂。让我们开始探索的旅程吧! 先来些简单的问题 “你用过HashMap吗?” “什么是HashMap?你为什么用到它?” 几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对等等。这显示出你已经用过HashMap,而且对它相当的熟悉。但是面试官来个急转直下,从此刻开始问出一些刁钻的问题,关于HashMap的更多基础的细节。面试官可能会问出下面的问题: “你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的工作原理吗?” 你也许会回答“我没有详查标准的Java API,你可以看看Java源代码或者Open JDK。”

redis+mybatis+spring

我的未来我决定 提交于 2020-03-24 11:50:54
3 月,跳不动了?>>> redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用 http://liuyieyer.iteye.com/blog/2078095 Mybatis 的使用不多说。 Mybatis为了方便我们扩展缓存定义了一个Cache接口,看看ehcache-mybatis的源码就明白了。我们要使用自己的cache同样的实现Cache接口即可。直接上代码 public class RedisCache implements Cache { private static Log logger = LogFactory.getLog(RedisCache.class); private Jedis redisClient = createClient(); /** The ReadWriteLock. */ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private String id; public RedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances

java集合类分析-hashmap

为君一笑 提交于 2020-03-22 08:13:11
一、HashMap概述 二、HashMap的数据结构 三、HashMap源码分析 1、关键属性 2、构造方法 3、存储数据 4、调整大小 5、数据读取 6、HashMap的性能参数 一、HashMap概述   HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。   值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。 Map map = Collections.synchronizedMap(new HashMap()); 二、HashMap的数据结构   HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。HashMap中主要是通过key的hashCode来计算hash值的,只要hashCode相同,计算出来的hash值就一样。如果存储的对象对多了,就有可能不同的对象所算出来的hash值是相同的,这就出现了所谓的hash冲突。学过数据结构的同学都知道

词袋模型bow和词向量模型word2vec

只谈情不闲聊 提交于 2020-03-21 16:58:38
在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型。更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外的处理。下面就简单聊一下两种模型的应用。 所谓BOW,就是将文本/Query看作是一系列词的集合。由于词很多,所以咱们就用袋子把它们装起来,简称词袋。至于为什么用袋子而不用筐(basket)或者桶(bucket),这咱就不知道了。举个例子: 文本1:苏宁易购/是/国内/著名/的/B2C/电商/之一 这是一个短文本。“/”作为词与词之间的分割。从中我们可以看到这个文本包含“苏宁易购”,“B2C”,“电商”等词。换句话说,该文本的的词袋由“苏宁易购”,“电商”等词构成。就像这样: 但计算机不认识字,只认识数字,那在计算机中怎么表示词袋模型呢?其实很简单,给每个词一个位置/索引就可以了。例如,我们令“苏宁易购”的索引为0,“电商”的索引为1,其他以此类推。则该文本的词袋就变成了: 是的,词袋变成了一串数字的(索引)的集合。这样计算机就能读懂了。如果用程序来描述的话,就会像:Set<int>(0,1,2…)。当然,刚才的例子中像“苏宁易购”等词只出现了一次,如果出现多次,可能就需要支持重复元素的容器了,如Java/C++中的MultiSet。 可是,在实际的应用中(如:文本的相似度计算)

Java基础教程——Set

你。 提交于 2020-03-21 06:17:22
Set·无序,不重复 HashSet 特点:没有重复数据,数据不按存入的顺序输出。 HashSet由Hash表结构支持。不支持set的迭代顺序,不保证顺序。 但是Hash表结构查询速度很快。 创建集合使用代码: Set<String> s = new HashSet<>(); 代码演示:常用方法和遍历输出 import java.util.*; public class TestHashSet { public static void main(String[] args) { m010赋值And遍历(); } public static void m010赋值And遍历() { System.out.println("=====赋值And遍历"); Set<String> s = new HashSet<>(); s.add("孙悟空"); s.add("小白龙"); s.add("猪八戒"); s.add("沙悟净"); s.add("孙悟空"); System.out.println("是否为空:" + s.isEmpty()); System.out.println("是否包含:" + s.contains("小白龙")); System.out.println("移除:" + s.remove("小白龙")); // (1)foreach:遍历set for

day14_集合框架1(ArrayList,LinkedList,HashSet)

我的梦境 提交于 2020-03-21 04:15:34
1.集合框架大致示意图: 2.集合概述: /* 数据 -封装在-> 对象 -存储在-> 集合 集合类: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对 多个对象的操作,就对 对象进行存储,集合就是存储对象最常用的 一种方式 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的,只能存储同一类型对象 集合长度是可变的. 数组中可以存储基本数据类型,集合只能存储对象 集合类的特点: 集合只用于存储对象 集合长度是可变的 集合可以存储不同类型的对象 关于数组: 例如: Person p=new int[3]; p[0]=new Person("zhangsan"); ... 为什么有这么多容器?(集合) 因为每一个容器对数据的存储方式都有不同 这个存储方式称为数据结构. */ 3.Collection中的一些方法: /* 1.add方法的参数类型是Object,以便于接收任意类型的对象 2.集合中存储的都是对象的地址(引用) */ import java.util.*; class CollectionDemo { public static void sop(Object obj) { System.out.println(obj); } public static void base_method() { ArrayList

java中常用的数据结构--Collection接口及其子类

青春壹個敷衍的年華 提交于 2020-03-21 03:49:29
   java中有几种常用的数据结构,主要分为Collection和map两个主要接口 (接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。  一、集合和数组的区别 二、Collection集合和Map集合 三、Collection接口 1、定义 public interface Collection<E> extends Iterable<E> {} 它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。 Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。带参数的构造函数,可以用来转换Collection的类型。 2、Collection集合的API 四、List 1、定义:    List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。 public interface List<E> extends Collection<E> {} 2、List接口的实现类 (1)ArrayList:底层数据结构是 数组