自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 第8章:方法

第49条 检查参数的有效性失败原子性:失败的方法调用,应该使对象保持在被调用之前的状态,具有这种属性的方法,被称为具有失败原子性//例如Stack的pop方法,加上了size==0检查,保证了失败原子性//如果不这样做,那么虽然之后也会抛出异常,但该Stack对象的size属性就会变为负数,导致在之后再调用该对象进行操作,仍然会抛出异常,无法正常工作public Object pop(...

2020-03-31 16:19:33 263

原创 19. 解释器模式+设计模式七大原则

19 解释器模式java与模式:979,design pattern:162

2020-03-25 23:00:40 165

原创 18. 备忘录模式

18 备忘录模式在不破坏封装的前提下(双重接口),捕获一个对象(Originator)的内部状态(state),并在该对象之外(Caretaker)保存该状态。这样以后就可将该对象恢复到原先保存的状态类图18.1 双重接口问题所谓双重接口,就是对某一个对象提供宽接口,而对另一个对象提供窄接口如果对象提供一些公开接口以提供其内部状态,会产生外部代码直接利用这些接口,修改此对象,双重...

2020-03-25 22:55:30 123

原创 17. 原型模式

17 原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象类图17.1 使用场景类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源。因为java中原型模式是在内存二进制流的拷贝,性能比new创建对象更高通过new产生一个对象需要非常繁琐的数据准备或访问权限(比如还得先去数据库查某个属性值,才能创建对象)一个对象需要提供给其他对象访问,而且各个调用者都可能...

2020-03-24 22:34:00 73

原创 16. 桥接模式

16 桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化强关联:在编译期就已经确定的,无法在运行时动态改变的关联,继承是强关联,聚合是弱关联类图16.1 使用场景...

2020-03-24 17:30:31 73

原创 15. Builder模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示使用建造者模式可以将一类产品的构建过程和细节进行封装(实现代码的复用)与产品的表示进行分离,即:使用同样的构建过程可以创建不同的产品;在各个建造者类,只需定义生产零件方法,具体的生产顺序定义在导演类中;...

2020-03-23 22:23:30 92

原创 14. 责任链模式

14 责任链模式多个对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理该请求。发送这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任类图14.1 代码Handlerpackage chainofresponse.pattern;public abstrac...

2020-03-23 21:54:34 95

原创 13. 访问者模式

表示一个作用于某对象结构(ObjectStructure)中的各元素(NodeA、NodeB)的操作(visitor最后会对所有元素都进行操作)。它使你可以在不改变各元素的类的前提下,定义作用于这些元素的新操作(新增Visitor实现类即可)封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变封装一些作用于某种数据结构的各元素的操作,它可以...

2020-03-22 22:41:30 102

原创 12. 享元模式

享元模式以共享的方式高效地支持大量的细粒度对象享元,就是共享元数据,允许对小对象进行重复利用,防止新建出来好多重复的小对象类似于对内蕴状态相同的对象,只创建一次实例的"单例"String类型就使用了享元模式,如果一个系统有两个String对象包含字符串相同,JVM实际上只创建一个String对象提供给两个引用,从而实现String对象的共享,String的intern方法会获取到指向常量池...

2020-03-22 17:34:09 88

原创 11. 代理模式

11.1 代理模式代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,其实就是将客户对主题(Subject)施加的方法调用拦截下来类图11.1.1 应用场景远程代理实现本地调用者与远程被调用者之间的正常交互屏蔽了网络细节虚拟代理:控制创建开销大的资源保护代理基于权限控制对资源的访问缺点:代理会造成设计中类的数目增加11.1.2 代理模式与装饰者...

2020-03-22 10:53:12 87

原创 10. 状态模式

10 状态模式状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类该模式与策略模式类图一模一样,但目的不同类图10.1 应用场景为很好的替换复杂的if…else语句10.2 对象内状态建模的通用技巧通过创建一个实例变量来持有状态值,并在方法内书写条件代码来处理不同状态,这种方式会产生大量if…else代码,造成维护复杂10.3 代码Statepac...

2020-03-22 09:37:43 93

原创 9. 迭代器与组合模式

9.1 迭代器提供一种方法顺序访问一个聚合(数组、集合)对象中的各个元素,而又不暴露其内部的表示就是将访问聚合的逻辑抽象成一个迭代器,而不需要聚合本身提供访问方法,简化聚合的接口和实现,让责任各得其所可以在不修改聚合本身情况下,就可以修改迭代方式(对指定元素添加过滤)可以在不修改迭代方式的情况下,修改使用的聚合类型(数组改为Collection)类图9.1.2 代码Me...

2020-03-21 22:55:16 100

原创 8. 模板方法模式

8 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤类图8.1 应用场景8.2 代码CaffeineBeveragepackage template.pattern;public abstract class CaffeineBeverage { //1.模板方法,定义为fina...

2020-03-21 22:05:11 75

原创 7. 适配器模式、外观模式、中介者模式

7.1 适配器模式将一个类的接口(Adaptee)转换成客户期望的另一个接口(Target)。适配器让原本接口不兼容的类可以合作无间类图7.1.1 应用场景要使用一个现有的类(WildTurkey)而其接口(Turkey)不符合你的需求(Duck)时,使用适配器(Adapter)代码WildTurkey turkey = new WildTurkey();//如下代码不允许...

2020-03-21 21:35:26 304

原创 6. 命令模式

6 命令模式将"请求"封装成对象(这样可以将命令的发起者(Invoker)与执行者(Receiver)解耦),从而使你可用不同的请求对客户进行参数化。可以对请求排队、记录请求日志、支持可撤销的操作6.1 应用场景将请求排队执行记录请求的日志支持可撤销的操作6.2 缺点会导致存在过多的具体命令类6.3 代码命令模式类图Commandpackage command.pa...

2020-03-19 23:17:47 87

原创 5. 单例模式

5 单例模式确保一个类只有一个实例,并提供一个全局访问点5.1 应用场景线程池、缓存、注册表等只能有一个实例的对象5.2 代码饿汉式package com.mashibing.dp.singleton;/** * 饿汉式 * 类加载到内存后,就实例化一个单例,JVM保证线程安全 * 简单实用,推荐使用! * 唯一缺点:不管用到与否,类装载时就完成实例化 * Class...

2020-03-19 22:50:34 111

原创 4. 工厂模式

4.1 简单工厂模式不能算是一种设计模式,只是将创建对象与客户端分离,其实就是effective java说的静态工厂方法4.1.1 应用场景将对象创建过程隐藏(封装)4.1.2 代码类图4.2 工厂模式定义一个用于创建对象的接口(MouseFactory),让其子类(HpMouseFactory)决定实例化哪个类(HpMouse),工厂方法让类把实例化推迟到子类4.2.1 ...

2020-03-19 22:46:05 87

原创 3. 装饰者模式

3 装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案3.1 应用场景为输入流动态增加将读取到内容转为小写的功能不修改"咖啡类"代码的前提下,扩展"咖啡类"功能,使其可以计算出加上配料之后的价格,新功能是通过在旧功能前面或后面做一些计算来添加的Beverage beverage= new Espresso();System.out.println...

2020-03-19 22:13:50 69

原创 2. 观察者模式

2 观察者模式观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象(主题)状态改变,它的所有依赖者(观察者)都会收到通知并自动更新主题+观察者=观察者模式类图2.1 应用场景WeatherData(主题的实现)修改其属性temperature、humidity、pressure值时,它的集合类型的属性observers中所有对象(所有注册该主题的观察者对象),都调用自身upd...

2020-03-19 21:39:47 86

原创 1. 策略模式

1 策略模式策略模式定义了算法族,分别封装起来,让他们之间可以相互替换(实现接口),此模式让算法的变化独立于使用算法的客户(组合+委托)1.1 应用场景Duck mallardDuck = new MallardDuck();//1. 需要思考,如何保证当前(客户端)代码不变前提下//2. performFly方法具体执行内容,可以任意变换mallardDuck.performFly(...

2020-03-19 14:42:15 97

原创 5. JVM调优

JVM调优第一步,了解JVM常用命令行参数区分概念内存泄露:memory leak,对象永远不被回收内存溢出:out of memory,内存彻底不够了package com.mashibing.jvm.c5_gc;//-XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -XX:+PrintVMOp...

2020-03-14 21:45:41 212

原创 4. JVM运行时数据区与JVM指令集

TestIPulsPlusRuntime Data AreaPC程序计数器,存放指令位置,虚拟机的运行,类似于这样的循环,while(not end){ 取PC中的位置,找到对应位置的指令; 执行该指令; PC++;}Heap所谓栈指的是下面两块JVM stacks:每个线程对应一个栈,装着一个个栈帧,每个方法对应一个栈针frame。java虚拟机管理的栈n...

2020-03-11 21:56:07 100

原创 3. JMM:Java的内存模型

硬件层面的数据一致性硬件层的并发优化基础知识cpu比内存块100被,比硬盘块100w需要特别块的时,需要放在上层:插图cpu读数据时,先加载到内存,然后尝试到告诉缓存,不行到L2找,如果有,从l2放到l1然后,由cpu去读,离cpu跃进,容量越小,速度越快从cpu访问个位置需要时间:插图当从main memeory读取数据,由于一个电脑有多个cpu,为了计算,m...

2020-03-08 22:05:04 186

原创 2. JVM基础

1 java从编码到执行2 从跨平台到跨语言jvm相当于虚构出来的一个计算机,有自己的字节码指令集,即自己的汇编语言,也有自己的内存管理方案:栈、堆、方法区jvm跟java语言无关,跟class有关,只要语言能编译成class,jvm就能执行jvm是一种规范,调优是针对这个规范的来具体实现常见的jvm实现HotSpot:Oracle公司Jrockit:已与HotSpot合并J...

2020-03-06 17:13:48 379

原创 1. GC与GC Tuning

1. GC的基础知识1.1 什么是垃圾没有任何引用指向的一个对象或者多个对象(循环引用)C语言申请内存:malloc freeC++: new deleteJava: new 自动回收编程简单,系统不容易出错,手动回收可能出现忘记回收(内存泄露)和多次回收(回收了有用的数据)1.2 定位垃圾引用计数:reference counting,对象上会存放引用它的变量数,当引...

2020-03-06 12:57:09 1058

原创 ThreadPoolExecutor源码解析

ThreadPoolExecutor源码解析1、常用变量的解释// 1. `ctl`,可以看做一个int类型的数字,高3位表示线程池状态,低29位表示worker数量private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));// 2. `COUNT_BITS`,`Integer.SIZE`为32,所以`CO...

2020-03-06 12:18:54 73

原创 6. Disruptor

1 Disruptor简介disruptor译为分裂者,表示像分裂一样快是单机性能最快的消息队列,内部使用CAS作为锁,只能将队列存放于内存,无法放到硬盘内2 Disruptor与其他Queue比较ConcurrentLinkedQueue:链表实现,遍历效率低JDK中没有ConcurrentArrayQueue,因为插入效率太低了Disruptor是数组实现的队列:无锁,高并发...

2020-03-06 12:18:16 227

原创 5. JMH

1 JMH Java准测试工具套件测某一个方法好还是不好2 官网http://openjdk.java.net/projects/code-tools/jmh/3 创建JMH测试创建Maven项目,添加依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/P...

2020-03-06 12:17:39 185

原创 4. 线程池

1 线程池体系Executor[ɪɡˈzekjətə®]ExecutorServiceForkJoinPoolThreadPoolExecutor理解:new Thread时,相当于启动了一个线程,而这个线程实际上执行的任务就是Thread的run方法,所以我们可以理解为Thread是线程,而Thread、Runnable、Callable都是线程要执行的任务。线程池实际...

2020-03-04 20:35:47 128

原创 3. 练习

1 习题内容启动两个线程第一个线程打印ABCD…Z,第二个线程从1打印到26,两个线程交替打印A1B2C3…Z261.1 LockSupportimport java.util.concurrent.locks.LockSupport;public class LockSupportTest { static char[] charactor = "ABCDEF".toCharA...

2020-03-04 20:35:16 240

原创 2 容器

1 容器相关的知识数据结构算法高并发2 存储结构与逻辑结构连续存储的数组非连续存储的链表,一个引用指向下一个节点树是逻辑结构,而不是存储结构逻辑结构可以由不同的物理结构来实现,比如数组可以实现树的结构,链表也可以3 Vector与Hashtable的发展史最开始Collection中只有Set和List,为了保证线程安全,专门设计了Vector和Hashtable,V...

2020-03-02 16:54:23 133

原创 1 基本概念

1.1 数据结构存储数据的不同方式(Data Structure)1.2 算法同一个问题的不同解决办法数组增加元素链表增加元素数组查找元素链表查找元素一般针对特定数据结构,算法不同1.3 测算算法的优劣复杂度越低表示算法越好时间复杂度表示随问题规模的扩大,时间的变化程度O(n):表示规模扩大1倍,时间增加n倍–链表访问最后一个元素O(1):规模无论如...

2020-03-02 14:38:15 62

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除