Java 正则从入门到精通
Java 正则从入门到精通 关键词:Pattern、Matcher、捕获与非捕获、反向引用、零宽断言、贪婪与懒惰、元字符、DFA、NFA 正则简介正则表达式是什么正则表达式(Regular Expression)是一个用正则符号写出的公式,程序对这个公式进行语法分析,建立一个语法分析树,再根据这个分析树结合正则表达式的引擎生成执行程序(这个执行程序我们把它称作状态机,也叫状态自动机),用于字符匹配。 如何学习正则正则表达式是一个强大的文本匹配工具,但是它的规则很复杂,理解起来较为困难,容易让人望而生畏。 刚接触正则时,我看了一堆正则的语义说明,但是仍然不明所以。后来,我多接触一些正则的应用实例,渐渐有了感觉,再结合语义说明,终有领悟。我觉得正则表达式和武侠修练武功差不多,应该先练招式,再练心法。如果一开始就直接看正则的规则,保证你会懵逼。当你熟悉基本招式(正则基本使用案例)后,也该修炼修炼心法(正则语法)了。真正的高手不能只靠死记硬背那么几招把式。就像张三丰教张无忌太极拳一样,领悟心法,融会贯通,少侠你就可以无招胜有招,成为传说中的绝世高手。 以上闲话可归纳为一句:学习正则应该...
Java 控制语句
Java 控制语句 Java 控制语句大致可分为三大类: 选择语句 if, else-if, else switch 循环语句 while do…while for foreach 中断语句 break continue return 选择语句if 语句if 语句会判断括号中的条件是否成立,如果成立则执行 if 语句中的代码块,否则跳过代码块继续执行。 语法 123if(布尔表达式) { //如果布尔表达式为true将执行的语句} 示例 12345678910public class IfDemo { public static void main(String args[]) { int x = 10; if (x < 20) { System.out.print("这是 if 语句"); } }}// output:// 这是 if 语句 if…else 语句if 语句后...
深入理解 Java 泛型
深入理解 Java 泛型什么是泛型Java 泛型(generics)是 JDK 5 中引入的特性。 为什么要引入泛型机制呢? 回答这个问题前,先让我们来看一个示例。 123456789101112131415161718192021222324252627public class NoGenericsDemo { public static void main(String[] args) { List list = new ArrayList<>(); list.add("abc"); list.add(18); list.add(new double[] {1.0, 2.0}); Object obj1 = list.get(0); Object obj2 = list.get(1); Object obj3 = list.get(2); System.out.println("...
扩展 SQL
扩展 SQL数据库表查看表的基本信息12SELECT * FROM information_schema.tablesWHERE table_schema = 'test' AND table_name = 'user'; 查看表的列信息12SELECT * FROM information_schema.columnsWHERE table_schema = 'test' AND table_name = 'user'; 如何批量删除大量数据如果要根据时间范围批量删除大量数据,最简单的语句如下: 12delete from orderswhere timestamp < SUBDATE(CURDATE(),INTERVAL 3 month); 上面的语句,大概率执行会报错,提示删除失败,因为需要删除的数据量太大了,所以需要分批删除。 可以先通过一次查询,找到符合条件的历史订单中最大的那个订单 ID,然后在删除语句中把删除的条件转换成按主键删除。 1234567select max(id)...
Mysql 面试
Mysql 面试基础EXISTS 和 IN 有什么区别? EXISTS - 先对外表进行循环查询,再将查询结果放入 EXISTS 的子查询中进行条件比较,确定外层查询数据是否保留; IN - 先查询内表,将内表的查询结果作为条件,提供给外表查询语句进行比较; 索引是个前提,其实选择与否还是要看表的大小。你可以将选择的标准理解为小表驱动大表。在这种方式下效率是最高的。 比如下面这样: 12SELECT * FROM A WHERE cc IN (SELECT cc FROM B)SELECT * FROM A WHERE EXISTS (SELECT cc FROM B WHERE B.cc=A.cc) 当 A 小于 B 时,用 EXISTS。因为 EXISTS 的实现,相当于外表循环,实现的逻辑类似于: 123for i in A for j in B if j.cc == i.cc then ... 当 B 小于 A 时用 IN,因为实现的逻辑类似于: 123for i in B for j in A if j.cc == i.cc...
Mysql 锁
Mysql 锁 不同存储引擎对于锁的支持粒度是不同的,由于 InnoDB 是 Mysql 的默认存储引擎,所以本文以 InnoDB 对于锁的支持进行阐述。 锁的分类为了解决并发一致性问题,Mysql 支持了很多种锁来实现不同程度的隔离性,以保证数据的安全性。 独享锁和共享锁InnoDB 实现标准行级锁定,根据是否独享资源,可以把锁分为两类: 独享锁(Exclusive),简写为 X 锁,又称为“写锁”、“排它锁”。 独享锁锁定的数据只允许进行锁定操作的事务使用,其他事务无法对已锁定的数据进行查询或修改。 使用方式:SELECT ... FOR UPDATE; 共享锁(Shared),简写为 S 锁,又称为“读锁”。 共享锁锁定的资源可以被其他用户读取,但不能修改。在进行 SELECT 的时候,会将对象进行共享锁锁定,当数据读取完毕之后,就会释放共享锁,这样就可以保证数据在读取时不被修改。 使用方式:SELECT ... LOCK IN SHARE MODE; 为什么要引入读写锁机制? 实际上,读写锁是一种通用的锁机制,并非 Mysql 的专利。在很多软件领域,...
Spring 依赖查找
Spring 依赖查找依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准 API 实现。 IoC 依赖查找大致可以分为以下几类: 根据 Bean 名称查找 根据 Bean 类型查找 根据 Bean 名称 + 类型查找 根据 Java 注解查找 此外,根据查找的 Bean 对象是单一或集合对象,是否需要延迟查找等特定常见,有相应不同的 API。 单一类型依赖查找单一类型依赖查找接口- BeanFactory 根据 Bean 名称查找 getBean(String) Spring 2.5 覆盖默认参数:getBean(String,Object...) 根据 Bean 类型查找 Bean 实时查找 Spring 3.0 getBean(Class) Spring 4.1 覆盖默认参数:getBean(Class,Object...) Spring 5.1 Bean 延迟查找 getBeanProvider(Class) getBeanProvider(ResolvableType) 根据 Bean 名称 + 类型查找:getBean(String,Cla...
Spring 依赖注入
Spring 依赖注入DI,是 Dependency Injection 的缩写,即依赖注入。依赖注入是 IoC 的最常见形式。依赖注入是手动或自动绑定的方式,无需依赖特定的容器或 API。 依赖注入 (Dependency Injection,简称 DI) 是一个过程,其中对象仅通过构造函数参数、工厂方法的参数或对象实例在构造或从工厂方法返回。然后容器在创建 bean 时注入这些依赖项。这个过程基本上是 bean 本身的逆过程(因此得名,控制反转),它通过使用类的直接构造或服务定位器模式自行控制其依赖项的实例化或位置。 使用 DI,代码更干净,当对象具有依赖关系时,解耦更有效。对象不查找其依赖项,也不知道依赖项的位置或类别。结果,您的类变得更容易测试,特别是当依赖关系在接口或抽象基类上时,它们允许在单元测试中使用存根或模拟实现。 容器全权负责组件的装配,它会把符合依赖关系的对象通过 JavaBean 属性或者构造函数传递给需要的对象。 DI 是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是...
SpringBoot 基本原理
SpringBoot 基本原理SpringBoot 为我们做的自动配置,确实方便快捷,但一直搞不明白它的内部启动原理,这次就来一步步解开 SpringBoot 的神秘面纱,让它不再神秘。 123456@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 从上面代码可以看出,Annotation 定义(@SpringBootApplication)和类定义(SpringApplication.run) 最为耀眼,所以要揭开 SpringBoot 的神秘面纱,我们要从这两位开始就可以了。 SpringBootApplication 背后的秘密123456789101112@Target(ElementType.TYPE) // 注解的适用范围,其中TYPE用于描述类、...
SpringBoot 知识清单
SpringBoot 知识图谱 预警:本文非常长,建议先 mark 后看,也许是最后一次写这么长的文章 说明:前面有 4 个小节关于 Spring 的基础知识,分别是:IOC 容器、JavaConfig、事件监听、SpringFactoriesLoader 详解,它们占据了本文的大部分内容,虽然它们之间可能没有太多的联系,但这些知识对于理解 Spring Boot 的核心原理至关重要,如果你对 Spring 框架烂熟于心,完全可以跳过这 4 个小节。正是因为这个系列的文章是由这些看似不相关的知识点组成,因此取名知识清单。 在过去两三年的 Spring 生态圈,最让人兴奋的莫过于 Spring Boot 框架。或许从命名上就能看出这个框架的设计初衷:快速的启动 Spring 应用。因而 Spring Boot 应用本质上就是一个基于 Spring 框架的应用,它是 Spring 对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于 Spring 生态圈的应用。 那 Spring Boot 有何魔法?自动配置、起步依赖、Actuator、命令行界面(CL...