- 博客(55)
- 资源 (2)
- 收藏
- 关注
原创 如何优雅的删除List中的元素
问题如何删除list中index为偶数的元素?简单分析:首先我们得明确一点,就是不能边for循环,边删除元素,会出现越界的异常。那我们来看看怎么实现。解决方式1:标记整理清除套用了Old区使用的gc算法,就是将需要的元素标记,然后整理到一侧,最后删除无用元素。直接上代码: /** * 去掉数组的index为偶数的元素 * * @param list list * @return List */ private List<Integ
2021-04-27 17:35:59
599
原创 多线程下的计数器
概述juc是java的核心包,而juc下面的核心包之一应该就是locks了,而locks下最核心的类就是AbstractQueuedSynchronizer类(简称aqs),它可以说是多线程下所有锁相关类的父类,我们来看看它有多少子类。可以看到有ReentrantLock,ReentrantReadWriteLock,Semaphore,CountDownLatch,ThreadPoolExecutor。ps: CyclicBarrier是采用ReentrantLock实现的。这次我们先学习一下多线程
2021-04-27 14:51:53
2306
原创 Object.wait/notify和synchronized的协作
private static final Object LOCK = new Object(); private int i = 0; private static final int MAX_VALUE = 100; public static void main(String[] args) { try { Thread.sleep(5000); } catch (InterruptedException e)...
2021-04-26 15:49:38
248
原创 Synchronized的由浅入深
Synchronized的由浅入深一. 使用synchronized可用来修饰实例方法,静态方法和代码块,其作用是为了保证被修饰的方法或代码块在同一时间内,只有一个线程可以执行。那么我们先看看如何使用,因重点不是介绍使用,会快速而简单的介绍下。public class TestSynchronized { private static int count = 0; public synchronized void increase() { for (int i =
2021-03-12 18:42:02
188
1
原创 图解JVM(五)——运行时数据区总结
Q1 : JVM内存模型,有哪些区,分别的作用?类加载子系统将class文件加载到运行时数据区class文件内容会按照规范加载到运行时数据区的不同区域执行引擎通过运行时数据区进行指令执行运行时数据区分类:虚拟机栈:堆内存:方法区:Q2: Java 8的内存分代改进?Q3 : 类加载流程Q4: 对象什么时候进入老年代?Q5: Eden和Survivor的比例分配,为什么有两个survivor区?默认情况下Eden space : Survivor 0 space :
2021-02-19 10:52:09
123
原创 图解JVM(四)——方法区
方法区,堆,虚拟机栈的合作关系为了解析方法区,堆,虚拟机栈的合作关系,我写了一个非常简单的测试代码,如下 public static void main(String[] args) { Person person = new Person(); } public class Person { }Person person = new Person();这一语句可以分为3个部分来解释,Person,person,new Person()。P
2021-02-19 09:38:38
275
1
原创 图解JVM(三)——堆
概述堆是JVM存放对象和数组的区域,线程共享。其逻辑划分如图。堆是JVM内存管理最大的一块区域,也是GC的重点区域。查看堆内存的两种方式1. JVisualVM此软件就在jdk的bin目录下,记得先去安装Visual GC的插件(网上有教程,不赘述)。打开后就如下图,可以看到本地的一些Java进程。2. jps + jstatjps + jstat是Java的两个命令,可以直接在命令行中执行。jps:查看当前Java进程jstat -gc 端口号:查看当前进程堆内存情况
2021-02-05 16:56:53
788
2
原创 图解JVM(二)——线程私有区
Runtime类:用于应用程序获取当前java虚拟机运行时环境的。每个JVM只有一个Runtime实例JVM允许一个应用多线程,每个线程与操作系统的本地线程直接映射。操作系统负责线程调度到CPU,本地线程初始化成功,就会调用Java线程的run方法。JVM的系统线程:虚拟机线程:周期任务线程GC线程编译线程:将字节码编译成本地代码信号调度线程程序计数器(Program Counter Register)对物理PC寄存器的抽象模拟。存储指向下一条指令的地址。由执行引擎读取下一条指令。空间很.
2021-01-29 14:26:14
2557
1
原创 图解JVM(一)—— 概述&类加载子系统
简介jvm是一个应用程序,其作用是运行jvm字节码,为什么叫jvm字节码呢?因为jvm支持运行各种语言编译成的字节码,而不仅仅是java,当然java字节码是最广泛的。其功能主要分为两点:write once,run anywhere:在不同的硬件平台都有对应的jvm程序,字节码可以运行在任意平台的jvm中。提供内存管理和垃圾回收等功能JVM支持的指令流是基于栈的指令集架构,下面是将该方法所在类编译成的class文件,通过javap进行反编译后的代码,可以看到基本指令就是iconst,istor
2021-01-06 13:53:52
335
原创 设计模式之中介者模式-你的系统内部效率低嘛(Mediator)
问题中介者模式和外观模式有些类似,学习中介者模式可以和外观模式对比着一起学习。可以参考设计模式之外观模式-与单一职责的PK(Facade)。下图是我总结的外观和中介者的区别。外观模式解决的是顾客频繁访问店内的各个部门的问题,增加接待经理,由接待经理来接待顾客,同时也由接待经理来与店内各个部门进行沟通处理。中介者解决的是店内各个部门频繁交互访问的问题,新增一个协调部门或者总经理担任中介者的角色,来协调各个部门频繁访问的问题。废话不多说,我们来描述我的电脑城新的问题。我的电脑城现在有4个采购部,分别是A,
2020-08-19 14:05:50
121
原创 设计模式之迭代器模式-消灭傻瓜遍历(Iterator)
问题迭代器模式其实很好理解,不过我还是举一个我的电脑城的问题来引入吧。话说我的仓库存了50台电脑,今天的打算给我的企业客户运送过去。卡车司机到仓库门口说来运50台电脑,管理员跟司机说:你再仓库的西南角搬20台,再到中间区域搬10台,再到北边搬10台,再到东边搬10台。说完司机就怒了,说你想累死我啊,你就一台一台往仓库门口放,我就一台一台往车上运,其他的我不管。这就是迭代器模式!实现先看下电脑的实现,加个index,标明序号public class Computer { private in
2020-08-18 13:45:07
102
原创 设计模式之命令模式-命令之下出效率(Command)
问题我的电脑城的有多个销售经理,有一个配件管理员。之前的模式是销售经理接待客户,客户提出需求,销售经理告诉配件管理员,例如三星1t固态硬盘一个,罗技键盘一个等等。配件管理员记录之后,从仓库拿出配件,再交付给对应客户。这样就出了个问题,在忙的时候,一个管理员需要对多个销售经理,然后需求不同,记录并取货,还有的时候,客户定下来之后又后悔了,不要了或者想换个别的,管理员就被销售经理给折腾疯了,根本不知道哪些是需要的,哪些是不需要的,还经常拿错了配件给到客户。这样下去可不行啊,乱糟糟的流程导致员工们经常出错。这就
2020-08-17 14:57:02
165
原创 设计模式之状态模式-消灭switch,case(State)
问题电脑城开始不满足于仅仅销售数码产品,着手研发产品。前期的话,先研发一些比较简单的产品,分别是台灯和电视。台灯的设计:在关闭状态下,点击开关按钮,从弱光—>强光—>关闭。电视的遥控器设计,在关闭状态下,点击开关按钮,打开电视,点击其他按钮,显示红灯,提示未开机。在开机状态下,点击开关按钮,关机,点击其他按钮,执行对应操作。如果不做任何考虑的话,可以在点击按钮时,判断当前状态,根据状态的不同来决定执行对应的操作。我们先来看看状态模式如何解决上述问题,再来看看其优劣。实现先看台灯的实现pu
2020-08-13 13:48:05
1648
原创 设计模式之观察者模式-节约资源就靠它(Observer)
问题最近出的华为mate x卖的非常火爆,常常出现断货的情况。有些顾客为了买到mate x,每天都往店里跑来咨询是否有货,顾客很辛苦;当到货的时候,很多顾客没有来买,我只能挨家挨户的通知所有人到货了,你们快来买,店员很辛苦。既然这么辛苦的话,我们就相互减轻一点工作量。这就引入我们的观察者模式简介上述问题中描述的两种情况,都是计算机中常见的情形。了解的朋友一下就能知道,一个是轮询,另一个是广播。而轮询和广播都是非常消耗资源的(顾客和店员都很辛苦),在非必要的情况下,当然是尽量时避免轮询和广播的。而观察者
2020-08-12 11:33:52
106
原创 设计模式之责任链模式-单一职责的完美诠释(chain of responsibility)
问题责任链模式的引入需要从外观模式和代理模式引入,我们因为不希望顾客不停的和不同部门和人员打交道,设置了接待经理,由接待经理统一负责。又因为接待经理可能会过于繁忙,所以给他请了秘书,代理其工作,减少无谓的交互。即便这样,接待经理仍然忙不过来,就思考给他减负。那么想到的就是其实对于组装电脑的流程是固定的,无需接待经理在中间和各个部门交互,可以固定收银人员收银后交给组装人员组装,组装人员组装后,交给打包人员打包,打包人员打包之后交给接待经理,由接待经理交给顾客。这就是责任链模式简介责任链模式的思想几乎遍布
2020-07-28 16:26:03
317
原创 设计模式之代理模式-代理,外观傻傻分不清楚(Proxy)
问题不知道大家还记不记得外观模式中的接待经理,如果不记得的话,请参考设计模式之外观模式-与单一职责的PK(Facade)。接待经理负责和顾客沟通,同时和销售,收银,组装,打包等等对接,来提供给顾客最好的服务。但是呢,今天我需要安排他去参加一个全天会议,那店里没他可不行啊,那这怎么办呢?我只好通过代理模式来解决这个问题。简介首先我们先思考这个问题该怎么解决?我的解决方案是给他请一个秘书,一方面缓解其平时的工作压力,控制并非所有事项都去找接待经理;一方面防止其不在的时候,可以临时代理其工作。所以代理模式的
2020-07-17 11:18:01
292
原创 设计模式之享元模式-池技术的指导思想(Flyweight)
问题众所周知,我的电脑城以台式机高度定制出名,客户到店后经理都会根据客户的需求配置他所希望的电脑。在前期的时候,顾客量少,我们会给顾客提供的配置清单基本不会重复。但是呢,随着生意越来越好,顾客越来越多,出现重复配置的情况越来越多,但是呢,因为我们之前不存档,所以每次都需要给客户开一份新的一样的清单。对于经理来说,其实在这方面完全可以提高效率的。怎么提高呢?那就是我们的今天要聊的享元模式了。简介先总结下上面的问题:工作中会遇到大量重复的清单数据,而因为没有存档,而会导致每一次遇到清单数据时,都需要重新创
2020-07-16 13:56:10
326
原创 设计模式之外观模式-与单一职责的PK(Facade)
问题在我的电脑城里,为了提高效率,专门设有销售人员,收银人员,组装人员,打包人员等等。客户进来购买电脑的时候,先找销售人员,确定好组装配件,销售人员将单子给到客户,让客户拿着单子到收银人员买单,再让客户拿着收银单到组装人员那里去做配件组装。。。听起来很流畅,效率很高。但是呢,客户不高兴了,说:把你们老板给我叫出来,对着我就是一顿骂:你这老板怎么回事,我就买个电脑,你让我从这跑到那,再跑到那,累都累死了,你就这么对待上帝的嘛。我这么一想,确实是不行啊,怎么能让顾客来回跑呢。那我就使用外观模式来解决客户问题啊
2020-07-15 11:52:17
422
原创 设计模式之装饰者模式的应用场景(Decorator)
问题装饰者模式的问题,我想从桥接模式引入,对桥接模式不了解的可以参考设计模式之桥接模式。桥接模式解决的问题是我卖的笔记本电脑的组成例如cpu或cache有很多种类型或大小,如果使用继承的方式,会生成非常多的类,难以维护。所以使用桥接模式,将cpu或cache抽象化,在生产电脑时,再将特定类型或大小的组成部分组装到笔记本电脑中。完美!但是呢,现在又一个问题出现了,客户对电脑要求越来越高,希望可以扩展插入SSD和内存条。嗯,听到这个问题,我觉得很简单呀,在电脑中继续扩展两个组件SSD和cache。这时候发现
2020-06-29 18:46:59
1907
1
原创 设计模式之轻松理解组合模式(Composite)
问题在双11大促中,为了提高销量,我决定将华为电脑,手机,耳机等系列商品做成礼盒打包销售,初步暂定了两个礼盒:1. 华为高级礼盒:华为笔记本 + 机械键盘 + 手机礼盒,手机礼盒:手机 + 耳机 + 手表礼盒, 手表礼盒:手表 + 定制表带2. 华为基础礼盒:华为笔记本 + 无线鼠标 + 手机礼盒,手机礼盒:手机 + 手表礼盒,手表礼盒:手表销售员问我这两个礼盒如何定价,我告诉他说,把所有商品的价格加起来,打个九折就行。销售员拿着计算器吭哧吭哧算了半天,告诉我高级礼盒价值¥18000,基础礼盒价值
2020-06-28 16:03:26
251
原创 设计模式之桥接模式
问题不知道大家是否还记得我之前在建造者模式的时候卖的电脑,嗯,不记得也没关系,我们再来看一下。public class Computer { private String screen; private String cpu; private String keyboard; private String disk; /** * 主机 */ private String engine; private String
2020-06-01 14:28:53
204
原创 设计模式之适配器模式
问题前面的时候,我已经在生产华为和苹果的手机了,实际上我不仅做手机的生产,还会做手机相关的配件,比如说耳机。我在生产华为和苹果手机之前,就已经提前制造了大量的圆孔耳机。奈何,华为和苹果产品更新换代太快,新版苹果和华为手机都不再使用圆孔耳机了,华为要用type-c的耳机,苹果用lightning口耳机。这不就是坑了我这个代工厂了,我这生产的大批耳机还没用呢,就要被淘汰了!这时候,为了不至于亏损,至少要先把这批耳机卖掉之后再说,可是新款手机都不支持圆孔耳机,这怎么办呢?那就需要我们强大的适配器了!通过适配器
2020-05-28 19:46:18
243
原创 设计模式之单例模式
应用场景回归到之前我还是只有一家小工厂的电脑城老板的时候,顾客想买电脑的时候,我就new了个电脑工厂给他生产电脑,代码如下。在工厂模式的我们并不会在意,但是呢在单例模式的模式,我们就必须重视起来了!每次来一个顾客买电脑,我就创建了一个工厂来给他生产电脑,那我岂不是亏死了! // here comes a customer, want to buy huawei computer String customerHope = "huawei"; // i tel
2020-05-27 19:09:33
181
原创 设计模式之原型模式(Prototype)
简介原型模式是在平时很少会去关注的设计模式,用到的机会也不多,但是呢,我们经常能看到原型模式,那就是接口Cloneable(Java),其原理就是通过拷贝一个现有对象来创建一个和当前对象完全一样的对象。问题老规矩,我们还是通过问题来引入场景。之前,我通过建造者模式组装了一台我喜欢的电脑,这时候,我的朋友听说了,而且觉得我组装的配置很适合他,希望让我给他用同样的配置组装一台电脑,当然一种方式是我继续用建造者模式给他组装一台电脑,当然了,还有另一种方式就是使用原型模式,直接clone一台一模一样的电脑给他
2020-05-25 11:54:59
271
原创 设计模式之工厂方法与抽象工厂
简单工厂问题我是一个电脑城老板,并且有一家小工厂,主要用来制造华为电脑和苹果电脑,也就是销售这两款电脑。顾客来购买电脑,我该如何实现呢?解决代码public class ComputerFactory { private static final String HUAWEI_TYPE = "huawei"; private static final String APPLE_TYPE = "apple"; public Computer produceComputer(
2020-05-22 11:04:18
145
原创 设计模式之建造者模式
简介建造者模式在Java中是一个非常常见的设计模式,我们可以在经常看到,比如StringBuilder,HttpRequestBuilder等等。建造者模式是为了解决构造非常复杂的对象而产生的设计模式。它的作用呢是可分步创建复杂对象,并且使用相同的创建代码生成不同的对象,当然了它也保证了创建和使用分离。实现首先,举个例子,我现在想要组装一台电脑,电脑有很多部件,应该要怎么实现呢?当然啦,第一反应肯定是创建一个Computer对象,然后把部件填在里面,再new出来就好了。Computer类如下,那么我可
2020-05-21 16:09:39
142
原创 Java 8 Optional的使用
简介Optional是Java引入的类,用来解决空指针问题。并可以增加代码的整洁性。先看看源码介绍:A container object which may or may not contain a non-null value. If a value is present, isPresent() returns true and get() returns the value.Additional methods that depend on the presence or absence of
2020-05-11 11:32:22
209
原创 Spring boot 拦截器和过滤器
今天看到项目中有拦截器和过滤器,就比较好奇这两者的区别。先上图,最直观的感受是Filter是在servlet的外层,而Interceptor是在Servlet的内层,当然没有这么简单。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6UjjyAhD-1585035642513)(/Users/yuhan/Documents/技术文档/pic/Spring拦截器与过...
2020-03-24 15:53:21
450
原创 eureka自我保护机制
在eureka项目中看到一个配置:renewal-percent-threshold。并不是很理解,就此学习一下eureka的自我保护机制。renewal-percent-threshold从这个配置说起,从字面角度来说就是心跳的百分比临界值。我们都知道所有的服务都需要去向eureka服务器进行注册,并且维持心跳。这个字段大概率和这个心跳的频率有关。先来看下eureka的自我保护机制:一种针...
2020-03-24 11:34:00
1404
原创 swagger初探
最近换了新团队,之前都是使用rap作为接口管理工具,个人感觉还是挺好用的。新团队是全部spring cloud的架构,准备开始学习使用swagger作为管理平台。swaggerHub看起来也是融合了多种工具,包括swagger editor, swagger ui, swagger codegen。本来是想用swagger editor(与rap功能类似)用来编辑接口文档的,奈何网络环境问题,无法...
2020-03-24 09:49:17
98
原创 解决算法问题的小心得
数组,栈,队列首先思考暴力法该如何解决问题,大概率情况下暴力法的时间复杂度为O(N^2 or 3)。其次思考其复杂的原因,比如每次都在循环数组等,可能有的优化方案如:提前计算好当前元素左右两边需要的元素,或者使用双指针去做排除。使用栈,根据特定条件进行入栈,出栈操作,动态计算所需要的结果链表解决链表的通用方法有递归和迭代,迭代的思路更接近与暴力法,通过指针转换计算,相对来说比较容易思...
2020-02-25 16:09:04
140
原创 排序算法:冒泡排序,快速排序
排序算法冒泡排序思想:把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置!每一个循环将较大数置于右侧。时间复杂度就是O(nlogn)。优化点:每次循环后可剔除右侧一个元素就行比较若一个循环下来,没有任何元素交换,说明数组有序,可直接退出若循环在某个index之后,就没有进行数据交换,说明该index后的数组有序,不进入循环。鸡尾酒排序对冒泡排序的升级,冒泡排序始...
2020-02-18 14:21:16
178
原创 计算机网络(七):局域网
ARP协议MAC地址用于局域网内标识一个帧从哪个接口发出,到达哪个物理相连的其他接口。MAC地址为48bit,用于大部分LANs(局域网,Local area network),固化在网卡的ROM中,有时也可以软件设置。局域网中的每块网卡都有唯一一个MAC地址,MAC地址有IEEE统一管理和分配,网卡生产商购买MAC地址空间(前24bit)。类比一下,MAC地址像身份证号,IP地址像邮政地址。...
2020-02-16 23:06:20
1569
原创 计算机网络(六):数据链路层
简介数据链路层负责通过一条链路从一个节点向另一个物理链路直接相连的相邻节点传送数据报。链路层封装网络层数据报,叫做帧(frame)。链路层提供的服务:组帧(封装数据报构成数据帧,加首部和尾部,帧同步)链路接入(若是共享介质,需要解决信道介入)相邻接点间可靠交付(在低误码率的有线链路上很少采用,在无线链路上,误码率高,需要可靠交付)流量控制(协调相邻的发送结点和接收)差错检测(信号衰...
2020-02-15 23:28:08
265
原创 计算机网络(五):网络层(2)
简介前面学习了网络层转发相关,现在开始学习路由。路由算法就是确定去往目的网络的最佳路径。可以把网络抽象成图,每个路由器或主机可以看做节点,每段链路都有相应的费用Costs。路由算法就是找到源到目的的最小费用路径了!路由算法可以分为两种,静态路由和动态路由。静态路由,也就是手工配置,路由更新慢,优先级高。动态路则针对路由更新快的网络,可以定期更新,及时响应链路费用或网络拓扑的变化。动态路由又...
2020-02-15 16:49:17
465
原创 计算机网络(四):网络层(1)
一.简介从发送主机向接收主机发送数据段(segment)每个主机和路由器都运行网络层协议,路由器检验所有穿越它的IP数据报的头部域核心功能是路由和转发转发:将分组从路由器输入端口转移到合适的输出端口路由:确定分组从源到目的经过的路径二.网络层服务模型连接服务首先为系列分组的传输确定从源到目的经过的路径,然后沿着路径传输系列分组,系列分组传输路径相同,传输结束后拆除连接。虚电路网络...
2020-02-15 12:28:06
496
原创 计算机网络(二):应用层
一.网络应用体系结构clinet/server:常见的网络应用体系,例如手机上的应用或网站绝大多数都是采用client/server结构P2P没有永远在线的服务器任意端系统/节点之间可以通讯节点间歇性计入网络高度可伸缩,但难于管理混合结构:Napster应用采用了混合结构,文件传输使用P2P结构,文件的搜索采用C/S结构(每个节点向中央服务器登记自己的内容,节点向中央副武器...
2020-02-13 23:31:47
913
原创 计算机网络(三):传输层
一.目录传输层服务的基本理论与基本机制复用/分用技术可靠数据传输流量控制机制拥塞控制机制Internet传输层协议UDPTCPTCP拥塞控制二.概述传输层为运行在不同主机上的进程提供了逻辑通信机制发送方:将应用层提交的消息分成一个或多个segment,并向下传给网络层接收方:将接收到的segment组装成消息,并向上交给应用层三.UDP(User Datagra...
2020-02-10 15:12:44
338
原创 计算机网络(一):基础
计算机网络性能速率 bit/s带宽 数字信道所能传输的速率时延 / 延迟结点处理延迟(路由器)排队延迟(路由器)传输延迟传播延迟(物理链路长度,信号传播速度)时延带宽积 = 带宽 * 传播速度丢包率 = 丢包数 / 已发送分组数吞吐量/率计算机网络体系结构OSI参考模型应用层表示层会话层传输层网络层数据链路层物理层1.应用层提供用户使用网络服务F...
2020-02-06 17:00:41
220
原创 二叉树的深度和广度优先遍历
前中后序遍历指的是对根结点的前中后。三种算法都有两种解决方案:1.递归法2.迭代法前序遍历根结点——> 左节点——>右节点ABCDEFGHK /** * L144 二叉树的前序遍历 * * 迭代法 * * @param root * @return */ public List<In...
2020-01-21 16:36:29
239
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人