正则表达式深入学习
以下是学习B站老韩的正则表达式专题视频总结,传送门。相关代码仓库地址:https://github.com/CoderBleu/learn_regular。
快速入门初识12345678910111213141516171819202122public class Demo { public static void main(String[] args) { String content = "1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态网页能够“灵活”起来,急需一种软件技术来开发一种程序," + "这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了大量的人力、物力和财力。这个时候," + "Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小," + ...
review
basic面向对象和面向过程的区别面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们使用的就是面向对象了。
基本数据类型
String相关String 底层就是一个 char 类型的数组,比如“你好” 就是长度为2的数组 char[] chars = {'你','好'};
字符型常量和字符串常量的区别
形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
什么是字符串常量池?
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一 ...
Vue学习笔记
系统学习前端Vue框架,笔记记录于B站的why老师,具体视频链接,在此感谢老师的悉心授课。github笔记地址
初始化Vue初识Vue12345678910111213141516171819202122232425<script src="../js/vue.js"></script> <div id="hi">Hello {{name}}</div> <div class="movie"> <ul> <li v-for="item in movies"> {{item}} </li> </ul> </div> <script> const hi = new Vue({ ...
Java开发常见知识点拾遗
时间时间处理重点是格式统一,老项目常见 Date + SimpleDateFormat,新项目优先 java.time。
123SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date start = sdf.parse(startTime);String text = sdf.format(new Date());
高频操作:
1、计算两个日期之间的天数
2、生成指定日期时间
3、取当前时间、前一天、前一月、前一年
4、在旧 Date 体系和 LocalDateTime 之间切换
常见模板:
12345678910long days = (date.getTime() - nowDate.getTime()) / (24 * 60 * 60 * 1000);LocalDateTime now = LocalDateTime.now();LocalDateTime yesterday = now.minusDays(1);LocalDateTime lastMont ...
HashMap学习
HashMap基本认识
HashMap 的底层数据结构
我们现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,而在 JDK 1.8 之前是由“数组+链表”组成。
为什么要改成“数组+链表+红黑树”
主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。
在什么时候用链表?什么时候用红黑树?
对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到9个(阈值8):如果此时数组长度大于等于 64,则会触发链表节点转红黑树节点(treeifyBin);而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容,因为此时的数据量还比较小。
为什么链表转红黑树的阈值是8?
对于 HashMap 也是同样的道理,简单来说,阈值为8是在时间和空间上权衡的结果
红黑树节点大小约为链表节点的2倍,在节点太少时,红黑树的查找性能优势并不明显,付出2倍空间的代价作者觉得不值得。
到8个节点时,红黑树的性能优势也会开始展现出来,因此8是一个较合理的数字。
那为什么转回 ...
锁
Synchronized和Lock的区别1.前言
早期的时候我们对线程的主要操作为:synchronized wati notify
然后后面出现了替代方案:lock await singal
2.synchronized 和 lock 有什么区别?用新的lock有什么好处?举例说明
1)synchronized属于JVM层面,属于java的关键字
monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象 只能在同步块或者方法中才能调用 wait/ notify等方法)
Lock是具体类(java.util.concurrent.locks.Lock)是api层面的锁
2)使用方法:
synchronized:不需要用户去手动释放锁,当synchronized代码执行后,系统会自动让线程释放对锁的占用
ReentrantLock:则需要用户去手动释放锁,若没有主动释放锁,就有可能出现死锁的现象,需要lock() 和 unlock() 配置try catch语句来完成
3)等待是否中断
...
Redis入门到进阶
redis基本认识1.Redis为什么是单线程
在Redis4.0之前,Redis是 单线程运行的。redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。对于Redis来说,主要的性能瓶颈是内存或者网络带宽,而并非CPU。
2.Redis为什么这么快
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路I/O复用模型,非阻塞IO;
5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
redis key值操作1、列 ...
数据库与MySQL基础整理
基础三类语句:
1、DDL:定义库、表、索引等结构
2、DML:插入、更新、删除数据
3、DQL:查询数据
高频查询先练熟:连接、分组、分页、日期统计。
1234SELECT sc.SId, AVG(sc.score) AS avgscoreFROM scGROUP BY sc.SIdHAVING AVG(sc.score) >= 60;
常用操作高频操作:
1、连接数据库
2、导入 SQL 文件
3、日期范围查询
4、表结构和字段类型
5、基础运维命令
常见问题:
1、mysql 命令找不到,通常是环境变量没有指到 bin。
2、通过 source 导入 SQL 文件时,路径分隔符写错。
3、建库、切库、建表这些操作会做,但对 DDL、DML、DQL 的边界没有清楚认知。
4、JDBC 导大字段时报 Packet for query is too large,通常是 max_allowed_packet 太小。
123create database school;use school;show tables;
Packet for query is too l ...
Java基础与核心语法整理
语法1、数据类型与类型转换
基础类型、包装类型、自动拆装箱、强制类型转换是高频内容。
2、流程控制与运算规则
自增、自减、三元表达式、取余与取模重点看求值顺序和边界值。
3、数组、集合和遍历方式
for、foreach、Map 查找都要会选。
12345List<Role> roles = roleService.find(null);Map<Integer, Role> roleMap = new HashMap<>();for (Role role : roles) { roleMap.put(role.getId(), role);}
对象对象创建、构造器、this、无参构造、有参构造要一起看。JavaBean、反射、序列化、ORM 映射都依赖这些基础。
常见坑:
1、类里什么构造器都不写,编译器会补无参构造
2、只写了有参构造,编译器不会再补无参构造
3、很多框架默认就是通过无参构造 + setter 反射创建对象
1234567public class User { private St ...
Lombok
Lombok到底是什么?先看一下它的官网英语懒得看?没关系。
它大致意思是:Lombok是一个很牛批的插件(本质是个Java库),项目里一旦引入了Lombok神器之后,你项目中所有诸如:对象的构造函数、 equals()方法,属性的 get()/set()方法等等,这些没有技术含量的代码统统都不用写了,Lombok帮你搞定一切,全部帮你自动生成!
听起来好像是挺不错…
眼见为虚,代码为实,本文亲自尝试一下!
项目中引入Lombok除此之外,还要在IDE中安装Lombok插件,并配置:接下来进行代码实验。
爽!get/set不用写了以前我们写一个 POJO对象时,比如定义一个课程 Course,需要自己手动写上每个字段的 get()和 set()方法,就像这样:
12345678910111213141516171819202122232425262728293031public class Course { private Long id; private String name; private Integer score; ...



