ACM模式下的Java输入构造
练习请移步这里:https://www.acmcoder.com/ojques.html?id=64568738ea2ce53399dcc626
读取整数数组需要先接受数组大小,再接受数组中每个元素的值 。
示例代码 :
12345678910111213141516171819202122232425262728293031323334public class Main{ public static void main(String args[]) { /** * 这里是输入 */ Scanner cin = new Scanner(System.in); /** * 读取整数数组 * 输入的第一个值是数组大小,后面的值是数组每个元素的值 */ int numLen = cin.nextInt(); int[] numArr = new int[numLen]; for (int i ...
Mybatis简介
MyBatis简介下载地址 : https://github.com/mybatis/mybatis-3
Mybatis特性
首先,这是一个持久层框架。支持定制化 SQL、存储过程以及高级映射等功能。
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数(比如某些数据的拼接)以及获取结果集(不需要再手动获解析结果集)
MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old JavaObjects,普通的Java对象)映射成数据库中的记录
MyBatis 是一个 半自动的ORM(Object Relation Mapping,指Java实体类对象和关系型数据库中的一条记录之间的关系)框架
MyBatis搭建首先创建maven工程,引入依赖
123456789101112131415161718192021<dependencies><!-- Mybatis核心 --> <dependency> <groupId>org.mybatis</groupI ...
miniSpring(2)-实现单例Bean
在版本一中,实现了简单的BeanFactory,这是一个接口,一个是获取bean,一个是注册bean。
BeanFactory利用SimpleBeanFactory实现,可以基于xml对Bean进行管理。
而由于BeanFactory在Spring中不提供给开发人员使用,又实现了ClassPathXmlApplicationContext,通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象 。
具体流程图 :
这里进行单例bean的构建。
构建单例bean为了和 Spring 框架内的方法名保持一致,我们把 BeanFactory 接口中定义的 registryBeanDefinition 方法修改为 registryBean,参数修改为 beanName 与 obj。其中,obj 为 Object 类,指代与 beanName 对应的 Bean 的信息。
1234567public interface BeanFactory { //删 //void registerBeanDefinition(BeanDefinition beanDefinit ...
Redis线程
首先要明确,redis单线程指的是redis对外提供键值存储服务的主要流程 :Redis的网络IO和键值对读写是由一个线程完成的。
但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
另外,Redis 6.0 之后的版本却抛弃了单线程模型这一设计,所以现在的redis不是单线程的。
接下来主要讨论Redis6.0之前为什么用单线程、为什么单线程还这么快(多路复用)。
为什么使用单线程?其实这个问题,就是在讨论多线程的缺点。
多线程的优点:可以增加系统吞吐率,或是可以增加系统扩展性。
但以上优点是基于良好的系统设计而言的,否则们刚开始增加线程数时,系统吞吐率会增加,但是,再进一步增加线程时,系统吞吐率就增长迟缓了。
因为如果系统中有某个资源被多线程同时访问时,为了保证共享资源的正确性,就会带来额外的开销。即多线程编程模式面临的共享资源的并发访问控制问题。
而同时,多线程技术能够帮助我们充分利用 CPU 的计算资源来并发的执行不同的任务,但CPU 并不是制约 Redis 性能表现的瓶颈所在,更多情况下是受到内存大小和网络I/O的限制
因此 ...
Redis简介与数据结构
Redis简介官网简介 : https://redis.io/docs/about/
Redis是一个开源在内存中进行数据存储的数据库,Redis 存储的是 KV 键值对数据。
被数百万开发人员用作数据库、缓存、流媒体引擎和消息代理。
Redis的数据结构包括 : strings, hashes, lists, sets, sorted sets with range queries(带范围查询的排列集合), bitmaps(位图), hyperloglogs(超日志), geospatial indexes(地理空间索引), and streams.
Redis支持 :replication(复制), Lua scripting(Lua脚本), LRU eviction(LRU驱逐), transactions(事务), and different levels of on-disk persistence(不同级别的持久化), and provides high availability via Redis Sentinel and automatic partitioning ...
MySQL锁
根据加锁的范围,MySQL锁可以分为 :
全局锁
表级锁
行锁
全局锁(FTWRL)全局锁就是对整个数据库实例加锁,使用 Flush tables with read lock (FTWRL)实现 ,作用是让整个库只读。
全局锁的使用场景 : 全库逻辑备份。
全局锁的缺点:加锁期间,业务停摆(只能读数据而不能更新数据)。
那为什么在备份的时候一定要加全局锁?
答 : 假设有一个网购网站,里面有人账户余额为100元,花60元买了一本书,还剩40元 。备份顺序是先备份余额表,再备份购买商品表。如果不加锁,备份结果可能就是该用户余额仍然为100元,商品却多了一本书。
不是有事务隔离可以保证可重复读吗?
答:InnoDB 存储引擎默认的事务隔离级别正是可重复读,因此可以采用这种方式来备份数据库。但是,如果备份数据库的工具是 mysqldump,是不支持事务的,在备份数据库时就要使用全局锁的方法。(这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。)
为什么不 set global readonly=true呢? 也是全局只读
答 : 在异常处 ...
miniSpring(1)-实现BeanFactory
实现BeanFactory首先,IOC是个容器,可以帮我们管理对象的整个声明周期。
要实现IOC(控制反转),其实就是要实现DI(注入依赖)
DI其实就是对spring管理的对象进行赋值
那么首先要能够管理,其次要能够赋值
想要获取IOC管理的对象,首先要获得IOC。
BeanFactory ,这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用。
ApplicationContext这是BeanFactory的子接口,,提供了更多高级特性。面向 Spring 的使用者,几乎所有场合都使用ApplicationContext 而不是底层的 BeanFactory。注意,ApplicationContext是BeanFactory的子接口,在接口中只有声明,没有实现。
而ClassPathXmlApplicationContext是ApplicationContext的实现类,通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象 。
因此我们要先实现BeanFactory和ClassPathXmlApplic ...
MySQL事务隔离
MySQL事务事务就是由单独单元的一个或多个sql语句组成,在这个单元中,每个sql语句都是相互依赖的。而整个单独单元是作为一个不可分割的整体存在(通俗的讲就是,事务就是一个整体,里面的内容要么都执行成功,要么都不成功。)
事务的四个特性(ACID)
原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况。
(通过undo log回滚日志来保证)
一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。
(通过其他三个特性共同保证)
隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
(通过MVCC保证)
持久性(Durability): ...
Spring:AOP简介
AOP概述AOP(Aspect Oriented Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程的一种补充和完善。
AOP使用的设计模式是代理模式。
AOP将公共逻辑(缓存,日志, 事务管理)封装成切面,与业务代码分离,可以减少系统的重复代码和减低耦合度。
切面就是指那些与业务无关,但是业务模块都需要调用的公共逻辑。
AOP实现方式(静态与动态)静态代理和动态代理
静态代理:其实就是代理类和原来的类都实现了一个公共的接口,在代理类调用了被代理类的方法,在调用之前加上一些代码逻辑达到增强的效果,静态代理的代理类在编译阶段就生成了,也称编译时增强。
缺点:代理对象要与目标对象实现同一个接口;一旦这个接口增加方法,目标对象和代理对象都需要维护。
动态代理:代理类在程序运行的时候创建,AOP框架不会去修改字节码,而是在内存之中生成一个代理对象,在运行期间对业务方法进行增强,不会生成新的类。
场景模拟假设现在有一个计算器接口Calculator,包含加减乘除的抽象方法
123456public interface Calculator { ...
代码随想录-单调栈
单调栈单调栈的使用场景:
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。主要用于解决滑动窗口问题。
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。
739.每日温度
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859/**本题要寻找的是 : 第一个比左边大的数字。所以在栈中,递增(指栈头到栈底递增),即栈顶最小这样出栈的时候,小的先出使用单调栈主要有三个判断条件。 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况 */class Solution { public int[] dailyTemperatures(int[] temperat ...