java
北铭_有瑜
顺则乘风破浪,挫则逆流而上
展开
-
java读取整个文件输出字符串的三种方式
直接上代码:File file = new File("file_path");//method 1String str = FileUtils.readFileToString(file);System.out.println(str);//method 2FileReader fileReader = new FileReader(file);BufferedReader...原创 2020-03-02 23:29:46 · 6468 阅读 · 0 评论 -
java实现链表反转的三种方式
分别通过栈、递归、指针的方式实现:import java.util.Stack;public class ReverseLinkedList { public static void main(String[] args) { ReverseLinkedList reverseLinkedList = new ReverseLinkedList(); ...原创 2020-01-21 14:19:00 · 1577 阅读 · 0 评论 -
用java探究“2020年有五个神奇的周六”是否很罕见
前两天看到公众号推送的一篇文章,说是2020年有五个神奇的周六:2020年4月4号是周六,6月6号是周六,8月8号是周六,10月10号是周六,12月12号也是周六。这个确实挺有意思,我就写个简单的demo去测试了一下”五个神奇的周六“是否罕见,下面是测试代码(只为图方便,用了Date已经失效的方法,仅供参考) //初始年份1900+120=2020,终止年份=2050 fo...原创 2020-01-05 21:36:02 · 368 阅读 · 2 评论 -
java ArrayList.remove()的三种错误用法以及六种正确用法
java集合中,list列表应该是我们最常使用的,它有两种常见的实现类:ArrayList和LinkedList。ArrayList底层是数组,查找比较方便;LinkedList底层是链表,更适合做新增和删除。但实际开发中,我们也会遇到使用ArrayList需要删除列表元素的时候。虽然ArrayList类已经提供了remove方法,不过其中有潜在的坑,下面将介绍remove方法的三种错误用法以及六...原创 2020-01-01 23:22:13 · 12993 阅读 · 2 评论 -
【java代码美化】使用枚举替换if/else/switch
在开发中我们经常会碰到有些场景,需要根据某个字段的不同含义,去执行不同的逻辑操作,一般我们会倾向于使用if/else或者switch/case的方式,但当字段的含义不断增加,或者各种含义情况都需要执行非常多逻辑的时候,使用if/else/switch会使代码不易维护,且可读性差。那么,使用枚举,将是一种非常好的改善方式。举例:当不同角色去审批员工请假单时,执行的逻辑是不一样的,比如直属小组长需...原创 2019-12-30 13:07:42 · 5415 阅读 · 8 评论 -
java实现http请求的两种方式
本文介绍两种java实现的http请求:使用java原生HttpURLConnection。 使用apache httpClient4.5一、使用HttpURLConnection方式HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便。 比如重访问的自定义,以及一些高级功能等。代码如下:import java.io.BufferedR...转载 2019-12-29 16:02:04 · 1702 阅读 · 0 评论 -
浅拷贝之ArrayList构造函数源码解析/Syste.arraycopy()
上周有朋友问我ArrayList的构造函数ArrayList(Collection<? extends E> c)是浅拷贝还是深拷贝,当时一下子也没反应过来,就写了一个单元测试验证了一下,结果是浅拷贝,代码如下:(浅拷贝的原理可以参考这篇文章《java浅拷贝和深拷贝》) public void testAr(){ List<BeanDemo> b...原创 2019-12-29 15:40:53 · 949 阅读 · 2 评论 -
轻松理解java浅拷贝和深拷贝
原文比较长,我这边精简一下关键知识点,原文地址https://www.cnblogs.com/shakinghead/p/7651502.htmlJava中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。首先,浅拷贝和深拷贝的概念涉...转载 2019-12-16 21:09:00 · 296 阅读 · 0 评论 -
java常见面试题:java为什么是值传递
刚接触java的时候,就被告知,java中都是值传递,作为初学者,不求甚解。直到看到某个博主总结的一句话,才恍然大悟。java中都是值传递,完整的意思是:java中按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。其实大家纠结java到底是值传递还是引用传递,主要是以下四种场景造成的:(例子转载自链接:https://www.zhihu.com/qu...原创 2019-12-10 11:14:57 · 455 阅读 · 0 评论 -
java常见面试题:finalize final finally
目录1.final1.1 final修饰的类1.1.1 特殊的final类-String1.2 final修饰的方法1.3 final修饰的变量2.finally3.finalize1.final用途:可修饰类、方法、变量。1.1 final修饰的类不能被继承,因此该类中的方法都不能被重写。接口及抽象类不能用final修饰。1.1.1 特殊的f...原创 2019-12-09 17:29:59 · 545 阅读 · 0 评论 -
java数组和列表相互转换
1.数组转列表String[] userid = {"aa","bb","cc"};常用方式:List<String> userList = Arrays.asList(userid);注意:Arrays.asList()返回一个受指定数组支持的固定大小的列表,不能做Add、Remove等操作。如果需要做add/delete操作推荐使用下面的方式。推荐方式:List...原创 2019-12-08 23:30:59 · 796 阅读 · 0 评论 -
解决java poi导出excel中文自适应列宽不生效问题
场景:在使用java poi导出excel表格时,设置了自适应列宽格式,但发现导出的单元格中包含中文会导致自适应列宽不生效。excel导出异常效果如下图所示:解决:网上查了原因,大多说是excel是老外开发的,自适应宽度对于数字和字母是准确的,但对中文支持不友好,对有中文的列设置自适应列宽之后,实际列宽是会小一些的。那只能先设置表格自适应列宽,再获取没列宽度,进行手动调整。代码如下...原创 2019-12-05 18:01:23 · 5963 阅读 · 0 评论 -
解决java poi之SXSSFWorkbook导出大数据量时自适应列宽效果异常问题
场景:使用SXSSFWorkbook导出大数据量(百万行)excel报表,表格样式统一使用自适应列宽时,发现导出表头行格式异常,异常情况如下图所示:分析:从导出效果看,应该是忽略了表头数据长度,根据数据内容的长度进行了自适应列宽调整。但是代码中自适应宽度操作是放在导出方法最后的,届时已完成表格数据渲染,理论上应该对所有表头标题数据进行自适应列宽调整。自适应列宽部分代码如下: //自...原创 2019-12-05 17:37:25 · 11022 阅读 · 1 评论 -
java常见面试题:基本数据类型和包装类的全部知识点
本文结构如下:什么是基本数据类型 什么是包装类 两者的区别以及使用场景 什么是自动装箱拆箱 整型常量池1.什么是基本数据类型java 中的对象很多都是朝生夕死的(gc回收),所以一直放在堆中不是很高效。因此为方便基本类型的数据计算,java创造了八种基本数据类型:整型byte, short, int, long, 浮点型double, float, 字符型char, 布尔型bo...原创 2019-12-01 23:43:23 · 424 阅读 · 1 评论 -
【限流算法】java实现漏桶算法
本文实现了一种基本的漏桶算法漏桶算法思想:以固定速率消费请求,漏桶容量固定,每次用户请求都得放入桶中,桶满则拒绝请求或等待。达到平滑网络请求的效果。代码逻辑:线程池每0.5s发送随机数量的请求,每次请求计算当前桶内的水量及剩余容量,请求数量超出当前桶容量,则产生限流。@Slf4jpublic class LeakyBucketLimiter { private Schedu...原创 2019-11-30 20:02:06 · 6997 阅读 · 4 评论 -
【限流算法】java实现redis分布式时间窗口计数器算法
本文实现一种基于java的分布式固定时间窗口计数器算法//每次请求进来,查询一下当前的计数值,如果超出请求数阈值,则拒绝请求,返回系统繁忙提示private long limitFlow(String key) { //Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。设置成功返回1,设置失败返回0 ...原创 2019-11-18 20:37:33 · 3716 阅读 · 0 评论 -
【限流算法】java实现滑动时间窗口算法
本文实现了一种基于java的滑动时间窗口计数器算法滑动时间窗口计数器算法思想:针对固定时间算法会在临界点存在瞬间大流量冲击的场景,滑动时间窗口计数器算法应运而生。它将时间窗口划分为更小的时间片段,每过一个时间片段,我们的时间窗口就会往右滑动一格,每个时间片段都有独立的计数器。我们在计算整个时间窗口内的请求总数时会累加所有的时间片段内的计数器。时间窗口划分的越细,那么滑动窗口的滚动就越平滑,限流...原创 2019-11-18 20:32:02 · 17840 阅读 · 1 评论 -
【限流算法】java实现固定时间窗口算法
本文实现了一种基于java的固定时间窗口计数器算法固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。优点:和令牌桶相比,这种算法不需要去等待令牌生成的时间,在新的时间窗口,可以立即处理大量的请求。缺点:在一个窗口临界点的前后时间,比如时间窗口是1分钟,在59秒和1分01秒同时突发大量请求,极端情况下可能会带来 2 倍的...原创 2019-11-18 20:11:22 · 2877 阅读 · 0 评论 -
【限流算法】java实现令牌桶算法
本文实现了一种基本的令牌桶算法令牌桶算法思想:以固定速率产生令牌,放入令牌桶,每次用户请求都得申请令牌,令牌不足则拒绝请求或等待。代码逻辑:线程池每0.5s发送随机数量的请求,每次请求计算当前的令牌数量,请求令牌数量超出当前令牌数量,则产生限流。@Slf4jpublic class TokensLimiter { private ScheduledExecutorServ...原创 2019-11-18 19:58:35 · 7140 阅读 · 7 评论 -
Java Zip压缩&解压的三种方式
文章内容列表使用ZipFile解压文件 使用ZipInputStream解压文件流 使用ZipOutputStream压缩批量文件说明:本文代码使用的是jdk自带的zip包,如果涉及中文文件名的场景可以使用apache的commons-compress包,代码相差不多,maven依赖如下: <dependency> <grou...原创 2019-10-20 23:25:41 · 9728 阅读 · 5 评论 -
J2EE的表现层、持久层、业务层
为了实现web层(struts)和持久层(Hibernate)之间的松散耦合,我们采用业务代表(Business Delegate)和DAO(Data Access Object)两种模式。DAO模式为了减少业务逻辑和数据访问逻辑之间的耦合,当一个持久曾框架被应用时,该模式将会减少业务对象和该框架之间的耦合,这样我们可以不修改业务对象而选择不同的持久层框架的实现。实际上在DAO模式中包含两种结构模转载 2016-05-22 20:12:22 · 3926 阅读 · 0 评论 -
(String)强制转换、toString()和String.valueOf()的区别
在做项目的时候报出了这个错误:Java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String原因是因为BigDecimal 类型无法强制转换成String类型,在代码中我的写法是(String)BigDecimal,查了网上的资料,其实数字类型转string类型方法有三种:i代表其他类型...原创 2016-11-17 14:14:19 · 7863 阅读 · 0 评论 -
jar包置放在WEB-INF/lib下和通过build path导入的区别是什么
"lib"属于项目的一部分,如果jar是放在“lib”下一般就会默认引入。“build path”下可以从任何位置引入jar包,所以比较灵活。但是有很明显的缺点,就是移植性没有那么灵活。一般构架项目的话都倾向于放lib,这样更方便安全。主要的步骤才是build path!意思是,即使你的包没放在lib目录下,比如我放在桌面,那么我同样可以通过build path把桌面上的jar包通过路径引原创 2017-01-04 22:50:04 · 1819 阅读 · 0 评论 -
解决报错NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
在将web项目由jetty启动转变为使用tomcat容器启动,通过url映射寻找view的时候,会报错NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,从网上查阅了很多资料,试了很多方法,最后发现是缺少jstl的jar包,下载地址在最后,下载jakarta-taglibs-standard-1.1.2.zip这个包,解压缩后将stan原创 2017-01-04 22:55:39 · 2750 阅读 · 0 评论 -
web项目由jetty启动转成tomcat启动
跟着视频学习maven搭建spring mvc框架,视频里面启动项目用的 是jetty,我想把它转变成,在本地tomcat上跑的web项目。首先右键项目选择properties-选择project facets,右侧勾选Dynamic Web Module,Version选择3.0(我的tomcat是8.0),java的版本是本机的jdk1.7,勾选JavaScript,版本选择1.0,点击A原创 2017-01-04 22:32:17 · 9631 阅读 · 11 评论 -
java获取系统时间以及日期格式比较的三种方式
java获取系统当前时间的三种方式:(1) new Date()Date date=new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = formatter.format(date); (2) System.currentTimeMillis()lo...原创 2018-06-12 15:14:31 · 2718 阅读 · 0 评论 -
java多线程和并发的面试问答
Java多线程面试问题1. 进程和线程之间有什么不同?一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。2. 多线程编程的好处是什么?在多线程程序中,多转载 2016-05-21 21:08:12 · 522 阅读 · 0 评论