Java中的基本数据类型
基本类型
位数
字节
默认值
取值范围
boolean
1
false
true、false
byte
8
1
0
-128 ~ 127
char
16
2
‘u0000’
0 ~ 65535
short
16
2
0
-32768 ~ 32767
int
32
4
0
-2147483648 ~ 2147483647
long
64
8
0L
-9223372036854775808 ~ 9223372036854775807
float
32
4
0f
1.4E-45 ~ 3.4028235E38
double
64
8
0d
4.9E-324 ~ 1.7976931348623157E308
static、final、this、super关键字总结
final
final主要修饰变量、方法、类
修饰变量:被final修饰的变量不可变,一旦赋值后不可再改变
修饰方法:被final修饰的方法不可被子类重写
修饰类:被final修饰的类不可被继承
static
static主要修饰变量、方法、代码块、内部 ...
什么是Spring Cloud一个基于Spring Boot的一系列开源框架的集合,利用Spring Boot的开发便利性简化了分布式系统基础设施的开发,提供了在分布式系统中集成各种服务治理功能的工具
Spring Cloud的优缺点优点
耦合度比较低。不会影响其他模块的开发
减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发
配置比较简单,基本用注解就能实现,不用使用过多的配置文件
微服务跨平台的,可以用任何一种语言开发
每个微服务可以有自己的独立的数据库也有用公共的数据库
直接写后端的代码,不用关注前端怎么开发,直接写自己的后端代码即可,然后暴露接口,通过组件进行 服务通信。
缺点
部署麻烦
数据的管理比麻烦,因为微服务可以每个微服务使用一个数据库
系统集成测试比较麻烦
性能的监控比较麻烦
Spring Cloud由什么框架组成
Spring Cloud Eureka:服务注册与发现
Spring Cloud Zuul:服务网关
Spring Cloud Ribbon:客户端负载均衡
Spring Cloud Feign:声明性的Web服务客户端
Spr ...
技术博文
未读Spring IOC 和 AOP
Spring IOCInverse of Control 控制反转,将原本在程序中手动创建对象的控制权交给Spring框架的进行管理,由**IOC容器完成对象的依赖注入(DI)**,ICO容器实际上就是个key-value形式的map。使对象间的耦合降低,资源更易于管理。
Spring AOPAspect oriented programming 面向切面编程,基于动态代理,将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性
Spring Bean 的生命周期和作用域生命周期:实例化 -> 属性赋值 -> 初始化 -> 销毁
12341. 实例化:Spring 通过构造方法或工厂方法创建 Bean 实例。2. 属性赋值:Spring IOC容器将 Bean 的属性值注入到 Bean 实例中。3. 初始化:Spring 调用 Bean 的初始化方法,完成 Bean 的初始化工作。4. 销毁:当 Bean 不再需 ...
垃圾回收主要关注的是JVM内存中的堆和方法区部分,将内存中没有任何指针指向的对象进行回收,释放内存,避免内存溢出。
标记阶段
判断对象是否存活的算法一般有两种,引用计数算法和可达性分析算法
引用计数法:为每个对象保存一个引用计数器,对象被引用和引用失效时进行增减,归零时表示可以进行回收,但是无法处理循环引用的情况。
而Java中采用的是可达性分析算法:是以根对象集合(GCRoots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达,如果对象没有任何引用链,则不可达,为垃圾对象。
清除阶段
jvm的垃圾回收是根据不同年代的特点执行不同的垃圾回收算法,最基本的垃圾回收算法有三种,标记-清除算法、复制算法、标记-整理算法
标记-清除算法:从引用根节点开始遍历,标记被引用的可达对象,清除未标记的对象。缺点:效率不高,进行GC时需要停止整个程序,清理出的内存不连续,需要维护空闲列表。
复制算法:将内存空间分为两块,垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。缺点:需要的空 ...
技术博文
未读实现方式
继承Thread类
实现Runnable接口
实现Callable接口
使用线程池ThreadPoolExecutor
使用匿名内部类 new Thread或者lambda表达式
继承Thread类
创建一个继承于Thread类的子类
重写Thread类的run() –> 将此线程执行的操作声明在run()中
创建Thread类的子类的对象
通过此对象调用start()执行线程123456789101112class MyThread extends Thread { public void run() { System.out.println("Thread is running..."); }} public class Main { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start( ...
技术博文
未读什么是 MyBatis?MyBatis 是一个半自动化的 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
MyBatis 的执行原理
解析配置文件和映射文件,生成内部数据结构。
创建 SQLSession 实例,负责与数据库进行交互。
执行 SQL 语句并返回结果集。
将结果集映射到 Java 对象,并返回给调用者。
MyBatis 的优点
内置JDBC,简化了数据库操作的编写过程,提高了开发效率。
基于SQL编程,很灵活,SQL写在xml文件里,与程序解耦,便于管理
提供映射标签,对象和数据库字段的相互映射
MyBatis 的缺点
SQL的编写量很大的时候,对开发人员的SQL功底有要求
SQL依赖数据库,导致数据库移植性差
MyBatis和Hibernate的区别
mybatis是半自动化对象关系映射框架,查询关联对象或关联集合对象时,需要手动编写sql来完成Hibernate是全自动化对象关系映射框架,查询关联对象或者关联集合对象时,可以根据对象关系模型 ...
技术博文
未读Redis基本数据结构类型
String:SDS动态字符串结构,最大存储512M,常用于共享 session、分布式锁,计数器、限流
Hash:k-v结构,常用于缓存用户信息
List:list,常用于消息队列,文章列表
Set:set,常用于用户标签,生成随机数抽奖、社交需求(点赞)
Zset:已排序字符串集合,常用于:排行榜,社交需求(点赞)
特殊数据结构类型:1. Geospatial(地理位置) 2. Hyperloglog(基数统计算法) 3. Bitmap(以比特位为单位的数组)
Redis为什么这么快
基于内存实现
高效的数据结构
合理的数据编码:动态字符串、双端链表、压缩链表、字典、跳跃表
合理的线程模型:单线程模型和I/O 多路复用
虚拟内存机制
缓存击穿、缓存穿透、缓存雪崩缓存击穿原理:热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key 有大量的并发请求过来,从而大量的请求打到数据库解决方案
使用互斥锁:比如redis的setnx去set一个mutex key,当操作返回成功时(分布式锁),在查数据库,并回设缓存,最后删除mut ...
技术博文
未读常见优化SQL的方法
查询时使用具体字段,而不是select *,节省资源、减少网络开销
查询结果只有一条时,使用limit 1,找到了对应的一条记录,就不会继续向下扫描了
避免在where子句中使用or连接,可分为两条查询或使用union all,使用or可能会使索引失效,从而全表扫描
避免在where子句中使用表达式与逻辑判断,那很可能会导致索引失效,扫描全表
优化like语句,不要将 % 放在关键词前,会导致索引失效
使用连接查询时,优先使用Inner jion,使用left join的话,将较小的表放左边。Inner join在两张表进行连接查询时,只保留两张表中完全匹配的结果集
优化查询的时候,可以在where和order by上建立索引,避免全表扫描
插入的数据较多的话,可以考虑使用<foreach>标签进行批量插入
需要修改的数据量大的时候,分批进行操作
索引不宜太多,一般5个以内,索引在提高查询效率的同时也降低了增删的效率
索引不适合建立在有大量重复数据的字段上,如性别,也不适合在数据量少或者更新频繁的字段上加索引,S ...
工作原理
正向代理:为客户端提供代理客户端将请求发送给正向代理,然后由代理服务器将请求转发给目标服务器。服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端
反向代理:为服务器端提供代理客户端将请求发送给反向代理,然后由代理服务器根据一定的规则将请求转发给后端服务器。后端服务器将响应返回给代理服务器,再由代理服务器将响应转发给客户端
不同点
代理对象正向代理是为客户端提供代理服务,即服务器不知道真正的客户端是谁反向代理则是为服务器提供代理服务,即客户端不知道真正的服务器是谁
架设位置正向代理通常是由客户端架设的反向代理则是由服务器架设的
用途和目的正向代理的主要用途是为在防火墙内的局域网客户端提供访问Internet的途径,侧重于解决访问限制问题反向代理的主要用途是将防火墙后面的服务器提供给Internet用户访问,其目的在于实现负载均衡、安全防护等
使用场景正向代理
突破网络限制访问特定的网站与服务
网络安全,监控和管理网络访问行为,隐藏客户端真实IP,防止敏感数据泄露
内容过滤,学校、图书馆等公共场所可以通过正向代理过滤不良内容
提高访问速度,代理服务器设置硬盘 ...
本文示例使用学生和老师的对应关系举例
老师的角度:一个学科老师对应多个学生,一对多
学生的角度:多个学生对应一个学科老师,多对一
一对多实体类创建
因为是从老师的角度来看,一个老师对应多个学生,所以学生实体类正常创建 老师的实体类中增加 private List<Student> students;的对应关系
映射*Mapper.xml
老师的查询结果集<resultMap>中,增加<collection>标签设置学生对应属性
123456789<resultMap id="TeacherToStudent" type="Teacher"> <result property="id" column="tid"/> <!-- 老师的id --> <result property="name" column="tname"/> <!-- 老师的名字 ...