My Maven notes
# Maven 简介
# Maven 的需求
目前技术在开发中存在的问题
一个项目就是一个工程
如果项目非常庞大,就不适合继续使用 package 来划分模块。最好是每一个模块对应一 个工程,利于分工协作。
借助于 Maven 就可以将一个项目拆分成多个工程。
项目中的 jar 包必须手动 “复制”、“粘贴” 到 WEB-INF/lib 目录下
带来的问题是:同样的 jar 包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
借助 Maven , 可以将 jar 包仅仅保存在 “仓库” 中,有需要使用的工程 " 引用” 这个文件接口,并钚需要真的把 jar 包复制过来。
jar 包需要别人替我们准备好,或到官网下载
不同技术的官网提供 jar 包下载的形式是五花八门的。
有些技术的官网就是通过 Maven 或 SVN 等专门的工具来提供下载的。
如果是以不规范的方式下载的 jar 包,那么其中的内容很可能也是不规范的。
借助于 Maven 可以以一种规范的方式下载 jar 包。因为所有知名框架或第三方工具的 jar 包以及按照统 ...
Nodejs notes
# (一)Node.js 初识
# 1. Node.js 诞生史
Node.js 之父:Ryan Dahl(瑞安・达尔)
并非科班出身的开发者,在 2004 年在纽约的罗彻斯特大学数学系读博士。
2006 年退学,来到智利的 Valparaiso 小镇。
期间曾熬夜做了一些不切实际的研究,例如如何通过云进行通信。
偶然的机会,走上了编程之路,生活方式变为接项目,然后去客户的地方工作。
工作中遇到了主流服务器的瓶颈问题,尝试着自己去解决,费尽周折没有办法。
2008 年 Google 公司 Chrome V8 引擎横空出世,JavaScript 脚本语言的执行效率得到质的提升,他的想法与 Chrome V8 引擎碰撞出激烈的火花。
2009 年的 2 月,按新的想法他提交了项目的第一行代码,这个项目的名字最终被定名为 “node”。
2009 年 5 月,正式向外界宣布他做的这个项目。
2009 年底,Ryan Dahl 在柏林举行的 JSConf EU 会议上发表关于 Node.js 的演讲,之后 Node.js 逐渐流行于世。
Ryan Dahl 于 2010 年加入 Joyent ...
My ultimate data structure and algorithm guide
# 前言
此笔记是按照 b 站左程云左神讲的课做的笔记
https://www.bilibili.com/video/BV13g41157hK?spm_id_from=333.999.0.0&vd_source=7bb61b79eb5fd85a23a01aa0e93efca0
从初级班班内容到高级班,此笔记应该是对该视频最全的笔记,内涵题目代码讲解以及一些个人思想 (废话)
模板部分主要是为了参加比赛的同学方便截取
个人看法部分是一些我自己做的题
算法课以及刷题以及技巧为视频的初级中级以及高级版的内容 (按照顺序)
之后还会按照代码随想录出一篇个人刷题的记录以及刷题思想,敬请期待!
写笔记不易,求个点赞!
# 模板
# 二叉树
据不完全总结,二叉树的题大致可以分为两种,一种是通过前序、中序、后序、层序遍历来解决问题。
另一种为递归问题,需要从每个节点来获取信息,然后提取出题目中要求的信息
# 遍历模版
# 二叉树非递归遍历
# 中序
先找到最左节点,并逐步压栈
当最左为空时,弹出栈顶(此时为最左节点),并输出
找最左节点有没有右孩子,有则压栈(循环 1,2),没有进行下一 ...
Design Patterns
# 一、概述
设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。
拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。
# 二、创建型
# 1. 单例(Singleton)
# Intent
确保一个类只有一个实例,并提供该实例的全局访问点。
# Class Diagram
使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
# Implementation
# Ⅰ 懒汉式 - 线程不安全
以下实现中,私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源。
这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if (uniqueInstance == null) ,并且此时 uniqueInstance 为 null,那么会有多个线程执行 uniqueInstance = new Singleton(); 语句,这将导致实 ...
Design Patterns - Factory Method
# 工厂方法(Factory Method)
# Intent
定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。
# Class Diagram
在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
下图中,Factory 有一个 doSomething () 方法,这个方法需要用到一个产品对象,这个产品对象由 factoryMethod () 方法创建。该方法是抽象的,需要由子类去实现。
# Implementation
public abstract class Factory {
abstract public Product factoryMethod();
public void doSomething() {
Product product = factoryMethod();
// do something with the product
}
}
public class ConcreteFactory exte ...
Design Patterns - Command
# 命令(Command)
# Intent
将命令封装成对象中,具有以下作用:
使用命令来参数化其它对象
将命令放入队列中进行排队
将命令的操作记录到日志中
支持可撤销的操作
# Class Diagram
Command:命令
Receiver:命令接收者,也就是命令真正的执行者
Invoker:通过它来调用命令
Client:可以设置命令与命令的接收者
# Implementation
设计一个遥控器,可以控制电灯开关。
public interface Command {
void execute();
}
public class LightOnCommand implements Command {
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
li ...
Design Patterns - Momento
# 备忘录(Memento)
# Intent
在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。
# Class Diagram
Originator:原始对象
Caretaker:负责保存好备忘录
Memento:备忘录,存储原始对象的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。
# Implementation
以下实现了一个简单计算器程序,可以输入两个值,然后计算这两个值的和。备忘录模式允许将这两个值存储起来,然后在某个时刻用存储的状态进行恢复。
实现参考:Memento Pattern - Calculator Example - Java Sourcecode
/**
* Originator Interface
*/
public interface Calculator {
// Create Mement ...
Design Patterns - Template Method
# 模板方法(Template Method)
# Intent
定义算法框架,并将一些步骤的实现延迟到子类。
通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。
# Class Diagram
# Implementation
冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。
public abstract class CaffeineBeverage {
final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
void boilWater() {
System.out.println("boilWater");
}
...
Design Patterns - Builder
# 生成器(Builder)
# Intent
封装一个对象的构造过程,并允许按步骤构造。
# Class Diagram
# Implementation
以下是一个简易的 StringBuilder 实现,参考了 JDK 1.8 源码。
public class AbstractStringBuilder {
protected char[] value;
protected int count;
public AbstractStringBuilder(int capacity) {
count = 0;
value = new char[capacity];
}
public AbstractStringBuilder append(char c) {
ensureCapacityInternal(count + 1);
value[count++] = c;
return this;
}
...
Design Patterns - Null
# 空对象(Null)
# Intent
使用什么都不做
的空对象来代替 NULL。
一个方法返回 NULL,意味着方法的调用端需要去检查返回值是否是 NULL,这么做会导致非常多的冗余的检查代码。并且如果某一个调用端忘记了做这个检查返回值,而直接使用返回的对象,那么就有可能抛出空指针异常。
# Class Diagram
# Implementation
public abstract class AbstractOperation {
abstract void request();
}
public class RealOperation extends AbstractOperation {
@Override
void request() {
System.out.println("do something");
}
}
public class NullOperation extends AbstractOperation{
@Override ...