2022/2/14
Question-idea :项目一直build,build时间太长?
1、target文件太大,删除target文件,或者在idea的maven控件中clean一下。
2、file->project structure->modules,勾选上 Exclude output paths (排除输出路径,选中此复选框可以排除输出目录)。
3、(这个问题一般都是这个原因)file->Settings->Build,Execution,Deployment->Compiler
a)勾选Build project automatically
b)把build process heap size调大(2048M、4096M)
4、终极办法:
a)
b)
c)
d)
e)选择编译启动(你看下是用idea自带的maven compiler,还是项目中下载的maven compiler,哪个能成功启动就用哪个)。
Knowledge-idea : JSP热加载
1、
)
2022/2/15
Knowledge-MySQL :根据两个表对应的字段批量修改数据(用SQL语句实现)
1、 UPDATE `test` a JOIN ( SELECT 1 AS id, 11 AS code, 'holy' AS name UNION SELECT 2 AS id, 22 AS code, 'shit' AS name ) b USING(id, code)SET a.name=b.name;
2、 把id=1且code=11的name更新为’holy’,把id=2且code=22的name更新为’shit’。注意,条件字段必须放在USING中。
2022/2/16
Question-Spring :restTemplate请求接口,传入的参数变成空的
RestTemplate post请求主要通过三种方式实现。
1、 调用postForObject方法。
2、 使用postForEntity方法。
3、 调用exchange方法。
postForObject和postForEntity的主要区别在于,postForEntity方法可以设置header属性,当要设置header属性时使用postForEntity方法。exchange方法和postForEntity类似,但是更加灵活,它还可以调用get、put、delete请求。使用这三种方法调用post请求传递参数时,如果接口是以表单接收参数,参数map不可以定义为HashMap、LinkedHashMap这两种类型(除url使用占位符传递参数),应当使用MultiValueMap。因为HashMap是以请求体传递,MultiValueMap是以表单传递。
Knowledge-Java :在JSP页面传递并显示名称 – XXX&XXX
因为&在请求URL时是用来拼接参数的,所以在传递这种带有特殊符号的参数时,可以把它以UTF-8格式编码得到编码表对应的字符,在显示时以相同的编码格式解码回来,就可以正常展示了。
2022/2/17
Knowledge-Java :提高Java效率的35个小技巧
1、 尽量指定类、方法的final修饰符
2、 尽量重用对象
3、 尽可能使用局部变量
4、 及时关闭流
5、 尽量减少对变量的重复计算
6、 尽量采用懒加载策略,即需要时才加载创建
7、 慎用异常
8、 不要再循环中try…catch…,应该放再最外层
9、 底层数据结构为数组的集合、工具类最好指定初始长度
10、当复制大量数据时,使用System.arraycopy()方法
11、乘法和除法使用位运算符
12、循环内不要不断创建对象引用
13、能用数组尽量用数组,不能确定大小时使用arrayList
14、尽量使用非线程安全的类,如HashMap、ArrayList、StringBuilder,除非线程安全需要
15、不要将数组声明成为public static final
16、尽量再适合的场景使用单例模式
17、尽量避免使用静态变量
18、及时清除不需要的会话
19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历
20、使用同步代码块替代同步方法
21、将常量声明为static final,并以大写命名
22、不要创建一些不使用的对象,不要导入一些不使用的类
23、程序运行过程中避免使用反射
24、使用数据库连接池和线程池
25、使用带缓冲的输入输出流进行IO操作
26、顺序插入和随机访问的场景比较多时使用ArrayList,元素删除和中间插入比较多时使用LinkedList。
27、不要让public方法中有太多形参
28、字符串变量和字符串常量equals的时候将字符串常量写在前面
29、if (i == 1)和if (1 == i)在Java中没有区别,从习惯上建议使用前者
30、不要对数组使用toString()方法
31、不要对超出范围的基本数据类型做向下强制转型
32、公用的集合类中不使用的数据及时remove掉
33、把一个基本数据类型转为字符串,toString()最快,其次是String.valueOf()、数据+最慢
34、使用iterator循环遍历map是最有效率的
35、对资源的close建议分开操作
2022/2/18
Knowledge-Java :单例模式所有写法
1、 懒汉模式(线程不安全)
2、 Synchronized修饰的懒汉模式(线程安全)
3、 Double-check+synchronized的懒汉模式(通常线程安全,低概率不安全)
4、 Volatile+double-check+synchronized的懒汉模式(线程安全)
5、 饿汉模式(线程安全)
6、 静态内部类模式(线程安全)
7、 枚举类模式(线程安全,防止反射攻击)
8、 结合ThreadLocal实现单例模式(线程安全)
9、 使用CAS锁实现单例(线程安全)
2022/2/21
Knowledge-MySQL :BLOB类型的字段
数据以二进制的方式存储进数据库,具体的Java类型为byte[],代码为
stringVar.getBytes(“UTF-8”),取出来的代码为new String(byte[], “UTF-8”)。
在navicat中点击类型为BLOB的列,再点击文本,如果乱码的话,
SELECT CAST(columnName as char)直接查询。
2022/2/22
Knowledge-Java :ThreadLocal
1、 ThreadLocal是什么 :从字面意思来看的话是本地线程,其实它是本地线程变量,以
ThreadLocalVariable命名会更贴切一点。它根据它自己和当前线程提供了区分每个线程的变量副本,这个变量副本可以在当前线程生命周期内的所有地方使用。
2、 ThreadLocal与线程同步机制的比较 :在技术上我认为它们两个是不同的,是无法比较的,线程同步解决了多个线程访问同一资源的线程安全问题。而ThreadLocal是为每个线程提供了一个变量副本,所以无从谈起线程安全问题。在思想上它们是相反的关系,线程同步是以“时间换空间”的想法进行设计的,而ThreadLocal是典型的以“空间换时间”的做法。
3、 ThreadLocal的内存泄露 :什么是内存泄漏:有个变量它占了一块内存,但你找不到它了,但是又不能GC回收。当这样的东西越来越多,内存吃紧,最后宕机。博客里面讲了一个蛮有意思的小故事说:在抗日时期,有两名地下党A和B,A是上线,B是下线。B不能直接联系党中央,需要通过A来传话,当A发生意外暴露,被处决掉了。党中央就联系不到B了,不能给他分配任务,但B是存在的,只是联系不到他。这种情况就类似与内存泄漏。从代码上分析,在ThreadLocal变量调用set方法存储值时,方法里面首先通过本地方法获取当前线程对象,再通过线程对象获取它的属性threadLocals(这个属性的类型可以理解为一个map),再把this(也就是本变量threadLocal)作为key,存储的值作为value存储进这个threadLocals里面去。那么发生内存泄漏就是this被GC回收掉了,那么key为null,value还在,而且这个value也找不到了,也无法被清理回收。因为这个threadLocals的key是被WeakReference(弱引用:无论当前内存是否充足,都只能活到下次垃圾回收之前)修饰的,所以key只能活到下次垃圾回收之前。这里就产生两个问题,1、怎么解决?2、为啥要把key修饰成弱引用?1 :可以把ThreadLocal变量修饰成static的,让它随着类的加载而加载,随着类的结束而结束,就不会随时被GC回收了。2 :博客中说ThreadLocal有两个维度,线程和变量。不一定要从线程角度去理解ThreadLocal,我们可以从变量角度去理解它。在Java中,变量用完就应该被JVM回收,这是Java的特点和优势。ThreadLocal既然用完了就应该被JVM回收,但是它与value绑定在一起,而且只能通过threadLocal找到value,那么最后写这个源码的人,耍了个小聪明,用弱引用包装了threadLocal,没有直接回收,而是拖拖拉拉的回收,最后也实现了变量不使用就回收的基本原则,与Java思想一脉相承。这里有个问题就是回收的时机,如果ThreadLcoal作为局部变量,那么在方法出栈时,这个局部变量就要被回收,但此线程可能还没结束,所以就访问不到value了,有个解决办法就是及时的remove掉,也可以解决内存泄漏。如果ThreaLocal作为类的全局变量也就是属性,它的回收机制只能活到下次GC之前(-question-这里要搞情楚JVM垃圾回收的策略和机制,我不清楚它有没有可能刚赋值就被GC)。
2022/2/23
Knowledge – Java :map+Function替代if-else
public class QueryGrantTypeService{
@Autowired
private GrantTypeService grantTypeService;
private Map<String,Function<String,String>> grantTypeMap = new HashMap();
@PostConstruct
public void dispatcherInit(){
grantTypeMap.put(“红包”, resourceId->grantTypeService.redPaper(resourceId));
grantTypeMap.put(“购物券”, resourceId->grantTypeService.shopping(resourceId));
grantTypeMap.put(“qq会员”, resourceId->grantTypeService.QQVip(resourceId));
}
public String getResult(String resourceType,String resourceId) {
Function<String,String> result = grantTypeMap.get(resourceType);
If (result != null) {
return result.apply(resourceId);
}
return “查询不到该优惠券的发放方式”;
}
}
2022/2/24
Wisdom :年轻时候的毛泽东,从来不焦虑
1、 日日行,不怕千万里;常常做,不怕千万事。
2、 在危险环境中表示绝望的人,在黑暗中看不见光明的人,只是懦夫与机会主义者。
3、 怎么样才能去努力学习和实践这样的思维方式,去努力改变自己面对困难时的心态,并最终改变自己未来的境遇。
a) 抱着直面问题的心态去寻求解决之道
b) 在对规律的把握中练就一套万能法则
i. 情况是逐渐了解的,需要继续不断的努力。认识世界,不是一件容易的事。
c) 在现实的摸爬滚打中不断精进
i. 树立了远大的志向。我们的任务就是过河,但是没有桥或没有船就不能过。不解决桥或船的问题,过河就是一句空话。
ii. 讲是讲,做是做,做起来并不容易。
iii. 世界上没有完全笔直的道路,要准备走曲折的路。
iv. 选择重要,还是努力重要?往往有这种情况,有利的情况和主动的恢复,产生于“再坚持一下”的努力之中。(根据规律把握住坚持一个事情的度)
4、 最后总结,日日行,不怕千万里;常常做,不怕千万事。
2022/2/25
Knowledge – Java :java.util.cucurrent.CountDownLatch
1、 JDK1.5引入的类,我的理解它的作用就是线程执行计数器,实现了等待启动的每个线程执行完毕,再执行主线程的功能。用法:在多线程情况下,实例化它(初始化线程数),并在线程的run方法中业务代码之后调用它的countDown()方法,实现线程数减1,最后调用await()方法等待每个线程执行完毕,然后继续执行主线程。
代码整洁之道
1、整洁的代码
a) 减少重复代码 :如果有两处相同的逻辑代码,尽量写到一个方法里面去
b) 提高表达力 :表达力包括命名、包括逻辑、包括整洁清晰度
c) 提早构建简单抽象 :抽象利于扩展
2、有意义的命名
a) 名副其实 :不要在编写代码中出现魔法值
b) 避免误导 :不要使用外形相似的命名
c) 做有意义的区分 :不要使用废话,例如variable一词就永远不应当出现在变量名中(这就是ThreadLocal为啥是ThreadLocal而不是ThreadLocalVariable)。Table一词永远不要出现在表名中。NameString、moneyAmount等等。
d) 命名表示意图 :不要有魔法值
e) 类名应该是名词,方法名应该是动词。
f) 别用双关语 :一般不用add,用insert。
g) 添加有意义的语境 :尽量把一个动作写成一个方法,简洁代码,结构清晰。
最后2月份总结:
1、 确定了今年的关键字:稳定、学习、改变
2、 工作上:完成了每日总结,good,继续加油,完成。
3、 学习上:代码整洁之道一书,17章,完成2章,难受,没完成。
4、 身材上:计划跑步50公里,完成27.58公里,没完成。