hashcode

[Java学习笔记] Java核心技术 卷1 第五章 继承

拥有回忆 提交于 2020-02-01 17:11:46
第5章 继承 利用继承,可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。还可以在此基础上添加新的方法和域。 反射。 5.1 超类子类 使用extends构造一个派生类 class Manager extends Employee { 添加方法和域 覆盖:重写一些基类中不适合派生类的方法 } 所有的继承都是公有继承。即所有的公有成员和保护成员都保持原来的状态,基类的私有成员仍然是私有的。不能被派生类的成员访问。 (C++中私有继承或保护继承会将 公有成员和保护成员都变成派生类的私有成员或保护成员) 基类、父类、超类:被继承的类 派生类、孩子累、子类:新的类 使用super调用基类被覆盖的方法。super与this不同,仅是用来指示编译器调用超类方法的特殊关键字。 使用super调用基类的构造器 super(参数列表..);由于派生类不能调用基类的私有域,所有需要调用构造器对私有域初始化。 如果派生类没有显示调用超类构造器,则自动调用基类默认的构造器。如果超类没有不带参数的构造器又没有显式的调用超类的其他构造器,则Java编译器将报错。 class Employee { private double salary; public double getSalary(){...} public Employee(double x){...} } class

Java HashMap详解

久未见 提交于 2020-02-01 00:53:40
Java HashMap详解 什么是Map? 什么是HashMap? HashMap初始化 HashMap原理 HashMap扩容 HashMap面试题 什么是Map? 要理解hashMap,首先你要知道什么是map,map是用于存储键值对(<key,value>)的集合类。在java中map是一个接口,是和collection接口同一等级的集合根接口。 map的特点:1、key是无序、唯一的; 2、value是无序不唯一的。 什么是HashMap? HashMap是用哈希表(数组+单链表)+红黑树实现的map类(JDK1.8之前是数组+单链表,JDK1.8加入了红黑树)。 红黑树实际上就是一个二叉树,只是每个节点都被标记为黑色或者红色。 HashMap初始化 Map map = new HashMap(); HashMap默认初始大小为16。大小只能是2的n次方,若强行给初始大小为非2的n次方,HashMap会自动调整为2的n次方。 HashMap的最大容量为2的30次方,传入容量过大将被这个值替换: static final int MAXIMUM_CAPACITY = 1 << 30("<<"为左移运算符,1表示十进制中的“1”,30表示十进制数字1转化为二进制后向左移动30位。在数值上等同于2的30次幂) 详解:java中int类型的长度为32位,即2的31次方

java学习(三)

混江龙づ霸主 提交于 2020-01-31 11:10:16
1、HasMap的存储和获取原理 当 调用put()方法传递键和值来存储时 ,先对键调用hashCode()方法,返回的hashCode用于 找到bucket位置来储存Entry对象 ,也就是找到了该元素应该被存储的 桶中(数组) 。当两个键的hashCode值相同时,bucket位置发生了冲突,也就是 发生了Hash冲突 ,这个时候,会在每一个bucket后边接上一个链表(JDK8及以后的版本中还会加上红黑树)来解决,将新存储的键值对放在表头(也就是bucket中)。 当调用get方法 获取存储的值 时,首先根据键的hashCode找到对应的bucket,然后根据equals方法来在链表和红黑树中找到对应的值。 2、解决Hash冲突的方法有哪些? 拉链法 (HashMap使用的方法) 线性探测再散列法 二次探测再散列法 伪随机探测再散列法 3、哪些类适合作为HashMap的键? String和Interger这样的包装类很适合做为HashMap的键,因为他们是final类型的类,而且 重写了equals和hashCode方法 ,避免了键值对改写,有效提高HashMap性能。 为了计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashCode的话,那么就不能从HashMap中找到你想要的对象。 4、ConcurrentHashMap的具体实现方式

java常用类---Object类

别说谁变了你拦得住时间么 提交于 2020-01-30 02:35:37
1.API概述以及Object类的概述 A:API(Application Programming Interface) 应用程序编程接口 B:Java API 就是Java提供给我们使用的类,这些类将底层的实现封装了起来, 我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。 C:Object类概述 类层次结构的根类 所有类都直接或者间接的继承自该类 D:构造方法 public Object() 回想面向对象中为什么说: 子类的构造方法默认访问的是父类的无参构造方法 2.Object类的hashCode()方法 public int hashCode() a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。 b:不同对象的,hashCode()一般来说不会相同。 但是,同一个对象的hashCode()值肯定相同。 c:不是对象的实际地址值,可以理解为逻辑地址值。 public class MyTest { public static void main ( String [ ] args ) { // java.lang 这个包下的类,可以不用导包 // 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 //Object 是一个顶层父类,所有类,都是直接或间接继承自他 // 空参构造

How does the JVM ensure that System.identityHashCode() will never change?

拜拜、爱过 提交于 2020-01-26 15:12:51
问题 Typically the default implementation of Object.hashCode() is some function of the allocated address of the object in memory (though this is not mandated by the JLS ). Given that the VM shunts objects about in memory, why does the value returned by System.identityHashCode() never change during the object's lifetime? If it is a "one-shot" calculation (the object's hashCode is calculated once and stashed in the object header or something), then does that mean it is possible for two objects to

HashMap,TreeMap,LinkedHashMap学习

被刻印的时光 ゝ 提交于 2020-01-26 01:04:07
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关

Index索引文件

流过昼夜 提交于 2020-01-26 00:57:24
1.IndexHeader头部,40字节,记录IndexFile的统计信息: begainTimestamp:该索引文件中包含消息的最小存储时间 endTimestamp:该索引文件中包含消息的最大存储时间 begainPhyoffset:该索引文件中包含消息的最大物理偏移量(commitlog文件偏移量) endPhyoffset:该索引文件中包含消息的最大物理偏移量(commitlog文件偏移量) hashslotCount:hashslot个数,并不是hash槽的个数,在这里意义不大 indexCount:Index条目列表当前已使用的个数,Index条目在Index条目列表中按顺序存储 2.Hash槽,一个IndexFile默认包含500万个Hash槽,每个Hash槽存储的是落在该Hash槽的hashcode最新的Index的索引 3.Index条目列表:默认一个索引文件包含2000万个条目,每一个Index条目结构如下 hashcode:key的hashcode phyoffset:消息对应的物理偏移量 timedif:该消息存储时间与第一条消息的时间戳的差值,小于0该消息无效 preIndexNo:该条目的前一条记录的Index索引,当出现hash冲突时,构建的链表结构 关键:map<String消息索引key,long 消息物理偏移量> IndexFile

JAVA基础

ぃ、小莉子 提交于 2020-01-25 23:50:40
java重写和重载 重写: 是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改 变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要 实现父类的方法。 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一 个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子 类异常 重载: 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也 可以不同。 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。 最常用的地方就是构造器的重载。 重写和重载的区别 方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与 子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类 型和次序不同,则称为方法的重载(Overloading)。 (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回 值也一样的方法,就称为重写

还看不懂同事代码?快来补一波 Java 7 语法特性

早过忘川 提交于 2020-01-25 01:47:30
前言 Java 平台自出现到目前为止,已经 20 多个年头了,这 20 多年间 Java 也一直作为最流行的程序设计语言之一,不断面临着其他新兴编程语言的挑战与冲击。Java 语言是一种 静态强类型 语言,这样的语言特性可以让 Java 编译器在 编译阶段 发现错误,这对于构建出一个 稳定安全且健壮 的应用来说,尤为重要。但是也因为这种特性,让 Java 开发似乎变得缺少灵活性,开发某些功能的应用时,代码量可能是其他语言的几倍。Java 开发的不足之处也体现越来越复杂的 JDK 上,越来越复杂的 JDK 让开发者完全理解的难度变的非常大。以至于开发者有时会重复实现一个 JDK 中已经提供了的功能。 为了跟上互联网应用编程发展的脚步, Java 从 9 版本开始调整了 JDK 发布的节奏,JDK 的每次更新都注重 提高生产效率 ,提高 JVM 性能 ,推行 模块化 等,让开发者可以更多的专注于业务本身,而不是浪费过多的时间在语言特性上。 Java 语言的更新要在语言的严谨性和灵活性上找到一个平衡点,毕竟灵活性可以减少编码的复杂度,而严谨性是构建复杂且健壮应用的基石。 Java 7 语言特性 Java 重要的更新版本是在 Java 5 版本,这个版本中增加了如泛型、增强 for、自动装箱拆箱、枚举类型,可变参数、注解等一系列 重要功能 ,但是随后的 Java 6

Hash UUIDs without requiring ordering

强颜欢笑 提交于 2020-01-24 17:52:12
问题 I have two UUIDs. I want to hash them perfectly to produce a single unique value, but with a constraint that f(m,n) and f(n,m) must generate the same hash. UUIDs are 128-bit values the hash function should have no collisions - all possible input pairings must generate unique hash values f(m,n) and f(n,m) must generate the same hash - that is, ordering is not important I'm working in Go, so the resulting value must fit in a 256-bit int the hash does not need to be reversible Can anyone help?