
java
NewBee.Mu
这个作者很懒,什么都没留下…
展开
-
面试题引出的知识点整理
阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消耗的时间有可能比用户代码执行的时间还要长。可重入锁又名递归锁是指在同一个线程外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和Synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。原创 2023-02-06 19:47:43 · 1276 阅读 · 1 评论 -
面试题及其衍生知识点
面试题及其衍生知识点原创 2022-09-08 17:39:03 · 1430 阅读 · 1 评论 -
excel模板下载
excel模板下载原创 2022-08-19 16:09:58 · 145 阅读 · 0 评论 -
使用poi导入excel文件
比如excel中的2019/6/17实际上就是43633,指的是从1900年到2019年6月17日间隔多少天。可以用这个代码来获得excel中的真实行数,但是有时候会失效,所以我用了另一种方法。对于身份证号的读取,因为身份证号都是15位或者18位的,所以我也写了个小方法。excel中的时间读取出来会变成时间戳,所以需要自己转换一下。首先判断是不是是不是模板文档,并且读取成XSSFSheet。这个小方法可以简单的判定是不是小数。可以去除空格、回车、换行符、制表符。然后对XSSFSheet进行分析。...原创 2022-08-17 17:19:26 · 576 阅读 · 0 评论 -
easyexcel读取文件
提取excel内容原创 2022-06-24 13:01:50 · 989 阅读 · 0 评论 -
使用AOP实现日志系统
使用AOP实现日志系统创建数据库表创建实体类创建mapper层和service层创建自定义注解创建切面controller层中加入自定义注解创建数据库表首先,通过建表语句,创建日志表,这里是mysql的,如果是oracle记得把varchar换成varchar2CREATE TABLE `diary` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `user_name` varchar(255) DEFAULT NULL COMM原创 2022-05-19 15:47:29 · 524 阅读 · 0 评论 -
list根据某个字段求和,平均数,数量,最大值,最小值
public class test09 { public static void main(String[] args) { List<Demo> list = new ArrayList<>(); list.add(new Demo(1,1)); list.add(new Demo(1,5)); list.add(new Demo(1,8)); list.add(new Demo(1,6));原创 2022-05-06 15:26:30 · 1165 阅读 · 0 评论 -
list根据某个字段合并求和
public class test08 { public static void main(String[] args) { List<Demo1> list = new ArrayList<>(); list.add(new Demo1("1","2",1.0,2.0)); list.add(new Demo1("1","2",1.0,2.0)); list.add(new Demo1("2","2",1.0原创 2022-05-06 15:17:37 · 1853 阅读 · 0 评论 -
使用easyexcel导出excel表格
想要将数据使用excel表格导出,可以使用easyexcelpom.xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency>Exce原创 2022-04-20 09:49:54 · 9441 阅读 · 1 评论 -
Java并发编程学习笔记
Synchronized学习笔记使用场景修饰实例方法修饰静态方法修饰代码块成员锁实例对象锁当前类的 class 对象锁Java对象的构成对象头Mark Word(标记字段)Klass Point(类型指针)实例数据对其填充synchronized怎么实现有序性、可见性、原子性有序性as-if-serial可见性原子性synchronized特性可重入性不可中断性底层实现同步代码同步方法monitor重量级锁用户态和内核态优化锁升级偏向锁轻量级锁自旋锁用synchronized还是Lock呢使用场景修饰实原创 2022-04-12 16:20:23 · 801 阅读 · 2 评论 -
使用stream流进行条件查询
public class Demo { private Integer id; private Integer num; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getNum() { return num; } publ.原创 2022-04-11 11:51:49 · 3445 阅读 · 0 评论 -
关于newFixedThreadPool的源码探究
上一篇博客我记录了我使用使用CompletableFuture异步编程,中间使用了newFixedThreadPool来创建线程池。总所周知,Executor工厂方法可以创建四种线程池,而提到newFixedThreadPool,很多博客中都是这么描述他的这样的博客还有很多我就不一一列举了,以至于我之前整理的线程池的博客中也是这么说的。刚刚在机缘巧合下,我发现这么说是不对的,不是等待而是拒绝,大家都说错了。(有点懒,所以也懒得改我之前的博客了,大家凑合看就完事了)Ctrl+左键点进去再Ctr原创 2022-04-08 17:11:17 · 353 阅读 · 2 评论 -
使用CompletableFuture异步编程在java代码中实现异步操作
通常来说,实现异步操作可以通过使用RabbitMQ等中间件来实现,但是使用CompletableFuture异步变成其实不需要这个麻烦,只需要简单几行代码就可以实现以最简单的线程休眠2秒为例首先是普通的java代码public class test02 { public static void main(String[] args) { try { Thread.sleep(2000); System.out.println("b原创 2022-04-08 16:30:56 · 1702 阅读 · 0 评论 -
使用steam流来进行分组统计
public class Demo { private Integer id; private Integer num; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getNum() { return num; } publ.原创 2022-04-07 19:32:28 · 3234 阅读 · 0 评论 -
java基础面试题
java基础面试题http常用的状态码数据库索引的作用数据库索引的缺点联合索引注意事项(最左前缀原则)数据库事务三大范式索引失效的几种情况表的冗余字段什么情况下使用常见的加密算法对称加密算法和非对称加密算法的区别摘要算法加密的目的https怎么实现通信加密restful是什么前后端的跨域问题http默认端口https默认端口tcp三次握手http怎么实现数据压缩参数linux常用命令常用的数据结构数据和链表的使用场景区别有哪几种排序算法冒泡排序的时间复杂度什么是时间复杂度mybatis#{}和${}的区别$原创 2022-03-28 16:32:32 · 1245 阅读 · 0 评论 -
getAnnocation方法的源码探索(未完成)(剩下的不会了,寻求帮助中。。。)
在熟悉项目代码的过程中,看到了一条代码,因为涉及到具体业务,因此我自己写了一个模拟当时的情况PersonEnum.javapublic enum PersonEnum{ TEACHER("teacher","老师"), STUDENT("student","学生"), WORKER("worker","工人"); private String name; private String desc; public String getName(){ return name; }原创 2021-04-23 16:27:09 · 243 阅读 · 0 评论 -
BeanFactory 和 ApplicationContext有什么区别
1、BeanFactory不支持国际化,ApplicationContext支持国际化2、ApplicationContext扩展了资源加载器接口3、BeanFactory通常以编程的方式被创建,ApplicationContext能以声明的方式创建4、BeanFactroy采用的是延迟加载形式来注入Bean的,ApplicationContext是在容器启动时,一次性创建了所有的Bean5、BeanFactory需要手动注册,而ApplicationContext则是自动注册...原创 2021-04-12 10:49:33 · 851 阅读 · 3 评论 -
ConcurrentHashMap和HashTable 有什么区别?
ConcurrentHashMap是使用了锁分段技术来保证线程安全的。锁分段技术:首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。ConcurrentHash原创 2021-04-12 10:23:42 · 226 阅读 · 0 评论 -
HashMap 和 ConcurrentHashMap 的区别
1、ConcurrentHashMap对整个桶数组进行了分段,而HashMap则没有2、ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而HashMap没有锁机制,不是线程安全的原创 2021-04-12 10:22:39 · 252 阅读 · 0 评论 -
TreeSet和TreeMap区别
最主要的区别就是TreeSet和TreeMap分别实现Set和Map接口TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序)TreeSet中不能有重复对象,而TreeMap中可以存在TreeMap的底层采用红黑树的实现,完成数据有序的插入,排序...原创 2021-04-12 10:19:34 · 729 阅读 · 1 评论 -
HashMap 与 HashTable 有什么区别
1、HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。2、HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap原创 2021-04-12 10:14:27 · 787 阅读 · 0 评论 -
final,finally,finalize的区别?
一、final :1、修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承。因此一个类不能及被声明为abstract,又被声明为final的。2、将变量或方法声明为final,可以保证他们使用中不被改变。被声明为final的变量必须在声明时给定初值,而以后的引用中只能读取,不可修改,被声明为final的方法也同样只能使用,不能重载。二、finally:在异常处理时提供finally块来执行清楚操作。如果抛出一个异常,那么相匹配的catch语句就会执行,然后原创 2021-04-09 16:20:15 · 161 阅读 · 0 评论 -
HashSet与HashMap的区别
HashSetHashMapHashSet实现了Set接口HashMap实现了Map接口HashSet储存对象HashMap储存键值对使用add()方法将元素放入set中使用put()方法将元素放入map中HashSet使用成员对象来计算hashcode值HashMap中使用键对象来计算hashcode值速度不如HashMap快速度快...原创 2021-04-09 16:18:45 · 115 阅读 · 0 评论 -
HashSet 的实现原理
1、是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。2、当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的equals(Object obj)方法原创 2021-04-09 16:15:27 · 1261 阅读 · 0 评论 -
ArrayList 和 LinkedList 的区别是什么
1、数据结构不同ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。2、效率不同当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下原创 2021-04-09 16:12:33 · 382 阅读 · 0 评论 -
当遍历集合是进行修改删除可以吗?会报什么错?应该怎么修改?
不可以会报并发修改异常用常规for循环,判断条件改为每次进行集合大小的计算原创 2021-04-09 16:03:41 · 140 阅读 · 0 评论 -
Java反射机制主要提供了哪些功能
1、在运行时判定任意一个对象所属的类;2、在运行时构造任意一个类的对象;3、在运行时判定任意一个类所具有的成员变量和方法;4、在运行时调用任意一个对象的方法;5、生成动态代理。...原创 2021-04-09 15:59:58 · 777 阅读 · 0 评论 -
反射的实现方式
第一种:通过Object类的getClass方法第二种:通过对象实例方法获取对象第三种:通过Class.forName方式原创 2021-04-09 15:58:54 · 649 阅读 · 0 评论 -
什么是反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。...原创 2021-04-09 15:57:25 · 129 阅读 · 0 评论 -
== 和 equals 的区别是什么
1、equals()方法用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是== 的判断;2、"==" 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象...原创 2021-04-09 15:55:50 · 308 阅读 · 0 评论 -
谈谈自己对于数字签名和验签的理解
数字签名因为在客户端和服务端的通信过程中,会遇到很多的安全问题,无法确认收到的信息是否是真实有效的,而不是中途被人掉包的。这个时候数字签名就可以站出来,它的作用就是用来征明消息在通信过程中未被掉包,是真实有效的。就像我们以前上学请假的时候班主任或者辅导员在请假条上的签名一样,用来征明这个请假条是真实有效的。验签验签,顾名思义,就是一个对数字签名进行验证的操作。以服务端S向客户端C发送一封邮件为例:首先,服务端S将邮件使用双方约定好的某种算法进行运算,例如使用hash算法,生成一个签名然后把原创 2021-04-06 14:23:15 · 2639 阅读 · 0 评论 -
数字签名与验签
前言数字签名(又称公钥数字签名)是只有发送方才能产生的无法伪造的数字串,是对发送者发送信息真实性的有效证明。数字签名主要是保证数据有效性(验证是谁发的)和完整性(验证信息是否被篡改)。数字签名是非对称加密和数字摘要技术的应用。数字签名流程A为客户端,C为服务端;A写邮件给C过程:A用公钥对邮件加密,C收到邮件后用私钥进行解密;C写邮件给A过程:C写好邮件,用hash函数生成邮件的摘要,将摘要附在邮件上面,这就完成了数字签名,然后,C再使用私钥加密,最后发送给A;A收到邮件后转载 2021-04-06 10:26:28 · 476 阅读 · 0 评论 -
常见加密算法实现——DES、AES、RSA、MD5
一、对称加密1、介绍对称加密:加密和解密使用同一个密钥。对称加密算法:DES、3DES、AES等。DES:数据加密标准,是一种使用密钥加密的块算法;3DES:DES向AES过渡的加密算法;AES:高级加密标准,替代DES;对称加密的特点:加密速度快,可加密大文件;密文可逆,数据容易暴露;加密后编码找不到对应字符,出现乱码;一般结合base64使用2、加密模式有两种加密模式:ECB、CBCECB:电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立转载 2021-04-06 10:12:09 · 1341 阅读 · 0 评论 -
synchronized原理
synchronized是java提供的原子性内置锁,这种内置的并且使用者看不到的锁也被称为监视器锁,使用synchronized之后,会在编译之后在同步的代码块前后加上monitorenter和monitorexit字节码指令,他依赖操作系统底层互斥锁实现。他的作用主要就是实现原子性操作和解决共享变量的内存可见性问题。执行monitorenter指令时会尝试获取对象锁,如果对象没有被锁定或者已经获得了锁,锁的计数器+1。此时其他竞争锁的线程则会进入等待队列中。执行monitorexit指令时则会把计数原创 2021-03-24 10:32:33 · 497 阅读 · 0 评论 -
String的replaceAll方法的参数中含有特殊字符的处理方法
在想要替换字符串中指定的部分字符串的时候,往往会使用replaceAll方法。但是如果参数中含有特殊字符,比如$的时候,就需要使用Matcher.quoteReplacement方法,案例如下图:原创 2021-03-16 10:35:58 · 1641 阅读 · 0 评论 -
java可以开启线程吗?
开不了可以从源码中看出来,首先写一个简单的测试类public class Test01 { public static void main(String[] args) { new Thread().start(); }}然后Ctrl+左键进入start方法 public synchronized void start() { /** * This method is not invoked for the main method原创 2021-01-28 15:22:21 · 265 阅读 · 0 评论 -
IDEA使用Java8新特性前的配置修改
原创 2021-01-28 14:21:34 · 293 阅读 · 0 评论 -
谈谈自己对于hashcode和equals的理解
一直以来,对于hashcode都只停留在知道的层面。只知道机械性的背诵:可能hashcode相同但是equals不相同,不过equals相同hashcode一定相同。重写equals一定重写hashcode。今天再去学习的时候,突然有了自己新的理解,在这里记录一下。首先,hash是一种算法,而hashcode就是通过这种算法算出的值,有一个对应的表叫做hash表。举个例子,就是有懂大楼叫做hash表,每个对象就是不同的住户,而hashcode就是大楼的楼层,也就是对应的hash表中的值。当有一个原创 2021-01-23 14:39:08 · 196 阅读 · 0 评论 -
CMS收集器和G1收集器的区别
区别一:使用的范围不一样CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用。区别二:使用的算法不一样CMS收集器是使用“标记-清除”算法进行的垃圾回收。G1收集器使用的是“标记-整理”算法进行的垃圾回收。区别三:CMS收集器和G1收集器的优劣性CMS收集器以最小的停顿时间为目标的收集器,容易产生内存碎片。G1收集器不会产生内存碎片。区别四:垃圾回收的过程不一样CMS收集器:初始标记→并发标记原创 2021-01-17 15:18:43 · 1137 阅读 · 0 评论 -
图片和base64的互转
代码如下:package com.sunyard.flowpre.service.txdapp;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import java.io.*;/** * @author :haoc.xu * @date :2021/1/7原创 2021-01-07 11:17:04 · 219 阅读 · 0 评论