1:java操作文件
MultipartFile file
/File dest = new File(uploadFile+ “/”+fileName);
//判断文件父目录是否存在
if(!dest.getParentFile().exists()){
dest.getParentFile().mkdir();
}/
保存
file.transferTo(dest);
读取文件
Document document = null;
//读取上传到服务器的文件
document = reader.read(dest);
直接读取客户端上传过来的文件
document = reader.read(file.getInputStream());
2:java最重要的类 String字符串
- 字符串不可变 作为hashmap的键 线程安全
- 字符串常量池 String s1 = "aaa"和String s2 = “aa”;用==比较是返回true的,而new 出来的两个相同的字符串是不相等的,直接放堆里面了
- +和StringBuilder,都是字符串拼接,+的拼接也会转化为StringBuild,字符串拼接数少于4个的时候用+,多余4个用StringBuilder。
- concat()也是拼接
- intern()放缓存
- StringUtils字符串工具类 (是null安全的)
3:java中==
Integer q = 127;
Integer r = 127;
System.out.println(q == r); // true
q = 128;
r = 128;
System.out.println(q == r); // false
??因为Integer作为常量时,对于-128到127范围之间的数,Java会对其进行缓存,so使用如下做Integer类型得判断
System.out.println(q.intValue() == r.intValue());
System.out.println(q.compareTo(r) == 0);
4:关于异常
捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
5:java反射
- 用Java的反射功能, 可以很轻松的完成上面的要求:
- //第一步, 先把HelloWorld的类装载进来
- Class cls = Class.forName(“com.example.HelloWorld”);
- //第二步, 创建一个HelloWorld的实例, 注意, 这里并没有用强制转型把obj转成HelloWorld
- Object obj = cls.newInstance();
- //第三步, 得到这个类的方法, 注意, 一个类的方法也是对象啊
- Method m = cls.getDeclaredMethod(“sayHello”);
- //第四部, 方法调用, 输出"hello world"
- m.invoke(obj);
6:JAVA 对集合list的实体按某一字段(如日期)排序
因为Collections的sort方法默认是升序排列,要重新方法
//按照runTask里面的startTime降序进行排序
public void ListSort(List<RunTask> list) {
Collections.sort(list,new Comparator<RunTask>() {
@Override
public int compare(RunTask o1, RunTask o2) {
if(o1.getStartTime().getTime() > o2.getStartTime().getTime()){
return -1;
} else if(o1.getStartTime().getTime() < o2.getStartTime().getTime()){
return 1;
} else {
return 0;
}
}
});
}
7:Map知识点
实现map接口
-
HashMap(无序 线程安全)
new HashMap(3);//大于3的最小的2的n次方的数4 长度为4的map
new HashMap(16,0.75) //长度16 负载因子0.75 -
LinkedHashMap(有序 线程不安全)
-
TreeMap
-
ConcurrentHashMap (线程安全)
-
synchronizedMap(线程安全)
-
HashTable(线程安全 效率低 已废弃)
- ConcurrentHashMap线程安全的实现方式
jdk1.7 使用分段锁 jdk1.8 使用CAS(compare and swap) 比较交换算法
8:LRU(Least Recently Used) 最近最少使用
是一种页面置换算法,选择最近最久未使用的页面予以淘汰;只在缓存中存最新的数据 java中可以使用LinkedHashMap来实现:
- 本身实现按照访问顺序的存储
- 提供方法用于判断是否需要移除最不常读取的数
9:在单元测试中不要使用@Transactional注解
- 作用 @Transactional是spring的事务注解,事务的作用是产生错误信息时保证数据的一致性,一个事务是一个只包含所有读/写操作成功的集合(事务的本质:1:原子性 2:一致性 3:隔离性 4:耐久性)
- 问题 使用@Transactional注解时导致对实例数据的操作都在内存中完成,最终不会进行commit操作,也就不会对数据进行持久化操作,导致测试行为和真实行为不一致
- 详解 事务管理在应用开发中是种不可或缺的设计,它是数据库持久化处理的一种标准。我们知道,应用程序开发离不开对数据的CRUD(增删改查),事务的ACID性可以更好保证数据的完整性,保证相关数据的同生共死。单个事务生命周期主要分为三个阶段,BEGIN TRANSACTION -> COMMIT TRANSACTION -> ROLLBACK TRANSACTION。
10:java 小数 0.55转 百分比
float ss = 0.55;
DecimalFormat df = new DecimalFormat("0.00%");
百分比 = df.format(ss); //55.00%
11:使用sigar监控硬件资源
- 引入jar包
- windows:
将sigar-amd64-winnt.dll 或者sigar-x86-winnt.dll 加入system32 - linux:
将libsigar-amd64-linux.so 或者 libsigar-x86-linux.so 加入 usr/lib 或者usr/lib64
调用的地方加代码,打印文件路径,将相关dll或者so放入对应文件中
System.getProperty("java.library.path");
12: resultful风格的接口请求常用注解
- @PathVariable
resultful风格时的url占位符
例子:
@GetMapping("/user/{id}")
public Response test(@PathVariable Integer id)
- post请求参数
@PostMapping("/user")
public Response test(@RequestParam("id") Integer id)
- 集成swagger
@PostMapping("/user")
public Response test(@RequestParam("id") @ApiParam("主键id") Integer id)
- delete请求
@DeleteMapping("/user/{id}")
public Response test(@PathVariable Integer id)
13: Java8 中使用 skip or limit 来替代 subList
- limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
- skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;
14: 通过文件的字节数组判断文件类型
- 将byte数组转换为16进制字符串
- 根据字符串判断文件类型
- https://blog.youkuaiyun.com/ahua186186/article/details/84624522
15: java注释
- TODO 该处代码代编写
- FIXME 该处代码需要修正
16: 开发中时间格式处理
- 对于时间格式的处理 java自带的date类产生的时间是标准时间格式 new Date() —>Thu Sep 23 15:33:09 CST 2021
- 使用hutool的时间工具类 DateUtil.date() 方法产生的---->2021-09-23 15:33:09
- 前端传后端的时间格式 在后台对象上使用@DateTimeFormat(pattern = DatePattern.NORM_DATE_PATTERN) 进行格式化
- 后端返回给前端的格式 在后台对象上使用@JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN) 进行格式化
- 在mysql数据库中 只要属性类型为Date 不管是那种格式都被转化成标准格式展示,然后可以进行各种格式化
mysql使用decimal
- 对于MySQL3.23 以前的版本,DECIMAL(M, D) 列的每个值占用M 字节,而符号(如果需要)和小数点包括在M 字节中。因此,类型为DECIMAL(5, 2) 的列,其取值范围为-9.99 到99.99,因为它们覆盖了所有可能的5 个字符的值。
- 在MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于早期版本中的DECIMAL(M + 2, D) 的取值范围。
Java BigDecimal比较大小
//前提为a、b均不能为null
if(a.compareTo(b) == -1){
System.out.println("a小于b");
}
if(a.compareTo(b) == 0){
System.out.println("a等于b");
}
if(a.compareTo(b) == 1){
System.out.println("a大于b");
}
if(a.compareTo(b) > -1){
System.out.println("a大于等于b");
}
if(a.compareTo(b) < 1){
System.out.println("a小于等于b");
}
Function<T,R>的用法
public static void main(String[] args) {
Function<String,String> function = a->a+" jack";
Function<String,String> function1 = a->a+" Bob";
System.out.println(function.apply("hello")); //hello jack
String greet = function.andThen(function1).apply("hello");
System.out.println(greet);//hello jack Bob 之后
String greeet1 = function.compose(function1).apply("hello");
System.out.println(greeet1);//hello Bob jack 之前
}
mybatis时间区间查询
mybatis框架支持直接用>=或<=查询日期范围,如:
<if test="startTime != null and startTime != ''">
and timer.create_time >= #{startTime}
<if test="endTime != null and endTime != ''">
and timer.create_time <= #{endTime}
</if>
但这种方式,如果开始时间和结束时间是同一个日期,就查不出来了,一种解决方法是用DATE_FORMAT转一下日期,如:
<if test="startTime != null and startTime !='' ">
<![CDATA[ and DATE_FORMAT(create_time, '%Y-%m-%d') >= #{startTime} ]]>
</if>
<if test="endTime != null and endTime !='' ">
<![CDATA[ and DATE_FORMAT(create_time, '%Y-%m-%d') <= #{endTime} ]]>
</if>