
Java基础
文章平均质量分 92
Java基础
fedorafrog
这个作者很懒,什么都没留下…
展开
-
HashMap底层实现原理概述
1. 前言在一场面试中最能打动面试官的其实是细节,候选人对细节的了解程度决定了留给面试官的印象到底是“基础扎实”还是“基础薄弱”,如果候选人能够举一反三主动阐述自己对一些技术细节的理解和总结,那无疑是面试过程中的一大亮点。HashMap是一个看着简单,但其实里面有很多技术细节的数据结构,在一场高端的面试中即使不问任何红黑树(Java 8中HashMap引入了红黑树来处理极端情况下的哈希碰撞)相关的问题,也会有很多的技术细节值得挖掘。2. 把书读薄在Java 7中HashMap实现有1000多行,转载 2021-04-07 09:49:43 · 37416 阅读 · 9 评论 -
为什么ConcurrentHashMap的读操作不需要加锁
ConcurrentHashmap在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现JDK1.8的实现降低锁的粒度,JDK1.7版本锁的粒度是基于Segment的,包含多个HashEntry,而JDK1.8锁的粒度就是HashEntry(首节点) JDK1.8版本的数据结构变得更加简单,使得操作也更加清晰流畅,因为转载 2021-03-16 19:04:52 · 264 阅读 · 0 评论 -
HashMap底层实现原理(下)
上一篇文章我们介绍了HashMap的底层实现,但还遗留了一点内容,我们再回顾一下上一篇文章里说的内容执行完红框里的代码,personMap里放入了8个元素,放置完成后在堆内存表现如下图如果忽略底层实现细节,是这样的在Map中,一个key,对应了一个value,如果key的值已经存在,Map会直接替换value的内容,来看一下源码中是怎么实现的,来看以下代码Person oldPerson1 = personMap.put("张三", new Person("新张三", 21))转载 2021-03-16 19:00:47 · 195 阅读 · 0 评论 -
HashMap底层实现原理(上)
本来想先在专栏里简单的说一下二叉树,红黑树的内容后再说HashMap的,但看到评论区里不断的出现HashMap这个词,怕大家等得着急,本篇文章就先说说HashMap吧,前面讲ArrayList和LinkedList时把源码说得很细,只要理解了这两块内容,本篇内容也很好理解,先来看看HashMap在Map这个大家族中的位置。上图中,白色部分是接口,黄色部分是要重点了解的,最好是看一遍源码,绿色部分已经过时,不常用了,但是面试中可能会问到。这里先简单的说一下这几个Map,TreeMap是基于树的实现,.转载 2021-03-16 18:59:54 · 323 阅读 · 0 评论 -
强引用、弱引用、软引用和虚引用
前言Java执行GC判断对象是否存活有两种方式其中一种是引用计数。引用计数:Java堆中每一个对象都有一个引用计数属性,引用每新增1次计数加1,引用每释放1次计数减1。在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于(reachable)可达状态,程序才能使用它。从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。1. 强转载 2020-07-31 15:34:06 · 3416 阅读 · 0 评论 -
玩转Java8Stream(一)
相信Java8的Stream 大家都已听说过了,但是可能大家不会用或者用的不熟,笔者将在《玩转Java8Stream》系列文章中带大家从零开始使用,循序渐进,带你走向Stream的巅峰。1. 操作符什么是操作符呢?操作符就是对数据进行的一种处理工作,一道加工程序;就好像工厂的工人对流水线上的产品进行一道加工程序一样。Stream的操作符大体上分为两种:中间操作符和终止操作符2....转载 2020-03-26 13:10:45 · 603 阅读 · 0 评论 -
命令模式(Command模式)详解
在软件开发系统中,常常出现“方法的请求者”与“方法的实现者”之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。例如,想对行为进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与方法的实现者解耦?”变得很重要,命令模式能很好地解决这个问题。在现实生活中,这样的例子也很多,例如,电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者),还有计算机键盘上的“功能键...转载 2020-03-18 09:46:39 · 9468 阅读 · 0 评论 -
策略模式(策略设计模式)详解
在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。如果使用多重条件转移语句实...转载 2020-03-18 09:39:05 · 3908 阅读 · 1 评论 -
模板方法模式(模板方法设计模式)详解
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它...转载 2020-03-18 09:32:44 · 233 阅读 · 0 评论 -
门面模式(Facade模式)详解
在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外...转载 2020-03-18 09:24:36 · 1285 阅读 · 0 评论 -
组合模式(Composite模式)详解
在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。1.组合模式的定义与特点组合(Composite)模式的定义:有时又叫作部分...转载 2020-03-16 14:57:34 · 1751 阅读 · 0 评论 -
享元模式(Flyweight模式)详解
在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题。创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈。例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网中的路由器、交换机和集线器,教室里的桌子和凳子等。这些对象有很多相似的地方,如果能把它们相同的部分提取出来共享,则能节省大量的系统资源,这就是享元模式的产生背景。1.享元模式的定义与特点享元...转载 2020-03-16 14:52:06 · 1773 阅读 · 0 评论 -
装饰模式(Decorator模式)详解
在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。1.装饰模式的定义与特点装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式...转载 2020-03-16 14:46:11 · 5888 阅读 · 1 评论 -
桥接模式(Bridge模式)详解
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如...转载 2020-03-16 14:37:11 · 5088 阅读 · 0 评论 -
适配器模式(Adapter模式)详解
在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时...转载 2020-03-16 14:27:49 · 376 阅读 · 0 评论 -
代理模式(Proxy模式)详解
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真...转载 2020-03-16 14:15:50 · 19816 阅读 · 8 评论 -
建造者模式(Builder模式)详解
在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成。例如,计算机是由 OPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机,而是将计算机的配置要求告诉计算机销售公司,计算机销售公司安排技术人员去组装计算机,然后再交给要买计算机的采购员。生活中这样的例子很多,如游戏中的不同角色,其性别、个性、能力、脸型、体...转载 2020-03-16 14:09:12 · 1439 阅读 · 0 评论 -
HashMap扩容机制以及尾插法
1. resize定义当HashMap中的元素越来越多的时候,碰撞的几率也就越来越高(因为数组的长度是固定的),所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,所以这是一个通用的操作,很多人对它的性能表示过怀疑,不过想想我们的“均摊”原理,就释然了,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其...转载 2020-02-22 19:47:51 · 23170 阅读 · 2 评论 -
红黑树和AVL树(平衡二叉树)区别
1. AVL树(平衡二叉树)1.1 简介AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树树高不超过1,和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而的英文旋转非常耗时的,由此我们可以知道AVL树适合用于插入与删除...转载 2020-02-20 10:01:54 · 799 阅读 · 0 评论 -
为什么重写equals就必须重写hashCode
1.Object类的hashCode()和equals()最近看了Object类的源码,对hashCode() 和equals()方法有了更深的认识。重写equals()方法就必须重写hashCode()方法的原因,从源头Object类讲起就更好理解了。先来看Object关于hashCode()和equals()的源码:public native int hashCode();...转载 2020-02-15 11:32:21 · 432 阅读 · 0 评论 -
装饰模式(Decorator)
装饰模式又名包装模式(Wrapper)。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被装饰类。装饰模式的关键在于这种扩展是完全透明的。 在装饰模式中的各个角色有: - 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。 - 具体构建(Concrete转载 2017-07-03 21:12:18 · 227 阅读 · 0 评论 -
合成模式(Composite)
合成模式属于对象的结构模式,有时又叫做部分-整体(Part-Whole)模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。安全式和透明式的合成模式下图所示的类图略去了各个角色的细节,没有给出它们的各种方法 可以看出上面的类图结构涉及到三个角色:抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象规定一个接口。这转载 2017-06-19 23:18:54 · 346 阅读 · 0 评论 -
适配器模式(Adapter)
适配器模式是把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 这很像变压器(adapter)。变压器把一种电压变换成另外一种电压。把美国的电器拿回来国内使用的时候,用户就面临电压不同的问题。美国的生活用电是110V,而中国是220V。如果要在国内使用美国的电器,就必须有一个能把220V电压转换为110V电压的变压器。而这正是转载 2017-05-30 21:44:32 · 329 阅读 · 0 评论 -
建造模式(Builder)
建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同内部表象的产品对象。产品的内部表象一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation)。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式可以使客户端不需要知道所生转载 2017-05-24 22:42:16 · 192 阅读 · 0 评论 -
单例模式(Singleton)
作为对象的创建模式,单例模式确保某哦一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式结构很显然单例模式的要点有三个:单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其它对象提供这个实例。饿汉式单例类饿汉式单例类是在Java语言里实现起来最为简便的单例类,下图所示的类图描述了一个饿汉式单例类的典型实现: public class转载 2017-05-21 21:44:28 · 226 阅读 · 0 评论 -
抽象工厂模式(Abstract Factory)
抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。 假设一个子系统需要一些产品对象,而这些产品对象又属于一个以上的产品等级结构。那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,可以引进抽象工厂模式。这样的话,消费产品的一方不需要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。系统设计采用抽象工厂模式设计出的系统类图如下所示: 从上图可以看出,转载 2017-05-18 22:41:56 · 181 阅读 · 0 评论 -
工厂方法模式(Factory Method)
工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。它的用意是定义一个刚创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂方法模式涉及到四个角色:抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它与应用程序无关。任何在模式中创建对象的工厂类必须实现该接口。在实际转载 2017-05-17 20:23:26 · 356 阅读 · 0 评论 -
简单工厂模式(Simple Factory)
简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Method Pattern)模式。它是类的创建模式。由一个工厂类根据传入的参数决定要创建哪一种产品类的实现。简单工厂模式涉及到三个角色:工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,往往由一个具体的Java类转载 2016-04-10 16:01:27 · 783 阅读 · 0 评论