CompetableFuture详解
CompetabelFuture详解1. CompetableFuture的来由 CompetableFuture是在JDK8引入的,在这之前,我们进行JAVA多线程编程,一般都是使用Thread+Runnable来实现的,但是此方式没有返回值,如果要有返回值,我们可以通过Callable + Thread来实现, 这里我们使用FutureTask这个接口来实现此需求(FutureTask接口间接实现了Runnable接口及Future接口,因此:它有 Runnable 特性,所以可以用在 ExecutorService 中配合线程池使用,同时也有有 Future 特性,所以可以从中获取到执行结果)
12345678910public static void main(String []args){ FutureTask<String> task = new FutureTask((Callable<String>) () -> { Thread.sleep(3000); return &quo ...
浅谈v-if及v-show
浅谈v-if及v-show 在我们需要对前端的某个组件加显隐控制时,这时我们就会马上想到v-if以及v-show,二者都能实现上面的需求,但它们的实现逻辑还是有很大的差别的;
v-show的实现本质:切换元素的CSS的display属性,若要隐藏则将display属性设为’none’;
注:display:none的本质====》将元素的height以及width都设置为0.
v-if的实现本质:动态的向DOM树内添加或者删除DOM元素
因此,若在没有特殊需求,且需要频繁切换显隐状态的情况下, 最好使用v-show来控制显隐。
基于上诉的原理,当我们需要对某个Dom进行销毁再重建时,就可以通过v-if来实现了!!
Java的final修饰符作用记录
final修饰符一、修饰类 被final修饰的类不能再被集成,JAVA中的数据类型包装类(如String, Integer…)等等,都是被final修饰符修饰的,因此都是不可被继承的。
二、修饰成员变量 被final修饰符修饰的成员变量,在定义时必须赋初值,并且只能赋值一次。
三、修饰方法 被final修饰的方法,在子类中不能被重写。
四、修饰形式参数 被final修饰的形式参数被实际参数赋值时,就不能再被赋值。
1234567public void test(final User user){ //没问题,这种情况就是下面会提到的final修饰引用参数 user.setName('Jane'); //编译不通过 user = new User();}
五、修饰引用 被final修饰的引用,不能指向其他对象,但是它指向的对象内容可变。
12345678final List<String> strList = new ArrayList<>();s ...
使用广度优先搜索快速构造树形结构数据
使用广度优先搜索快速构造树形结构数据参考博客:https://blog.csdn.net/Pluto_09/article/details/126051924
这里就只记录了使用广度优先搜索构造树形结构数据这一块的代码;
入参:
1、List allList =>(所有的节点的集合)
2、List rootList =>(根节点集合)
注:此处的Node经过了特定的转化,新增了List chilerenList字段(存储子节点),可以将其视为一个我们通过实体类构造出的Vo类。
123456789101112131415161718192021222324public List<Node> tree(List<Node> allList, List<Node> rootList){ //遍历所有节点,整理出Map<Integer, List<Node>>的结构<节点编号,子节点集合> Map<Integer, List<Node>> map = new Ha ...
使用antdesign的a-table实现虚拟滚动提高前端的响应速度
使用antdesign的a-table实现虚拟滚动提高前端的响应速度 最近在工作中遇到的一个问题,一个表格因为需要动态生成表头,导致了表头的长度过长,且这个表格又不能对其进行分页操作,所以导致表格在前端的响应速度达到了6s+(后端接口的响应速度没有问题);
显而易见,这是由于表格的数据量过大导致的前端渲染速度极慢的现象。在无法对其进行分页处理的情况下,我能想到的就是实现虚拟滚动来提高前端的渲染速度。这里我觉得虚拟滚动应该也分为纵向与横向的虚拟滚动,但是在本文中只涉及纵向的,对于横向的虚拟滚动我还没什么思路。
本文实现的虚拟滚动还额外实现了表格单元格动态合并这一特性;
1、虚拟滚动 所谓的虚拟滚动其实就是按需渲染,也就是只渲染某一时刻用户看的到的内容,当用户滚动页面时,再通过JS的计算重现调整视窗内的内容,这样可以把列表子项的数量级别从几万降到几十。
虚拟滚动的实现可以分成三步:
1、确定当前滚动到哪了,我们可以通过通过元素的scrollTop属性获取到这个信息,scrollTop属性的值的意义为距离顶部滚 ...
SQL优化
SQL优化SQL执行效率的主要影响因素
数据量
SQL 执行后返回给客户端的数据量的大小;
数据量越大需要扫描的 I/O 次数越多,数据库服务器的 IO 更容易成为瓶颈。
取数据的方式
数据在缓存中还是在磁盘上;
是否能够通过全局索引快速寻址;
是否结合谓词条件命中全局索引加速扫描。
数据加工的方式
排序、子查询、聚合、关联等,一般需要先把数据取到临时表中,再对数据进行加工;
对于数据量比较多的计算,会消耗大量计算节点的 CPU 资源,让数据加工变得更加缓慢;
是否选择了合适的 join 方式
SQL优化思路
减少数据扫描
加入一些能提前过滤数据的条件,减少数据的扫描量;
在扫描大表时,要能命中索引,减少回表的代价,避免全表扫描;
返回更少的数据(减少网络传输或磁盘访问)
减少交互次数
将数据存在IO更快的地方
某条查询涉及到大表,无法进一步优化,如果返回的数据量不大且变化频率不高但访问频率很高,此时应该考虑将返回的数据放在应用端的缓存当中或者 Redis 这样的缓存当中,以提高存取速度。
减少服务器 CPU 开销(减少 CPU 及内存开销) —-不是很懂 ...
Python基础知识学习
Python学习Python一些简单的编码规则:
Python是大小写敏感的语言
Python代码第一句必须顶到最左边
123print("hello, python") #正确 print("hello, python") #错误
多行语句的行首需要对齐,如
1234567print("hello, python")print("hello, python")print("hello, python")print("hello, python")
多行语句中间可以有空行
Python的常用的数据类型
整数
小数
字符串
列表(类似于数组)
元组(类似于数组,但是数据不能改变)
字典(键值对)
注:
12345678#Python的大部分的计算都与Java类似,如+,-, *, /, %等#但也有些并不相同#只需要得到商的除法5 // 2 #结果为2#次方10 ** 3 #结果为1000
type()函数可以用于查看每个数据对象的 ...
使用Python连接并操作数据库
使用Python的pymysql模块操作数据库安装12pip3 install PyMysql# 可使用 pip list 查看此环境安装了哪些第三方库 such as: pip list | grep PyMysql
导入模块1import pymysql
连接数据库使用connect函数创建连接对象,此连接对象提供关闭数据库、事务回滚等操作一般传参为:host(数据库所在ip地址), user(数据库用户名), password(数据库密码), port(默认为3306), database(想要连接的数据库名)
12345db = pymysql.connect(host='127.0.0.1', user='root', password='pwd', port=3306, database='database_name')
...
CSS杂记(持续更新)
CSS杂记(持续更新)displaydisplay:flex下面是测试的代码:
1234567891011121314151617181920212223242526272829303132<!DOCTYPE html><html><head><meta charset="utf-8"> <style> #main { width: 400px; height: 400px; border: 1px solid #c3c3c3;}#main div { width: 50px; height: 50px;}</style></head><body><h1>flex-direction 属性</h1><div id="main"> <div style="background-color:coral;">A</div> & ...
Vue3.0子组件与父组件间的通信
Vue3.0子组件与父组件间的通信
引言 Vue父组件与子组件之间的通信在日常开发中使用频率十分高,除非你在开发中没有将组件分离出来,这样的话就会导致页面代码的可读性及维护性大大降低,得不偿失。
这里记录下父组件与子组件之间通信的最常见的几种通信形式(不包含使用Vuex实现父组件与子组件的通信):
父组件传递信息给子组件
父组件调用子组件方法
子组件调用父组件方法
父组件传递信息给子组件子组件(UserCard)的接受信息的关键代码:
123456789101112export default defineComponent{ props:{ userName:String }, setup(props){ const data = reactive({ userName = props.userName }) return{} }}
父组件向子组件传递信息的关键代码:
1<user-card userName= ...