java开发笔记

这篇博客详细记录了Java开发中的关键知识点,从文件操作、字符串处理到异常处理、反射机制,再到集合排序、Map实现、LRU缓存策略,以及事务处理、时间格式化和MySQL的decimal使用等。此外,还探讨了Java中Integer的特性,使用sigar监控硬件资源,以及Java8的Stream API应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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接口

  1. HashMap(无序 线程安全)
    new HashMap(3);//大于3的最小的2的n次方的数4 长度为4的map
    new HashMap(16,0.75) //长度16 负载因子0.75

  2. LinkedHashMap(有序 线程不安全)

  3. TreeMap

  4. ConcurrentHashMap (线程安全)

  5. synchronizedMap(线程安全)

  6. HashTable(线程安全 效率低 已废弃)

  • ConcurrentHashMap线程安全的实现方式
    jdk1.7 使用分段锁 jdk1.8 使用CAS(compare and swap) 比较交换算法

8:LRU(Least Recently Used) 最近最少使用

是一种页面置换算法,选择最近最久未使用的页面予以淘汰;只在缓存中存最新的数据 java中可以使用LinkedHashMap来实现:

  1. 本身实现按照访问顺序的存储
  2. 提供方法用于判断是否需要移除最不常读取的数

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监控硬件资源

  1. 引入jar包
  2. windows:
    将sigar-amd64-winnt.dll 或者sigar-x86-winnt.dll 加入system32
  3. 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

  1. limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
  2. 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值