EasyExcel
前一段时间在写一个灌溉系统的项目,项目要求有数据导入导出,这一块正好分配给我去完成了,所以我上网学了一下EasyExcel的使用。 pom导入:12345<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>最新版本</version></dependency> 实体类:@ColumnWidth:定义列宽 @ExcelProperty:value:用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 @ExcelIgnore:加了该注解的字段会被忽略 @DateTimeFormat:日期转换 @NumberFormat:数字转换 123456789101112131415161718@Data@NoArgsConstructor@AllArgsConstructor@ColumnWidth(20)public cla ...
背包问题
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示例 1: 输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2: 输入:coins = [2], amount = 3输出:-1示例 3: 输入:coins = [1], amount = 0输出:0 链接:https://leetcode.cn/problems/coin-change 思路: 我们采用自下而上的方式进行思考。仍定义 F(i)F(i) 为组成金额 ii 所需最少的硬币数量,假设在计算 F(i)F(i) 之前,我们已经计算出 F(0)-F(i-1)F(0)−F(i−1) 的答案。 则 F(i)F(i) 对应的转移方程应为 其中 cj代表的是第 j 枚硬币的面值,即我们枚举最后一枚硬币面额是 cj,那么需要从 i-cjj这个金额的状态 F(i-cj) 转 ...
全排列(算法)
题目:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3: 输入:nums = [1]输出:[[1]] 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/permutations 代码:1234567891011121314151617181920212223242526272829303132class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); ...
本周小结
因为疫情原因,学校提前放假了,我们也开始了在家的学习。这周总体来讲是招新的事情比较多,在家学习的话,我感觉我的学习效率不是特别高。 前两天新分配了一个项目,和上次我们写的项目差不多,都是商城项目。我们上一次的话我主要写的是用户相关的东西,这次把订单相关的部分分给我了,感觉还挺不错的。虽然两次项目是差不多的,但是我两次写的东西是完全不同的,不用担心和上次的撞了。这次的话我想借鉴一下别人的源码,因为事实上平时我是很少看别人源码的,这次仿着其他项目写,也可以看出来我写的不好的地方,进行一下改善。当然借鉴源码不是准备完全照搬,只是看一下别人项目有什么亮点,完善完善自己的代码。 这一段时间还是在学习JVM,说实话这段时间的学习不是很好,视频看过了忘得太快了,而且太多了,看完一遍差不多学习计划就要截止了。感觉我需要转化一下学习的方法了,要不跟着视频看一遍,估计什么都记不住。到时候考核的话我还要留出一段时间去复习源码,因为上一次学习源码的时候学的有点偏了,有一些地方根本没有学到,面试的时候回答的挺差劲的,所以需要这次去留出时间 ...
集合面试题
[TOC] ArrayList:(1)JDK1.7和JDK1.8下ArrayList()底层数组的默认长度?jdk1.7时使用ArrayList的无参构造,初始化后的长度是10,jdk1.8时使用无参构造,构造一个空数组,初始长度是0。 (2) 如何复制某个ArrayList到另一个ArrayList中去?使用clone()方法使用ArrayList构造方法使用addAll方法 (3)arraylist怎么保证线程安全?<1>、使用Vector <2>、使用Collections.synchronizedList() <3>、使用CopyOnWriteArrayList,涉及线程安全的部分,是通过写时复制的方式来实现。它内部有个volatile数组来保持数据。在“添加/修改/删除”数据时,会先获取互斥锁,再新建一个数组,并将更新后的数据拷贝到新建的数组中,最后再将该数组赋值给volatile数组,然后再释放互斥锁。 1.在做修改操作的时候加锁 2.每次修改都是将元素copy到一个新的数组中,并且将数组赋值到成员变量array中。 3.利用volati ...
PC寄存器
使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记原当前线程的执行地址呢?因为CPU需要不停的切换各个线程,这时候切换回来以后,就得知道接着从哪开始继续执行。JVM的字节码解释器就需要通过改变PC寄存器的值来明确下一条应该执行什么样的字节码指令。 PC寄存器为什么会被设定为线程私有?我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢﹖为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个Pc寄存器,这样一来各个线程之间便可以进行独立计算,从而不会出现相互千扰的情况。由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。这样必然导致经常中断或恢复,如何保证分毫无差呢﹖每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器在各个线程之间互不影响。
秒杀功能
概述:这次完善项目的时候加入了秒杀功能。这个功能要考虑的地方挺多的,我在网上找了一些资料,然后把这个功能大致完成了。但是还有很多地方我没考虑到,有些地方实现的不是很好,等以后再回头看对这个功能进行进一步的完善吧。 记录一下我现在实现的一些功能:redis做缓存:因为秒杀这个功能并发性是很大的,所以如果在秒杀的时候直接对mysql数据库进行操作,数据库可能承受不住,所以一般情况下都会用redis做缓存,将秒杀商品的信息存到redis里面,当redis里面查不到数据的时候再进入mysql查询,如果查询到数据,就将mysql中的数据写入到redis。 库存问题:在扣减内存时,要先判断一个用户是否已经购买过,确定未购买再进行扣减内存。但因为查询数据库和更新数据库不是原子性操作,在并发性很高的情况下,可能会出现超卖的情况。这时候可以使用lua脚本,查询和扣减内存的操作均在lua中进行,可以保证原子性。 key[1]:用来存储已经进行秒杀过的用户id key[2]:存储秒杀商品内存 ARGV[1]:用户id ARGV[2]:订单信息类转化为的Json 1234567891011121314 ...
客服功能
最近一段时间我们在完善项目,我们在写的项目是一个商城项目。上次考核的时候考虑到进度问题,客服功能只做了一半,这次项目我对它进行了完善。 客服功能因为要实现即时通信,我主要是基于websocket实现的,它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。因为是第一次去写类似的功能,所以在实现过程中遇到了很多问题。 离线消息:因为客服和用户并不是一直在线的,但是在用户离线的时候别人向他发送的消息他也应该接收到。所以在发送信息的时候我加了一个判断,当用户离线的时候将接收到的信息存到redis里面,在用户连接websocket的查询redis判断用户是否有离线的信息,如果有,在登录的时候一起发送过来。 发送消息 12345678Session userSession = map.get("user:" + userId);if (userSession != null) { userSession.getAsyncRemote().sendText(msgJson); } ...
mysql索引
mysql索引 索引类型:按逻辑:普通索引:普通索引是mysql中最基本的索引,允许在列中插入重复值和空值,唯一的任务就是加快数据访问速度。 唯一索引:避免数据重复,唯一索引列的值必须唯一,允许有空值,如果是组合索引,则列值的组合必须唯一。 主键索引:主键索引是专门为主键字段创建的索引,一个表只能有一个主键,不允许有空值。 组合索引:在多个字段上创建的索引,只有在查询的时候使用了创建索引时的第一个字段,才会使用索引,遵循最左前缀原则。 全文索引:全文索引主要用来查询文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在mysql引擎中只有MyISAM引擎支持全文索引。 索引优缺点:优点:通过创建唯一索引,可以保持数据库中数据的唯一性。 使用索引可以大幅度提升系统性能,提高查询速度。 可以降低查询中分组和排序的时间。 可以加速表和表 ...
Vector源码
Vector是基于数组实现的随机访问的同步的List结构,其public方法都是加锁的(加锁后不再需要临时变量保持原子性) Vector的继承关系:123public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 继承了 AbstractList 抽象类,实现了 List 接口,实现了 RandomAccess, Cloneable, java.io.Serializabl e接口,所以支持快速访问、复制(拷贝)、序列化。 查和改操作速度非常快【时间复杂度:O(1)】,增和删操作相对较慢【时间复杂度:最快O(1)最慢O(n)】。 相比于 ArrayList 其效率低,因为加入了 synchronized 操作。 Synchronized:线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点: 一是存在共享数据(也称临界资源) 二是存在多条线 ...