抽象类和接口的选择
抽象类、接口的含义和特性抽象类是子类的通用特性,包含了属性和行为;接口是定义行为,并不关心谁去实现。 抽象类是对类本质的抽象,表达的是 is a 的关系;接口是对行为的抽象,表达的是 like a 的关系。 抽象类、接口的相同点都可以被继承,但是不能被实例化。 抽象类、接口的不同点使用时语法不同,抽象类使用 extends,接口则使用 implements。 接口中只能定义常量,所以,不能表达对象状态,而抽象类可以。 接口中的方法必须是 public 类型的,而抽象类则没有限制。 类可以同时实现多个接口(间接解决了 Java 不支持多继承的难题),但是只能继承一个抽象类。 适用场景所有类都有的基础属性或者方法定义在抽象类中。 特定子类有的方法定义在接口中。
指定哈希与相对引用
指定hash通过指定提交记录哈希值的方式在 Git 中移动不太方便。 用 git log 来查查看提交记录的哈希值。哈希值在真实的 Git 世界中也会更长(基于 SHA-1,共 40 位)。可以仅输入fed2 而不是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8一长串字符。 通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。 使用 ^ 向上移动 1 个提交记录 使用 ~<num> 向上移动多个提交记录,如 ~3 相对引用操作符 ^把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。所以 master^ 相当于“master 的父节点”。master^^ 是 master 的第二个父节点 现在咱们切换到 master 的父节点 1git checkout master^ 1234git checkout C3git checkout HEAD^git checkout HEAD^git checkou...
指令集架构深入分析
雇主不是需要汇编语言程序员,而是需要有理解计算机体系结构的人来写出各高效的程序 指令的格式指令集设计的考虑因素?ISA设计考虑因素: 指令占用内存空间大小; 指令系统复杂程度,主要指指令执行所需要的译码数量和指令所执行任务的复杂性; 指令长度大小以及是否固定 指令系统中指令的总数目。 不同类型的寻址方法 字节存储的小端大端位序问题 ISA需要多少寄存器并如何组织这些寄存器 短指令的好处和缺点?指令一般越短越好,较短的指令占用较少的内存空间,并且提取指令速度更快。但采取短指令会限制指令的数量(受到能够编码的二进制数的位数限制),同样也会限制操作数的大小和数量。 为什么要按字节编址?存储器的组成会影响指令的格式。如果存储器为16或32位字,不按字节编址则很难访问到一个单一字符,因此有些16/32/64位机器也是按照字节编址。 什么是大端和小端?计算机存储多字节的方法,所有现代计算机都是按字节编址,大多数UNIX采用大端方式,个人计算机采用小端方式,大多数RISC架构采用大端方式。 注意:大端小端的方式只是字节顺序的颠倒,不是数字位的颠倒,在字节内部还是正常的顺...
操作系统CPU和内核思维导图总结
操作系统CPU和内核思维导图总结https://www.processon.com/view/link/60eef701e0b34d06fba955b4
操作系统(Linux)文件系统思维导图总结
操作系统(Linux)文件系统思维导图总结内容较多,浏览器建议使用大纲查看。 https://www.processon.com/view/link/60eef0c15653bb06f24a2406 https://www.processon.com/view/link/60a511767d9c0830244d41b3
操作系统内存管理思维导图总结
操作系统内存管理思维导图总结笔记在导图里面 https://www.processon.com/view/link/60a2668563768925076bb0cb 操作系统–虚拟内存管理
日志放在拦截器还是过滤器
Filter过滤器是 Web 应用程序组件,可以在请求到达 Servlet 之前对其进行访问,也可以在响应信息返回到客户端之前对其进行拦截。 Filter 的接口方法: init:Serverlet 容器创建过滤器实例的时候调用 doFilter:拦截到达的请求,检查和处理Header的body的数据 destory:销毁过滤器,doFilter 中所有的方法超时之后,web 容器才会调用销毁 链式调用: Interceptor拦截器是 AOP 的一种实现策略,用于在某个方法或宁段被访问前对它进行拦截,然后在其之前或之后加上某些操作。 Interceptor 的接口方法:preHandler、postHandler、afterCompletion HandlerInterceptor 的接口方法: preHandle:方法前置初始化操作,请求预处理,权限校验,返回Boolean postHandle:方法后置处理,Controller 调用之后,DispatcherServelet视图渲染之前处理 afterCompletion:请求处理完成,包括 DispatcherS...
最长回文子串
题目链接: 5. 最长回文子串 题解链接:5. 最长回文子串 - 力扣(LeetCode) 中心扩散法从每一个位置出发,向两边扩散即可。遇到不是回文的时候结束。举个例子,str=acdbbdaa 我们需要寻找从第一个 b(位置为 3)出发最长回文串为多少。怎么寻找? 首先往左寻找与当期位置相同的字符,直到遇到不相等为止。 然后往右寻找与当期位置相同的字符,直到遇到不相等为止。 最后左右双向扩散,直到左和右不相等。如下图所示: 每个位置向两边扩散都会出现一个窗口大小(cur_len)。如果 cur_len > length(用来表示最长回文串的长度)。则更新 length 的值。 因为我们最后要返回的是具体子串,而不是长度,因此,还需要记录一下 length 时的起始位置(start),即此时还要 start = left。 12345678910111213141516171819202122class Solution: def longestPalindrome(self, s: str) -> str: ...
持续集成和容器管理
DockerMaven插件微服务部署有两种方法: 手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。 通过Maven插件自动部署。 自动部署 是企业实际开发中经常使用的方法。 Maven插件自动部署步骤:修改宿主机的docker配置,让其可以远程访问 1vim /lib/systemd/system/docker.service 其中ExecStart=后添加配置-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 刷新配置,重启服务 123systemctl daemon-reloadsystemctl restart dockerdocker start registry 在工程pom.xml 增加配置 12345678910111213141516171819202122232425262728<build> <finalName>app</finalName> <plugins> ...
时间格式不能正常转换?
@DateTimeFormat 注解前台到后台的时间格式转换,对于GET 请求参数可以正常工作。对于 POST 请求会报反序列化错误 POST 请求会使用 JSON 反序列化,不会使用 @DateTimeFormat 注解。 POST 表单(body)实现时间格式转换的方法使用 @JsonFormat 注解但是这种代码侵入性强,可维护性差 实现自定义格式转换器 @JsonDeserialize可以支持多种时间格式的转换: 指定反序列化器 定义全局配置类避免冗余代码 指定转换器做Date类型的反序列化: 在对象中就不需要指定对应的注解了。