HashCode值

1. hashcode值是int的,64位。int hashCode()。
2. java object类默认的hashcode()计算方法是根据对象的内存地址来计算的。所以可由此来判断默认不重写hashcode()方法的两个对象是否相同。
3. 可重写obejetc 类的hashCode()方法,去根据object对象的实际内容生成hashcode值,比如String类,改写了hashcode(),根据string字符串的内容区生成hashcode,而非根据object类默认的内存地址。
4.hashcode值是64为int值。hashcode值是不可逆的,即无法根据hashcode值反推原值。但要注意:hashcode是可能重复的,及不同的原始值,可能hashcode相同。这也就是为什么hashmap还有个equal()方法来判断两个值是否相等。
 
 

HashMap实现原理

 1.为什么会有hashmap出现?
数组数据结构查找方便,删除困难。
链表插入删除方便,遍历性能低。
所以需设计一种数据结构,既能查询快,又能删除修改快。
 
2.数据结构:数组+链表。hashcode决定在数组的存储位置,是根据key的hashcode值(非value)取模%数组长度,来决定数组的index位置。
hashmap默认数组大小是16.即Entry [16]。
通过equal来解决hash冲突情况
 
3.loadfactor负载因子,决定hashmap扩容
4.hashmap默认的数组大小是16
5.怎么解决hash冲突?:equal()方法判断
6.put(),get()方法内部执行逻辑?
 
 

一致性哈希

6.为什么String, Interger这样的wrapper类适合作为键?

String, Interger这样的wrapper类是final类型的,具有不可变性,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。

7.ConcurrentHashMap和Hashtable的区别

Hashtable和ConcurrentHashMap有什么分别呢?它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。

8.HashMap的遍历

第一种:
  Map map = new HashMap();
  Iterator iter = map.entrySet().iterator();
  while (iter.hasNext()) {
  Map.Entry entry = (Map.Entry) iter.next();
  Object key = entry.getKey();
  Object val = entry.getValue();
  }
  效率高,以后一定要使用此种方式!
第二种:
  Map map = new HashMap();
  Iterator iter = map.keySet().iterator();
  while (iter.hasNext()) {
  Object key = iter.next();

Object val = map.get(key);
  }
  效率低,以后尽量少使用!

可是为什么第一种比第二种方法效率更高呢?

HashMap这两种遍历方法是分别对keyset及entryset来进行遍历,但是对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,它把key和value都放到了entry中,即键值对,所以就快了。

1.HashMap与Hashtable的区别:

HashMap可以接受null键值和值,而Hashtable则不能。

Hashtable是线程安全的,通过synchronized实现线程同步。而HashMap是非线程安全的,但是速度比Hashtable快。

5.如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办

HashMap默认的负载因子大小为0.75,也就是说,当一个map填满了75%的空间的时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的数组,来重新调整map的大小,并将原来的对象放入新的数组中。

下文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者

1.在软件开发的用户注册功能中常出现MD5加密这个概念,这个概念有一定的误导性。严格来说:MD5还有sha-1、 RIPEMD以及Haval等不能算是加密算法(虽然常用于把密码变成“密文”),他们只是散列算法,或者叫摘要算法。加密对应解密这个概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

2.MD5还有sha-1、 RIPEMD以及Haval等不能算是加密算法,只是散列算法,或者叫摘要算法。

2.MD5还有sha-1、 RIPEMD以及Haval等不能算是加密算法,只是散列算法,或者叫摘要算法。

2.MD5还有sha-1、 RIPEMD以及Haval等不能算是加密算法,只是散列算法,或者叫摘要算法。

3.加密对应解密这个概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

3.加密对应解密这个概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

3.加密对应解密这个概念,加密算法包括:DES、3DES、IDEA、 RSA、AES等。

4.MD5算法除了注册时对用户密码进行MD5运算以外,还常用于验证下载的软件的完整性

5.MD5算法除了注册时对用户密码进行MD5运算以外,还常用于验证下载的软件的完整性

6.MD5运算后的长度是固定的,它显然不可能包含视频、软件等源数据的全部信息。对于加密算法来说,加密后的密文是包含原始数据所有信息的,只是不能被直接读懂变的安全了。

7.MD5运算后的长度是固定的,它显然不可能包含视频、软件等源数据的全部信息。对于加密算法来说,加密后的密文是包含原始数据所有信息的,只是不能被直接读懂变的安全了。

4.要弄懂这两类算法的区别,最本质的方式就是把这两类算法的步骤搞懂,但这需要大量的时间。通过两类算法的表现可以对他们的区别有个大体的了解:
     1.MD5算法除了注册时对用户密码进行MD5运算以外,还常用于验证下载的软件的完整性(linux下面md5sum命令可以支持这一典型应用),常用电驴等下载视频和软件的用户应该知道这一点。

MD5运算后的长度是固定的,它显然不可能包含视频、软件等源数据的全部信息。对于加密算法来说,加密后的密文是包含原始数据所有信息的,只是不能被直接读懂变的安全了。

MD5运算后的长度是固定的,它显然不可能包含视频、软件等源数据的全部信息。对于加密算法来说,加密后的密文是包含原始数据所有信息的,只是不能被直接读懂变的安全了。

6. 2.加密算法是一种通信体系,经常用于分布式系统。它的目标是数据经过传输后只能被特定的有密钥的人读懂,包含加密算法和密钥2个要素。而MD5等散列算法却不包含运算后的数据只能被特定人读懂的目标,它只让机器读懂。当用于加密时,它加密后的数据对所有人一视同仁,且没有密钥机制,没有好的方法从加密后的数据得到原始数据,从而保证数据的安全。它并不是通信机制,它是不可逆的。另外它的验证数据完整性的功能上面已经提到,我想,很多有心人最初正是从这一点意识到这两类算法的区别把?

7. 2.加密算法是一种通信体系,经常用于分布式系统。它的目标是数据经过传输后只能被特定的有密钥的人读懂,包含加密算法和密钥2个要素。而MD5等散列算法却不包含运算后的数据只能被特定人读懂的目标,它只让机器读懂。当用于加密时,它加密后的数据对所有人一视同仁,且没有密钥机制,没有好的方法从加密后的数据得到原始数据,从而保证数据的安全。它并不是通信机制,它是不可逆的。另外它的验证数据完整性的功能上面已经提到,我想,很多有心人最初正是从这一点意识到这两类算法的区别把?

8.很多编程人员为了将“密码”不明示,就对密码串进行md5散列,在数据库或文件中保存md5编码;但是,千万要注意,真正到了鉴别用户身份是否合法的时候,不是通过早先记录下来的md5编码生成原文再与用户当场输入的密码串进行比较,而是将用户当场输入的密码串也实施md5变换,比较的是前后两次生成的md5编码串。

希望这个科学常识对大家有用,不要再试图从md5编码揣测原文了

8.很多编程人员为了将“密码”不明示,就对密码串进行md5散列,在数据库或文件中保存md5编码;但是,千万要注意,真正到了鉴别用户身份是否合法的时候,不是通过早先记录下来的md5编码生成原文再与用户当场输入的密码串进行比较,而是将用户当场输入的密码串也实施md5变换,比较的是前后两次生成的md5编码串。

希望这个科学常识对大家有用,不要再试图从md5编码揣测原文了

java基础之hashcode理解及hashmap实现原理及MD5的更多相关文章

  1. Java 基础:hashCode方法

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 泥瓦匠最近被项目搞的天昏地暗.发现有些要给自己一些目标,关于技术的目标: 专注很重要.专注J ...

  2. Java基础教程:HashTable与HashMap比较

    Java基础教程:HashTable与HashMap比较 1.  关于HashMap的一些说法: a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.HashMap的底层结 ...

  3. Java基础之hashCode方法具体解释

    想要明确hashCode的作用,必须要先知道java中的集合.(不明确的请看Java基础之集合框架具体解释(二)List篇和Java基础之集合框架具体解释(三)Set篇) Java中的Collecti ...

  4. Java基础之深入理解Class对象与反射机制

    深入理解Class对象 RRIT及Class对象的概念 RRIT(Run-Time Type Identification)运行时类型识别.在<Thinking in Java>一书第十四 ...

  5. Java基础之集合框架——使用HashMap地图(TryPhoneBook1)

    控制台程序. 首先改进Peron类,使Person可以在地图中用作键,进而存储电话簿中的项.必须添加equals()方法并重写默认的hashCode()方法. import java.io.*; pu ...

  6. java基础 (一)之HashMap

    HashMap的存储结构是由数组和链表共同完成.Entry<K,V>[] ,Entry是单向链表. 1 HashMap数据结构 HashMap的底层主要是基于数组和链表来实现的,它之所以有 ...

  7. Java基础:hashCode与equals个人学习记录

    摘要: 本文主要记录本人对hashCode和对equals两个知识点的学习过程. 从学生时期初学java,就知道hashCode和equals这两个方法,工作中equals方法使用也是特别频繁,要说e ...

  8. Java基础系列-深入理解==和equals的区别(一)

    一.前言 说到==和equals的问题,面试的时候可能经常被问题到,有时候如果你真的没有搞清楚里边的原因,被面试官一顿绕就懵了,所以今天我们也来彻底了解一下这个知识点. 二.==和equals的作用 ...

  9. Java 基础:认识&理解关键字 native 实战篇

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 泥瓦匠初次遇见 navicat 是在 java.lang.Object 源码中的一个hashCode方 ...

随机推荐

  1. ubuntu获得root用户权限,使用xshell连接!

    一.获取root用户权限 打开linux终端命令,输入 sudo passwd root Enter new UNIX password: (在这输入你的密码) Retype new UNIX pas ...

  2. nginx-request_time和upstream_response_time

    1.request_time 官网描述:request processing time in seconds with a milliseconds resolution; time elapsed ...

  3. Ubuntu 17.10开启 root 登陆

    使用过 Ubuntu 的人都知道,Ubuntu 默认是不能以 root 登陆的,但是我们是不是就完全不能使用 root 进行登陆了呢?当然不是,只是我们需要做一些设置.而 Ubuntu 17.10 和 ...

  4. C++中bool类型变量初值对程序的影响

    很困惑的一个问题 #include<iostream> using namespace std; int main() { //bool a=true; //非0(1,2,3,……)输出1 ...

  5. CF 586B 起点到终点的最短路和次短路之和

    起点是右下角  终点是左上角 每次数据都是两行的点  输入n 表示有n列 接下来来的2行是 列与列之间的距离 最后一行是  行之间的距离 枚举就行   Sample test(s) input 41 ...

  6. 【LOJ】 #2545. 「JXOI2018」守卫

    题解 只会蠢蠢的\(n^3\)--菜啊-- 我们发现最右的端点一定会选,看到的点一定是当前能看到的斜率最小的点变得更小一点,记录下这个点,在我们遇到一个看不到的点的时候,然后只用考虑R到它斜率最小的这 ...

  7. 匹配合法IP地址的正则表达式

    IPV4地址分为4段,以点号分隔.如192.168.26.13.要对IP地址进行匹配,首先要对其进行分析,分成如下部分,分别进行匹配: 第一步:地址分析,正则初判 0-9      \d 进行匹配 1 ...

  8. PHP接入支付宝支付

    创建应用 使用支付宝账号登录开放平台创建应用,应用创建成功之后可以得到APPID等相关信息 接着需要设置RSA密钥,可以使用蚂蚁金服开放平台提供的生成工具,生成完密钥需在开放平台中填写. 代码接入 引 ...

  9. 浅谈 Java 中的枚举

    枚举也就是一一列举,常用来表示那些可以明确范围的集合,比方说性别,季节,星期,月份等. 在 JDK 1.5 才出现枚举类,在没有出现枚举类之前,我们要表示几个确定的值通常会使用常量来表示,形如 pub ...

  10. 微服务:如何优雅的使用Mybatis

    个人比较喜欢 jpa 这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis.到网上找了一下关于 spring boot 和 mybatis 组合的相关资料,各种各样的形式都有,看的人 ...