Java线程知识点整合
基础线程相关概念程序(program):是为完成特定任务,用某种语言编写的一组指令的集合(也就是我们写的代码)。
线程是由进程/另一个线程创建的,是进程的一个实体。一个进程可以拥有多个线程。
单线程
多线程
并发
并行
线程使用
创建线程的方式:
继承Thread接口
实现Runnable接口
使用Callable (用得很少)
继承Thread接口1234567891011121314151617class Cat extends Thread { int times = 0; public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("meow~" + (++times)); if (times == 10) { ...
【自用】Redis应用场景之缓存
缓存缓存穿透(cache penetration)
缓存穿透(大概率是遭到恶意攻击):查询一个不存在的数据,mysql查不到数据也就不会直接写入缓存,这就会导致每次请求都查数据库。有可能导致数据库压力过大宕机。
解决方案①:缓存空数据缓存空数据{key:1,value:null},查询返回的数据为空,仍把这个空结果进行缓存。
优点:简单方便缺点:如果有大量的getById请求不存在的数据,内存压力就会很大;另外还可能发生缓存和DB数据不一致的问题(redis缓存了空数据,但是后来DB真的更新上这个数据了,redis却还是null)。
解决方案②:布隆过滤器布隆过滤器的作用就是检索一个元素是否在一个集合当中,从而拦截不存在的数据。布隆过滤器先判断请求的值是否存在:不存在直接拦截返回,存在的话才走redis或DB。前提:缓存预热的时候,会先预热布隆过滤器。
底层实现:先取一个比较大的数组(bitmap aka 位图),里面存放二进制0或1。一开始都是0,每加入一个新key / 尝试查询一个key时,就进行3次hash运算,模于数组长度找到数据的下标,把那个单元改为1。如此就表示 ...
【自用】Redis基础学习笔记
RedisRedis是一个基于内存的key-value结构数据库。
基于内存存储,读写性能高
适合存储热点数据(热点商品、咨询、新闻)
对MySQL的补充
5种常用数据类型Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
string 字符串
hash 哈希 aka 散列
list 字符串列表(有序,可有重复元素,类似Java中的LinkedList)
set 字符串集合 (无序,无重复元素,类似于Java中的HashSet)
sorted set / zset 有序集合(集合中每个元素关联一个分数(score),根据分数升序排序,无重复元素,排行榜)
Redis常用命令字符串操作命令
SET key value
GET key
SETEX key seconds value (验证码)
SETNX key value (分布式锁)
哈希操作命令Redis hash 是一个 string 类型的 field 和 value 的映射表,hash特别适合用于存储对象。
HSET key field value
H ...
【自用】JavaWeb学习笔记
Maven是一款用于管理和构建Java项目的工具。
作用:
依赖管理:方便地管理项目的依赖资源(jar包),避免版本冲突问题
同一项目结构:提供标准、统一的项目结构
项目构建:标准跨平台(Linux、Windows、MacOS)的自动化项目的构建方式
配置步骤
Maven坐标
Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置。
使用坐标来定义项目或引入项目中需要的依赖。
生命周期为了对所有的maven项目构建过程进行抽象和统一。
maven中有3套相互独立的生命周期:
clean:清理工作
default:核心工作,如:编译、测试、打包、安装、部署等
site:生成报告、发布站点等
需要关注的阶段:
clean:移除上一次构建生成的文件
compile:编译项目源代码
test:使用合适的单元测试框架运行测试(junit)
package:将编译后的文件打包,如:jar、war等
install:安装项目到本地仓库
注意:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。
执行指定生命周期的两种方式:
在idea中,右侧的maven工具 ...
【自用】JavaSE学习笔记(三)
集合进阶集合体系结构
Collection(单列集合):添加的元素是有序、可重复、有索引是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
Map(双列集合):添加的元素是无序、不重复、无索引
Collection的遍历方式
迭代器遍历
增强for遍历
Lambda表达式遍历
迭代器遍历12345Iterator<String> it = list.iterator();while (it.hasNext()) { String str = it.next(); System.out.println(str);}
迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式。
细节注意点:
迭代器在遍历集合时不依赖索引。
如果当前位置没有元素,还要强行获取,报错NoSuchElementException。
迭代器遍历完毕,指针不会复位。
迭代器遍历时,不能用集合的方法进行增加或删除。
列表迭代器遍历增强for遍历增强for的底层就是迭代器,为了简化迭代器的代码书写的。JDK5之后出现,其内部原理就是一个iterator迭 ...
【自用】MySQL学习笔记
基础:MySQL概述、SQL、函数、约束、多表查询、事务进阶:存储引擎、索引、SQL优化、视图 / 存储过程 / 触发器、锁、InnoDB核心、MySQL管理运维:日志、主从复制、分库分表、读写分离
(指令中的[]表示可选部分。大小写都可以。)
相关概念
Database, DB(数据库)
存储数据的仓库,数据是有组织地进行存储的
Database Management System, DBMS(数据库管理系统)
操纵和管理数据库的大型软件
Structured Query Language(SQL)
操作关系型数据库的编程语言,定义了一套操作相关型数据库统一标准
启动、停止、连接(假设安装时注册到windows系统服务的服务名称为mysql80。)启动:终端输入
1net start mysql80
停止:终端输入
1net stop mysql80
客户端连接:
方式一:MySQL提供的客户端命令行工具:MySQL 8.0 Command Line Client。然后输入密码。
系统自带的命令行输入(需配置Path环境变量):1mysql ...
【自用】JavaSE学习笔记(二)
常用APIMath类工具类,提供数学计算的方法。里面的方法都是静态的。
常用方法:
abs 获取绝对值
absExact 获取绝对值
ceil 向上取整
floor 向下取整
round 四舍五入
max 获取最大值
min 获取最小值
pow 获取a的b次幂
sqrt 开平方根
cbrt 开立方根
random 获取 [0.0, 1.0) 之间的随机数
System类工具类,提供一些与系统相关的方法的。
时间原点:1970年1月1日,是C语言的生日(中国在东八区,有8h时差,所以是1970年1月1日 08:00:00)
1s = 1000ms
常用方法:
exit 停止虚拟机
currentTimeMillis 获取当前时间的毫秒值
arraycopy 拷贝数组
Runtime类表示当前虚拟机的运行环境。
常用方法:
getRuntime 当前系统的运行环境对象
exit 停止虚拟机
available 获得CPU的线程数
maxMemory JVM能从系统中获取总内存大小(单位byte)
totalMemory JVM已经从系统中获取总内存大小(单位byte)
f ...
【自用】JavaSE学习笔记(一)
jhat 内存分析工具
JDK > JRE > JVM
多行注释 /* /文档注释 /* */
字面量 aka 常量 aka 字面值常量
空类型 一个特殊的值 aka 空值 aka null
IDEA项目结构:project > module > package > class
在代码中,如果有小数参与计算,结果有可能不精确。(精确要用BigDecima包)
数据类型转换数字进行运算时,如果数据类型不一样,要转成一样的,才能运算。
隐式转换 aka 自动类型提升:取值范围小 => 大取值范围:byte < short < int < long < float < double隐式转换的两种提升规则:
取值范围小的和取值范围大的进行运算,小的会先提升为大的
byte short char 三种类型的数据在运算时,都会先直接提升为int
强制转换:取值范围大 => 小如果把一个取值范围大的数值赋值给取值范围小的变量,一定要这么做就要加 ...
针对体测的引体向上训练思路总结
注意:
体测的引体向上项目通常以“下巴过杠”的次数进行计分,我们不得不以“下巴过杠”为动作标准。在其他情景的训练中,我们不必追求“下巴过杠”;
本训练侧重于力量训练,而非肌肥大。
前期准备:一根单杠,一套弹力带(视自身情况选择),镁粉(液状镁粉优于粉状镁粉),小负重(10kg左右足矣)
训练心理建设:将注意力放在动作标准度和动作技术的运用上;长期的训练规划,合理的训练周期计划;不要纠结肌肉有无泵感,不要纠结背阔肌有无发力,不要刻意追求力竭;动作细节优化;饮食,放松,其他。
动作细节握距太宽 (×):超宽距虽然有行程短的优点,但是水平力臂很长,肩关节受伤的风险大。太窄 (×):行程长,不利于提速,体能消耗太大。折中 (√):1.5倍肩宽(60cm ~ 80cm)较合适,是比较稳妥的选择。
沉肩(即使暂时无法沉肩,也要有这个动作的趋势)并非使劲往下压!只有意识地将肩胛骨向下向后缩,保持肩膀向下向后缩的感觉,就可以了。
掰杠双手握住单杠,想象把它掰成两段。做引体时对肩膀最友好的角度是肩胛面,而非完全的冠状面,所以我们握杠时要有将杠掰成对握的感觉。
扣腕扣腕的优点很明显:
能缩短行程,提 ...
(待更)背包九讲复习
背包九讲
01背包问题
完全背包问题
多重背包问题
混合背包问题
二维费用的背包问题
分组背包问题
背包问题求方案数
求背包问题的方案
有依赖的背包问题
01背包问题1234567891011f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少。result = max{f[n][0~V]}f[i][j]:1. 不选第i个物品,f[i][j] = f[i - 1][j];2. 选第i个物品,f[i][j] = f[i - 1] [j - v[i]] + w[i];f[i][j] = max{1. 2.}f[0][0] = 0;
未优化版
1234567891011121314151617181920212223#include <iostream>using namespace std;const int N = 1010;int n, m;int f[N]; // f[i][j], j体积下前i个物品的最大价值 int v[N]; // 体积int w[N]; // 价值int main() { c ...