3 swpu_ocean

尚未进行身份认证

个人博客网站:www.zhyocean.cn

等级
TA的排名 6w+

JDK1.7和JDK1.8中HashMap为什么是线程不安全的?

前言只要是对于集合有一定了解的一定都知道HashMap是线程不安全的,我们应该使用ConcurrentHashMap。但是为什么HashMap是线程不安全的呢,之前面试的时候也遇到到这样的问题,但是当时只停留在***知道是***的层面上,并没有深入理解***为什么是***。于是今天重温一个HashMap线程不安全的这个问题。首先需要强调一点,HashMap的线程不安全体现在会造成死循环、数据丢...

2019-03-30 19:57:35

LinkedHashMap源码解读

前言之前在看HashMap的源码时看到几个空实现的函数,当时也没有在意,今天在了解LinkedHashMap时突然明白了那个空实现函数(钩子函数)的意义。本文源码版本依旧是JDK1.8。LinkedHashMap钩子函数首先先来看看HashMap中所谓的钩子函数。为什么在HashMap中会有这几个空实现的钩子函数呢,原因很简单,因为HashMap的子类要用啊。接着往下看就会明白这几个...

2019-03-15 16:34:19

从源码初步了解ConcurrentHashMap

为什么要了解ConcurrentHashMap首先先说下为什么我们需要了解ConcurrentHashMap。原因其实很简单:①HashMap在多线程环境下会有线程不安全的情况,比如在put时会造成死循环。②线程安全的HashTable效率低,HashTable的所有方法都使用Synchroized来确保线程安全,但是这也是当一个线程进行get操作时,其他线程想要get也得靠边等待。为了保证线...

2019-02-23 16:57:41

数据库索引到底是什么鬼?

进行后端开发经常会与数据库打交道,对于数据库的一些核心基础了解太浅,比如经常听到的数据库索引、锁等,在小项目开发过程中也没有过于严格的执行索引的建立,而是想当然的对表直接设置一个自增字段作为主键,这些还是源于对于索引的认识不够深喃。索引在此之前,对于索引的认识如下:索引相当于一张表的附加表,存储着表中建立索引的字段值以及对应记录值的地址,在进行查询操作时,首先在索引表中进行查询,根据查询的...

2019-01-13 13:03:38

Intellij IDEA 快捷键整理

【常规】Ctrl+Shift+Enter,语句完成“!”,否定完成,输入表达式时按“!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[OR],可以跑到大括号的开头与结尾Ctrl+F12,可以显示当前文件的结构Ctrl+F7,可以查询当前元素在当前文件中的引用,然后按F3可以选择Ctrl+N,可以快...

2019-01-08 11:06:30

逝去的2018年,年度总结

特意选在2018年的最后一天来总结下今年都干了些什么蠢事时间过得很快,转眼间就到了一年的最后一天。在我的脑海里对于2018好像没有什么记忆,不过仔细想想今年干过的事还挺多的,于是打算花点时间对这一年做一个总结。写在前面以前,对于自己的生活都是匆匆过往,没有留下点什么东西,也感觉比较遗憾的。也许是我的记性不太好,对于一些平常到尘埃的小事,往往都是过段时间就觉得没有发生过一样,我也想让生活...

2019-01-04 11:38:24

如何通关设计模式之适配器模式

“补救模式”经常在业务开发过程中都会遇到需求变动等情况,一个再好的程序猿也难免设计出一个“完美”的业务系统。因为,需求永远是变化的。“智者千虑必有一失,愚者千虑必有一得”,我们都是平庸之人,无法做到百分百的完美系统,对于有些“意外”,该来的总会来,而为了去弥补这些意外,就需要使用到一些补救措施。这个补救措施叫做适配器模式,也可以说是一种补救模式。适配器的“补救”假如我是一个公司的老大,今天...

2018-12-30 17:24:01

如何通关设计模式之责任链模式

责任在哪?责任链模式看名称可以理解为责任连成一条链。这也没有什么毛病,责任链模式的重点也在于“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果。责任链模式的核心在“链”上,链是由多个处理者组成的。“古代妇女的枷锁”——责任链的体现中国古代对于妇女指定了“三从四德”的道德规范。“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说,一位女性在结婚前要听从于父亲,结...

2018-12-28 22:22:36

如何通关设计模式之代理模式

代理模式在我们平常应用中极为常见,尤其是对于JavaWeb开发来说,使用的Spring框架中AOP(面向切面编程)就是使用的代理模式中的动态代理。代理模式的定义对其他对象提供一种代理以控制对这个对象的访问。听起来有点玄乎,换个栗子来将,平常在生活中打官司,你会请名律师,律师的任务就是帮你处理中间的所有事,而解放你的双手,律师就相当于代理,通过他我们可以完成我们想要完成的事。栗子首先先通过...

2018-12-22 20:37:34

你必须知道的HashMap面试题

1.HashMap的工作原理,其中get()方法的工作原理?HashMap基于hash原理,通过put()和get()方法存储和获取元素。它内部使用数组+链表或红黑树的结构,通过hash运算找到bucket位置来存储Entey对象,通过equals()方法找到正确的键值对。HashMap使用链地址法来解决hash碰撞问题,当发生碰撞时,对象会存储在链表的下一个节点处。get()首先通过计算ke...

2018-12-20 22:15:28

如何通关设计模式之工厂模式

何为工厂模式?工厂模式主要为创建对象提供过渡接口。屏蔽对象的实例化具体过程,以达到灵活的作用。工厂模式分为以下三种:简单工厂模式(静态工厂模式)工厂方法模式抽象工厂模式简单工厂模式和抽象工厂模式是对工厂方法模式的扩展。与工厂方法模式也有千丝万缕的关系。下面就以工厂方法模式为例。工厂方法模式在单例模式中,要求只能存在唯一类实例,也就是只能有一个女朋友实例存在,今天,我们通过工厂模...

2018-12-19 20:49:08

如何通关设计模式之单例模式

一、单例模式的定义单例模式可谓是设计模式中最简单的一个,没有之一。它的作用也跟其名一样,单例单例,只能生成一个该类的实例。通常我们可以使用new来创建对象,想要多少女朋友就new多少女朋友。但是现在不行了,单例模式规定,你只准有一个女朋友。于是乎…二、单例模式的实现现在我们想要有一个女朋友,而且必须有且仅有一个,多了在一起会打架,所有我们现在该怎么做呢。publicclassGirlF...

2018-12-18 20:01:00

从源码深入理解HashMap(附加HashMap面试题)

HashMap向来是面试中的热点话题,深入理解了HashMap的底层实现后,才能更好的掌握它,也有利于在项目中更加灵活的使用。本文基于JDK8进行解析一、HashMap解析1.结构HashMap结构由数组加**链表(或红黑树)**构成。主干是Entry数组,Entry是HashMap的基本单位,每一个Entry包含key-value键值对。每个Entry可以看成是一个链表(或红黑树)...

2018-12-17 14:09:48

排序算法之基数排序

基本思想基数排序是将整数按位数分割成不同的数字,然后按每个位数分别比较,得到一个有序的序列。具体做法则是将一个数组中的每一个数统一成相同位数,位数不足高位补零。从个位开始按大小排序,当遇到位数大小相同时,要保证顺序与原数组相同。这样从个位一直到高位,就得到一个有序的序列。实现思路文字性的语言总是那么不便于理解,那么我们来通过图文说明下基数排序的思路。假设有这样一个大小为10的数组:{6,6...

2018-11-23 22:06:23

排序算法之交换排序(冒泡排序、快速排序)

前言在前面几篇博客中总结了插入排序(直接插入和希尔排序)、选择排序(直接选择和堆排序)以及归并排序,这里将讲下两种选择排序算法——冒泡排序和快速排序。冒泡排序基本概念冒泡排序相对快速排序而言相对简单。冒泡就如同水里的鱼吐泡泡一样,刚开始时泡泡很小,但随着上浮离水面越来越近,泡泡也逐渐变大。冒泡排序也是因此而来,在每一趟排序中,依次比较相邻的两个数,选出最大的数将它移到一端,最终将得到一个有...

2018-11-12 13:52:24

排序算法之归并排序

基本思想归并排序是利用归并的思想,合并两个已排序的表,将结果输出到第三个表中。基本的合并算法是去两个输入数组A和B,一个输出数组C,以及3个计数器Actr、Bctr、Cctr,它们初始置于对应数组的开始端,当数组A[Actr]或数组B[Bctr]中的较小者被拷贝到C中的下一个位置时,相关的计数器向前推进一步。归并排序采用经典的分治策略,它将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶...

2018-11-07 14:03:38

关于垃圾收集器的内存回收机制

前言对于垃圾收集器回收内存应该有以下几点思考:哪些内存需要回收?什么时候被回收?如何回收?哪些内存需要被回收?在Java内存运行时区域中,虚拟机栈、本地方法栈、程序计数器3个区域随线程而生,随线程而亡。所以它们不需要垃圾收集器来管理。而堆和方法区则不一样,堆中存放的对象实例和方法区中的内存只有在运行期间才知道,这部分内存的分配和回收都是动态的,垃圾收集器关注的就是这部分内存。内...

2018-11-03 22:17:13

JVM的内存区域的划分

JVM运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。分别是方法区、虚拟机栈、本地方法栈、堆、程序计数器。程序计数器字节码解释器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令。每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响。因此程序计数器为“线程私有”内存。虚拟机栈每个方法在执行时会创建一个栈帧,用于...

2018-11-02 21:55:26

排序算法之选择排序(直接选择、堆排序)

排序算法稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。————百度百科排序原理每一趟从待排序序列中找出最小的元素,顺序放在已排好序的序列最后,直到全部序列排序完毕。直接排序原理假设...

2018-11-01 18:10:43

排序算法之插入排序(直接插入、希尔排序)

前言一个好的排序算法对于程序的优化会有很大的提升,虽然在许多语言的类库中就存在了N种排序方法,但是只有在了解了每一种排序算法后才能更好的在实际中运用这些算法。这里我主要说明插入排序中的直接插入以及希尔排序的实现。直接插入直接插入排序是最简单的排序算法之一。对于直接插入排序,它始终维护着一个有序序列,在每一次插入操作时都将元素插入到这个有序序列对应的位置上。对于一个待排序序列:3148...

2018-10-31 16:19:45

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得