hashcode

java中set接口的用法

早过忘川 提交于 2019-12-26 15:27:08
java中的set接口有如下的特点: 不允许出现重复元素; 集合中的元素位置无顺序; 有且只有一个值为null的元素。 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为: 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。 空集的性质:空集是一切集合的子集 Set不保存重复的元素。Set中最常被使用的是测试归属性,你可以很容易的询问某个对象是否在某个Set中。Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同。   实现了Set接口的主要有HashSet、TreeSet、LinkedHashSet这几个共同点就是每个相同的项只保存一份。他们也有不同点,区别如下:   1.HashSet:   HashSet使用的是相当复杂的方式来存储元素的,使用HashSet能够最快的获取集合中的元素,效率非常高(以空间换时间)。会根据hashcode和equals来庞端是否是同一个对象,如果hashcode一样,并且equals返回true,则是同一个对象,不能重复存放。 package

Java List集合

风流意气都作罢 提交于 2019-12-26 09:52:43
List:有序的collection(也称为 序列 )。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 set 不同,列表通常允许重复的元素。更正式地说,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2 ,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。难免有人希望通过在用户尝试插入重复元素时抛出运行时异常的方法来禁止重复的列表,但我们希望这种用法越少越好。 List 接口在 iterator 、 add 、 remove 、 equals 和 hashCode 方法的协定上加了一些其他约定,超过了 Collection 接口中指定的约定。为方便起见,这里也包括了其他继承方法的声明。 List 接口提供了 4 种对列表元素进行定位(索引)访问方法。列表(像 Java 数组一样)是基于 0 的。注意,这些操作可能在和某些实现(例如 LinkedList 类)的索引值成比例的时间内执行。因此,如果调用方不知道实现,那么在列表元素上迭代通常优于用索引遍历列表。 List 接口提供了特殊的迭代器,称为 ListIterator ,除了允许 Iterator 接口提供的正常操作外,该迭代器还允许元素插入和替换,以及双向访问

java知识系列之集合理论篇

杀马特。学长 韩版系。学妹 提交于 2019-12-26 04:55:56
本文主要综合介绍java集合中比较重要的一些概念和实现。如下图 基础部分 Collection List :接口实例存储的是 有序的 , 可以重复 的元素。 ArrayList - 底层使用数组 - 读取速度快,增删速度慢 - 不是线程安全的,只能在单线程环境下,多线程环境下可以考虑用collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发CopyOnWriteArrayList类。 - 当容量不够时,当前容量*1.5+1 LinkedList 底层使用双向链表数据结构 读取速度慢,增删快 线程不安全 implements List, Deque。实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作"栈来使用" Vector 底层使用数组 读取速度快,增删慢 线程安全,效率低 容量不够时,默认扩展一倍 Stack Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出 小结 java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现 Queue代表了队列

哈希表的特征和原理

老子叫甜甜 提交于 2019-12-25 23:54:38
哈希表也叫散列表,是一种神奇的结构,最大的特点就是快。它的结构有很多种,最流行、最容易理解的是:顺序表+链表的结构。主结构是长度可以动态变化的顺序表,每个顺序表的节点可以单独引出一个链表。哈希表的原理可以从以下三点阐述。 添加数据原理: 1)、计算哈希码,调用hashCode()方法,结果是一个int值,整数的哈希码取自身即可 2)、根据哈希码计算存储位置(数组的索引)【y = k(x) (除留取余法)存入哈希表】 3)、将数据存入指定位置,如果已经有元素存在,就是出现了冲突,需要沿着链表比较,有重复的元素,不存储。没有,就存储。 结论:添加快。时间复杂度O(1);无序。 查询数据的原理: 和添加过程一样,还是三步搞定。结论:查询快。 总结:哈希表的神奇之处在于按照内容查询,理想情况下可以达到数组索引查询的时间复杂度O(1)。核心在于其查询不是基于比较的,而是基于计算的。当存在冲突时,会降低效率。 如何减少冲突: 1)装填因子:哈希表的长度和表中的记录数的比例。超过装填因子就要扩容。不然冲突的概率会大大提高,从而影响性能。 2)哈希函数的选择 直接定址法 平方取中发 折叠法 除留取余法等 3)处理冲突的方法 链地址法 开放地址法 再散列法 建立一个公共溢出区 hashCode和equals()在哈希表添加查询中的作用: 1)hashCode():计算哈希码,是一个整数

why not just using GetHashCode in Equality? [duplicate]

↘锁芯ラ 提交于 2019-12-25 11:52:46
问题 This question already has answers here : Using GetHashCode to test equality in Equals override (8 answers) Closed 6 years ago . given the person class: class person { public string name; public int age; } say, i override the class person`s GetHashCode method: public override int GetHashCode() { unchecked { hashCode = 17; // ...some code here... } return hashCode; } and based on msdn`s instruction, i also need to override the Equality, so i did this: public override bool Equals(object obj) { /

面试常见的问题之 Java 基础

怎甘沉沦 提交于 2019-12-25 06:08:10
一、谈谈对 JVM、JRE 和 JDK 的理解。 JVM Java 虚拟机(Java Virtual Machine, JVM):是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现,即相同的字节码文件,通过虚拟机都会输出相同的结果, 这也是为什么 Java 是跨平台的。 JRE Java Running Enviroment: Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,Java 命令和其他一些基础构件。 但是,他不能用于创建新线程。 JDK Java Development Kit: 它是功能强大的 Java SDK。拥有 JRE 所有的一切,还有编译器(javac) 和工具(如 javadoc 和 jdb)。 它能够创建和编译程序。 综上: JVM 是运行 Java 字节码的虚拟机,是保证“一次编译,随处运行”的关键;JRE 只能运行 Java 程序,如果需要 Java 编程相关的工作,就必须安装 JDK。 二、Java 和 C++ 的区别。 很多面试官都会问,所有有必要了解两种语言的区别。 都是面向对象的语言,所有两者都支持继承、封装、多态; Java 不提供指针来直接访问内存,程序会更加安全; Java 里的类只能单继承(Java 里的可以多继承接口),而 C++

Java8 HashMap源码分析

与世无争的帅哥 提交于 2019-12-25 05:42:14
java.util.HashMap 是最常用的java容器类之一, 它是一个线程不安全的容器. 本文对JDK1.8.0中的HashMap实现源码进行分析. HashMap 使用位运算巧妙的进行散列并使用链地址法处理冲突. 自JDK1.8后, 若表中某个位置元素数超过阈值 则会将其自动转换为红黑树来提高检索效率. HashMap 中的迭代器同样采用 fail-fast 机制, 即若迭代过程中容器发生结构性改变, 则会终止迭代. HashMap 主要有三个视图接口 keySet() , values() , entrySet() . 它们都是基于迭代器实现的, 并不实际存储数据. 哈希表 自JDK1.8.0开始HashMap使用静态内部类 Node 来存储键值对结构, 不再使用 Map.Entry : static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) {...} public final K getKey() { return key; } public final V getValue() { return value; }

Why can't I just compare the hashCode of two objects in order to find out if they are equal or not?

雨燕双飞 提交于 2019-12-25 02:54:00
问题 Why do the equals methods implemented by Eclipse compare each value, wouldn't it be simpler to just compare the hashCodes of both objects? From what I know: hashCode always generates the same hash for the same input So if two objects are equal, they should have the same hash If objects that are equal have the same hash, I can just check the hash in order to determine of objects are equal or not edit: Related question, why does one always implement the hashCode when equals is implemented, if

Create key via SQL and C# for partition key

╄→尐↘猪︶ㄣ 提交于 2019-12-25 02:16:43
问题 I have a set of data which has a hierarchy of 3 levels. Each level has a name. I am looking at combining all of these names into a single string then creating a numeric hash that can be used as a hash key for a service fabric stateful service. I have seen lots online about finding data with keys but I am not sure how to actually create them in an efficient way. Ideally I would like a hash that is quick and easy to generate in SQL Server 2017 and C#. Can anyone point me in the right direction,

How to generate Java's String hashCode using Ruby

别说谁变了你拦得住时间么 提交于 2019-12-24 12:43:16
问题 I want to generate, in Ruby, the same hash code returned by Java's String.hashCode method. What approach would be most elegant? Java's String hashCode implementation is described here: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode%28%29 回答1: Here is a simple implementation. def jhash(str) result = 0 mul = 1 max_mod = 2**31 - 1 str.chars.reverse_each do |c| result += mul * c.ord result %= max_mod mul *= 31 end result end And some sample runs jhash("aa") 3104 jhash("")