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)等待是否中断
...
JavaSE面试题总结
== 和 equals 的区别1、== 解读
对于基本类型和引用类型 == 的作用效果是不同的,如下所示:
基本类型:比较的是 值是否相同;引用类型:比较的是 引用是否相同;
12345678// 代码示例:String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true
代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写 开辟了内存空间,所以 == 结果为 false,而 equals ...
Spring常见面试题总结
1、Spring是什么?  Spring是一个轻量级的IOC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置
主要由以下几个模块组成:
Spring Core:核心类库,提供IOC服务;
Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);Spring AOP:AOP服务;
Spring DAO:对JDBC的抽象,简化了数据访问异常的处理;
Spring ORM:对现有的ORM框架的支持;
Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传;
Spring MVC:提供面向Web应用的Model-View-Controller实现。
2、Spring 的优点?(1)Spring属于低侵入式设计,代码的污染极低;
(2)Spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
(3)Spring提供了AOP技术,支持 ...
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; ...
Hexo博客搭建到部署教程
环境配置在正式安装 Hexo 之前,我们需要确认电脑中是否已安装下列应用程序:
GitHub 账号
Node.js
详情安装教程 查看Node版本:node -v
Git
详情安装教程 查看git版本:$ git version
打开git的.ssh目录(我的是C:\Users\Administrator.ssh),然后右键git bash如下图:
执行如下命令: 1234git config --global user.name "你的用户名" git config --global user.email 你的邮箱 ssh-keygen -t rsa -C "你的邮箱" // 记住三下回车,提示y/n就输入y
添加SSH key到github或者gitee: 复制密钥文件内容(路径形如C:\Users\Administrator.ssh\id_rsa.pub),粘贴到New SSH Key即可
测试是否添加成功。在命令行(即Git Bash)依次输入以下命令,返回“You’ve successfully au ...



