Java
文章平均质量分 79
java
Code皮皮虾
华为云享专家、掘金创作者、CSDN Java领域优质创作者,但并不仅限于Java,博文干货满满,期待您的关注!
展开
-
【日常需求】一次使用EasyExcel而引发的问题与思考~
大家好啊,我是皮皮虾~,最近接的个需求中有个小功能是要上传用户id或email的excel,解析返回出正常的用户数和异常的用户数(简单来说就是能查到用户信息的数量和不能查到的数量)。擦,我寻思这不得涉及到流的操作,这可是我的弱项啊~当然来,正经人谁直接手写,当然要拥抱开源啦,这不就遇到了阿里的EasyExcel根据EasyExcel的思想,excel的每一行都认为是一个对象,每一列可以认为是一个字段那么对应到Java中,我们就可以建一个实体类,来对应我们需要解析的Excel。原创 2022-09-25 17:09:36 · 2131 阅读 · 0 评论 -
【大厂面试题专栏更文】:一文帮你总结JVM 垃圾回收算法✨
文章目录????毛遂自荐????文章整体架构????JVM垃圾回收算法✨标记-清除算法✨复制算法✨标记-整理算法✨分代收集算法????常见垃圾回收器使用到的回收算法????最后????毛遂自荐毛遂自荐一下,给大家推荐一下自己的专栏????,欢迎小伙伴们收藏关注????大厂面试题专栏Java专栏爬虫专栏更多专栏尽在主页,点我????!!!????文章整体架构????JVM垃圾回收算法✨标记-清除算法该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,原创 2021-08-18 14:30:00 · 471 阅读 · 38 评论 -
一文就带你搞懂✨为什么重写 equals 时必须重写 hashCode 方法?
文章目录✨前景说明⭐为什么?有什么作用OR好处?????实战演练没有重写hashcode()解决办法:重写hashcode()尾言✨前景说明为什么重写 equals 时必须重写 hashCode 方法?相信这个问题大部分小伙伴即使面试中没有被问到过,但肯定也听说过那么这个问题到底是为什么?该怎么回答?今天我皮皮虾就来告诉各位小伙伴们????当然,如果对各位有那么亿点点小作用的话,那么期待大家的一键三连哦!????⭐为什么?有什么作用OR好处?使用hashcode方法提前校验,可以避免原创 2021-08-17 08:32:32 · 8873 阅读 · 55 评论 -
【阿里面试题】fail-fast、fail-safe一套给你讲全!!!
文章目录什么是fail-fast、fail-safejava.util包下list的iterator()方法原理java.util.concurrent包下如何解决什么是fail-fast、fail-safefail-fast 和 fail-safe 是 Java集合中常见的错误检测机制,通常出现在集合遍历过程中。fail-safe允许在遍历的过程中对容器中的数据进行修改,而fail-fast则不允许。java.util下的所有集合类都是 fail-fast 机制,而 java.util.原创 2021-04-22 18:09:47 · 639 阅读 · 1 评论 -
阿里面试官叫我细说 Synchronized锁优化、锁升级,我张口就来!!!
文章目录前置知识:Java对象头锁优化锁消除锁粗化锁升级偏向锁轻量级锁自旋锁前置知识:Java对象头Java对象保存在内存中时,由以下三部分组成:对象头实例数据对齐填充字节而java的对象头由以下三部分组成:Mark Word指向类的指针数组长度(只有数组对象才有)Java对象头存储结构锁优化JDK1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。锁消除例如下面这个方法public Str原创 2021-04-21 15:00:47 · 419 阅读 · 0 评论 -
【大厂面试题系列】:volatile在单例模式中的作用
以 双重检查单例模式为例,先上代码public class Singleton { public Singleton() { } private static volatile Singleton singleton; public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { ..原创 2021-03-31 21:27:27 · 1216 阅读 · 0 评论 -
大厂面试被问到数组索引定位的原理,我直接懵圈???
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据根据寻址公式进行定位公式address[i] = base_address + i * data_type_sizeaddress[i] : 下标 i 的地址值。base_address: 数组的首地址。data_type_size: 数组中每个元素的大小,也就是数据类型大小(字节),例如int是4个字节。简单来说就是根据 数组首地址 + 索引 * 元素大小 来进行定位获取觉得不错的小..原创 2021-03-29 20:14:07 · 636 阅读 · 0 评论 -
【大厂面试题系列】:说说JVM垃圾回收算法及其优缺点
JVM的垃圾回收算法,优缺点标记-清除算法该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。也可以反过来先标记所有不需要被回收的对象,标记完成以后回收没有被标记的对象。执行效率不稳定,适用于对象存过较多的区域,适用于老年代会产生内存碎片何为清除?标记清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里。下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放。复制算法将可用内存分为大小相.原创 2021-03-24 21:12:56 · 628 阅读 · 0 评论 -
面试官:说说你对CMS垃圾回收器的理解
文章目录CMS垃圾回收器相关面试题CMS垃圾收集器,用在哪个年代为什么CMS怎样进行垃圾回收,哪些过程是stop the worldCMS的缺点,什么是浮动垃圾,浮动垃圾过多会有什么影响CMS垃圾回收器CMS是一种已获得最短回收停顿时间为目标的收集器。CMS垃圾回收器基于标记-清除算法实现,那么使用该算法的最大缺点也显而易见——大量的内存碎片。内存碎片过多时会给大对象分配带来麻烦,即会存在空间足够,但是连续的空间太小,这样的话就会触发Full GCCMS解决办法:使用 -XX:CMSFullGC原创 2021-03-24 20:47:30 · 614 阅读 · 0 评论 -
超详细 JDK7、8HashMap扩容流程 源码解析、读后总结一套给你搞定!!!
文章目录前言JDK7 HashMap扩容JDK8 HashMap扩容前言JDK7 和JDK8 的扩容方法都基于 resize()方法,但底层实现却有所不同JDK7 HashMap扩容void addEntry(int hash, K key, V value, int bucketIndex) { if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table原创 2021-03-23 20:08:17 · 834 阅读 · 2 评论 -
【大厂面试题系列】:JDK7、8 HashMap扩容原理源码讲解
文章目录前言JDK7 HashMap扩容JDK8 HashMap扩容前言JDK7 和JDK8 的扩容方法都基于 resize()方法,但底层实现却有所不同JDK7 HashMap扩容void addEntry(int hash, K key, V value, int bucketIndex) { if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table原创 2021-03-22 20:31:07 · 1001 阅读 · 0 评论 -
【大厂面试题系列】:如何解决CAS的ABA问题
CAS解决ABA问题ABA问题产生如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那CAS操作就会误认为它从来没有被修改过。这个问题被称为CAS操作的 "ABA"问题。public class ABADemo { static AtomicReference<Integer> atomicReference = new Atomi..原创 2021-03-19 13:52:06 · 919 阅读 · 0 评论 -
【大厂面试题系列】:JDK7、8 HashMap的get()、put()方法流程
文章目录JDK7get()流程put()流程JDK8get()流程put()流程 JDK7、8对于链表的插入:JDK7采用的是头插法,JDK8采用的是尾插法JDK7get()流程先看key是否为null,如果为null的话则调用getForNullKey()方法(之后看,如果数组size为0,则返回bull,如果不为0,则获取数组下标为0的链表进行遍历来获取key为null的键值对,如果存在则返回key为null对应的value值,没有则返回null)如果key不为null,则调用g原创 2021-03-12 18:30:27 · 1589 阅读 · 1 评论 -
【大厂面试题系列】:说说Young GC(Minor GC) 和 Full GC的触发条件【JVM】
文章目录1. 调用 System.gc()2. 老年代空间不足3. 空间分配担保失败4. JDK 1.7 及以前的永久代空间不足5. CMS GC时出现Concurrent Mode Failure1. 调用 System.gc()只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。不建议使用这种方式,而是让虚拟机管理内存。2. 老年代空间不足老年代空间不足的常见场景为前文所讲的大对象直接进入老年代、长期存活的对象进入老年代等。为了避免以上原因引起的 Full GC,应当尽量.原创 2021-02-22 15:32:09 · 1620 阅读 · 0 评论 -
【大厂面试题系列】:请写出Java中线程安全的单例模式【设计模式】
文章目录第一种:双重检查第二种:静态内部类第三种:枚举完善使用enum枚举实现单例模式第四种:懒汉式(加锁)第一种:双重检查public class Singleton { private volatile static Singleton singleton; private Singleton() { } public static Singleton getSingleton() { if (singleton == null) {原创 2021-02-22 15:21:20 · 621 阅读 · 2 评论 -
MybatisPlus学习(七)实现自动填充功能
文章目录1、自动填充功能介绍2、实现自动填充功能环境搭建请看该链接的MybatisPlus模块1、自动填充功能介绍 在常用业务中有些属性需要配置一些默认值,MyBatis-Plus提供了实现此功能的插件,也就是自动填充功能。自动填充功能注意事项:填充原理是直接给entity的属性设置值!!!注解则是指定该属性在对应情况下必有值,如果无值则入库会是nullMetaObjectHandler提供的默认方法的策略均为:原创 2020-09-03 17:07:52 · 2174 阅读 · 1 评论 -
SpringBoot启动报错Action: Add an implementation, such as Hibernate Validator, to the classpath解决办法
微服务启动失败报错在网上找了很长时间尝试了很多办法都没有用,这让我十分烦躁,这Hibernate Validator我根本没用,他报什么错啊,但他又报Add an implementation, such as Hibernate Validator, to the classpath错误,那我只好死马当活马医,加上这个依赖看看,没想到还真成功了。解决办法找到项目中Hibernate Validator的依赖版本在pom文件中添加Hibernate Validator该版本的依赖<de原创 2020-08-03 12:02:03 · 8451 阅读 · 8 评论 -
保姆级SpringBoot+Vue图片上传到阿里云OSS教程
文章目录导入OSS依赖配置配置文件后端代码前端代码导入OSS依赖 <!--阿里云OSS--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</versio原创 2020-11-08 09:07:26 · 2202 阅读 · 2 评论 -
SpringBoot+Vue后台管理系统整合Kaptcha验证码
文章目录1、导入Kaptcha依赖2、配置Config类3、配置Controller4、Vue前端表单代码1、导入Kaptcha依赖<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version></dependency>2、配置Conf原创 2020-10-29 21:19:07 · 1458 阅读 · 1 评论 -
别再用所谓的MD5加密了,大佬们都用它——>MD5盐值加密多方法详解
文章目录1、MD5简介2、MD5加密使用3、MD5盐值加密介绍4、MD5盐值加密使用4.1、Md5Crypt加密4.2、使用spring提供的工具 BCryptPasswordEncoder(推荐)1、MD5简介Message Digest algorithm 5 ,信息摘要算法压缩性:任意长度的数据,算出的MD5值长度都是固定的容易计算:从源数据计算出MD5值很容易抗修改性:对原数据进行任何改动(哪怕一个字节),所得到的MD5值都有很大的区别强抗碰撞:向找到两个不同的数据,使它们具有相同原创 2020-10-04 18:45:11 · 8093 阅读 · 7 评论 -
Java编程之10个提升代码的小技巧
文章目录引言1、把字符串常量放在前面2、检查null和长度3、switch语句末尾总是加上default4、字符串拼接使用 StringBuilder5、使用 String.valueOf(value) 代替 ""+value6、注意 String.split(String regex)用法7、长整型常量后添加大写 L8、尽量使用基本数据类型代替对象9、公有静态常量应该通过类访问10、不要用 NullPointerException进行空指针捕获引言 &n原创 2020-09-06 11:23:06 · 550 阅读 · 1 评论 -
Java集合工具类Collections常用方法详解
文章目录1、Collections介绍2、Collections常用方法2.1、reverse()2.2、sort()2.3、swap()2.4、min()和max()2.5、copy()2.6、fill()2.7、replaceAll()2.8、shuffle()2.9、rotate()2.10、indexOfSubList()和lastIndexOfSubList()2.11、unmodifiableXxx()1、Collections介绍  原创 2020-09-01 18:20:04 · 2195 阅读 · 0 评论 -
Java中final、static关键字总结
文章目录1、final关键字2、static关键字1、final关键字概念:final的意思是最终,不可变。它是个修饰符,用来修饰类、类的成员及局部变量;不能修饰构造方法。特点final关键字可用于类、方法、变量前。final修饰的类不可被继承。final修饰的变量为常量,这些变量只能赋值一次,且终身不变;final修饰的方法不可被重写。final修饰原生类型时,原生类型的值不能发生变化。final修饰引用类型时,表示该引用类型不能再指向其他对象,但引用对象的原创 2020-09-01 16:45:26 · 910 阅读 · 1 评论 -
Java泛型详解(自定义泛型、通配符。。。)
文章目录1、泛型概述2、泛型使用3、自定义泛型1、泛型概述 所谓泛型,就是允许在定义类、接口时通过提供标识表示类中的某个属性的类型或者是某个方法的返回值类型及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也成为类型实参)。2、泛型使用没有使用泛型的情况public class Main { public static void main(St原创 2020-08-24 17:32:27 · 1082 阅读 · 1 评论 -
Redis入门——Key、五大数据类型图文详解
文章目录1、Redis简介2、Redis常见命令3、Redis_Key关键字4、五大数据类型简介4.1、String(字符串)4.2、List(列表)4.3、Set4.3、Hash4.4、ZSet1、Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,原创 2020-08-24 14:02:58 · 4179 阅读 · 0 评论 -
Java封装性及四种权限修饰符详解
文章目录1、封装概述2、封装性的使用3、封装的作用4、四种权限修饰符5、四种权限修饰符测试1、封装概述 封装(Encapsulation)是面向对象方法的重要原则,就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。封装的优点良好的封装能够减少耦合。类内部的结构可以自由修改。可以对成员变量进行更精确的控制。隐藏信息,实现细节。2、封装性的使用public原创 2020-08-24 09:05:54 · 3742 阅读 · 0 评论 -
Java包装类详解(类型互相转换、自动装箱拆箱)
文章目录1、包装类概述2、基本数据类型转化为包装类2、包装类转化为基本数据类型3、自动装箱与自动拆箱4、基本数据类型、包装类与String相互转换1、包装类概述针对八种基本数据类型定义相应的引用类型——包装类(封装类)。封装的优点良好的封装能够减少耦合。类内部的结构可以自由修改。可以对成员变量进行更精确的控制。隐藏信息,实现细节。2、基本数据类型转化为包装类格式:包装类 变量名 = new 包装类(数据);public class Main { pub原创 2020-08-23 23:11:10 · 844 阅读 · 1 评论 -
Java小白必备之面向对象——接口详解
文章目录1、接口概述2、接口定义3、接口中成员特点4、接口实现5、接口多实现6、接口的继承7、接口和抽象类的区别1、接口概述Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。两种含义:Java接口,Java语言中存在的结构,有特定的语法和结构;一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。2、接口定义Java原创 2020-08-22 12:00:36 · 460 阅读 · 0 评论 -
Java小白必备之面向对象-抽象详解
文章目录1、抽象概述2、应用场景3、抽象类总结1、抽象概述什么是抽象类?类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。类本身是不存在的,所以抽象类无法创建对象《无法实例化》。抽象类的注意事项抽象类一定是个父类,因为是不断抽取而来的抽象类中可以不定义抽象方法,其存在的意义就是不让该类创建对象,方法可以直接让子类去使用抽象关键字 abstract 不可以和以下关键字共存:private:私有的方法子类是无法继承到的,也不存在覆盖,如果 abstract 和 privat原创 2020-08-22 09:23:33 · 606 阅读 · 0 评论 -
Java小白必备之面向对象-多态性详解
文章目录1、多态概述2、多态的使用3、多态不适用情况4、instanceof关键字的使用5、多态转型6、多态的优缺点1、多态概述什么是多态性?对象的多态性,父类的引用指向子类的对象(或子类的对象赋给父类的引用)多态的使用有了对象的多态性以后,我们再编译期,只能调用父类声明的方法,但在运行期,我们实际执行的是子类重写父类的方法;总结:编译看左边,运行看右边多态存在的三个必要条件继承重写父类引用指向子类对象2、多态的使用多态定义格式:父类 变量名 = new 子类();原创 2020-08-21 20:42:27 · 530 阅读 · 0 评论 -
Java小白必备之面向对象-继承的定义与使用
文章目录1、继承概述2、继承的使用(代码实例)3、继承类型(代码实例)1、继承概述什么是继承?继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。在现实生活中也是存在继承关系的,例如:父辈的财产由其后代继承。继承关键字继承可以使用 extends这个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的原创 2020-08-21 18:15:30 · 668 阅读 · 0 评论 -
Java必备之面向对象-枚举的定义与使用详解
文章目录1、枚举概述2、如何定义枚举类2.1、自定义枚举类2.2、使用enum定义枚举类3、Enum类中的常用方法1、枚举概述枚举类的理解:类的对象只有有限个,确定的。我们称此为枚举类。当需要定义一组常量时,强烈建议使用枚举类。如果枚举类中只有一个对象,则可以作为单例模式的实现方式。2、如何定义枚举类1. JDK5.0之前,自定义枚举类2. JDK5.0之后,可以使用enum关键字定义枚举类2.1、自定义枚举类public class Main { public st原创 2020-08-20 23:11:56 · 1287 阅读 · 1 评论 -
Java从入门到入坟系列学习路线目录索引(持续更新中~~~)
文章目录一、Java基础二、Java数据库(Mysql)三、Java设计模式四、SSM等主流框架SpringSpringMVCMybatis五、SpringBoot六、SpringCloud(微服务)一、Java基础1. Java基础-String字符串详解2.Java基础-异常3.Java基础-集合4.Java基础-反射二、Java数据库(Mysql)三、Java设计模式四、SSM等主流框架SpringSpringMVCMybatis五、SpringBoot六、Spri原创 2020-08-20 20:07:53 · 5797 阅读 · 30 评论 -
JavaSE进阶之Java反射常用方法整理
文章目录1、Java反射机制概述2、获取Class的三种方式1、Java反射机制概述反射机制有什么用?通过java语言中的反射机制可以操作字节码文件。优点类似于黑客。(可以读和修改字节码文件)通过反射机制可以操作代码片段。(class文件)反射机制的相关类在哪个包下?java.lang.reflect.*反射机制相关的重要的类有哪些?java.lang.Class:代表整个字节码,代表一个类型,代表整个类。java.lang.reflect.Method:代表字节码中的方法字节码。原创 2020-08-20 18:40:17 · 380 阅读 · 0 评论 -
Java小白必备之集合详解(Collection、Map、Set、List)
文章目录1、集合概述2、Collection接口常用方法2.1、add()和remove()方法2.2、size()方法2.3、clear()方法2.4、contains()方法2.5、isEmpty()方法3、Collection集合迭代(重点)3.1、Iterator迭代原理4、List接口常用方法4.1、add()和remove()方法4.2、get()方法4.3、indexOf()lastIndexOf()和方法4.4、set()方法5、ArrayList源码分析6、Map常用方法6.1、put方法原创 2020-08-16 13:56:59 · 791 阅读 · 0 评论 -
Java小白必备之异常详解(try-catch、throws)
文章目录1、异常概述2、异常分类2.1、Error2.2、Exception3、异常处理3.1、try...catch方式处理3.2、throws方式处理4、自定义异常1、异常概述什么是异常?java提供的异常处理机制有什么用?程序运行发生不正常的情况,而这种不正常的情况叫做:异常。java语言是很完善的语言,提供了异常的处理方式,以下程序执行过程中出现了不正常的情况,java把该异常信息打印1输出到控制台,供程序员参考。程序员看到异常信息之后,可以对程序进行修改,让程序更加健壮。以下程序执行控原创 2020-08-15 10:59:37 · 1668 阅读 · 0 评论 -
Java基础之String类方法总结(小白必备知识!)
文章目录1、charAt()方法2、compareTo()方法3、contains()方法4、endsWith()和startsWith()方法5、compareTo()和equals()区别6、equalsIgnoreCase()方法7、getBytes()方法8、indexof()和lastIndexOf()方法9、isEmpty()方法10、replace()方法11、split()方法12、substring()方法13、substring()方法14、toLowerCase()和toUpperCa原创 2020-08-14 15:09:09 · 1250 阅读 · 0 评论