![](https://img-blog.csdnimg.cn/20201125093809246.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java基础
文章平均质量分 56
java基础,io流相关
逍遥大俠
这个作者很懒,什么都没留下…
展开
-
纯java后台生成带ECharts的PDF文档(phantomjs)
一、需求没有HTML预览页面,要求前台提交数据后,在服务端生成一份带ECharts图表的PDF文件二、分析存在以下几个难点:1、没有浏览器,怎么渲染生成ECharts图并且放到PDF中2、后台生成PDF的方案比较少,怎么保证样式,同时要有可维护性解决方案:1、直接生成PDF局限性较大,可以先生成word,再转PDF2、寻找一个工具,可以把ECharts转成图片,插入到word中三、实现这里我以生成一个简历PDF为例1、word的生成采用POI-TL转为模板官网地址:http://d原创 2022-06-04 11:40:06 · 3836 阅读 · 10 评论 -
springboot项目中,JSESSIONID互相覆盖问题
一、现象同一台服务器有两个不同域A(端口:9000)和域B(端口:8000),应用CA在域A中,应用CB在域B中,都使用session保存登录状态,进行如下操作在同一浏览器中,先登录应用CA,再登录应用CB,然后切回应用CA,发现CA的session丢失,需要重新登录经过调查发现,切回CA的时候,JSESSIONID被覆盖成了请求CB的JSESSIONID二、原因因cookie冲突导致session丢失三、原理1. session原理我们在保存登录状态的时候,后台服务一般都会编写如下代码原创 2022-01-14 15:34:11 · 3739 阅读 · 14 评论 -
前后端分离,前端获取文件流下载文件
一、 GET1. 后端接口@GetMapping("/test")public void testGet(HttpServletResponse response) throws IOException { FileInputStream in = null; ServletOutputStream out = null; try { in = new FileInputStream("/Users/weiliangchun/Downloads/test.png原创 2021-12-08 11:10:24 · 5403 阅读 · 0 评论 -
使用多线程并行处理任务,提高效率
案例详解电商app中,商品详情页,开发一个接口提供以下信息商品基本信息(名称、价格、库存等)商品图片列表商品描述信息数据库中我们用了3张表存储上面的信息商品基本信息表:t_goods(字段:id、名称、价格、库存等)商品图片信息表:t_goods_imgs(字段:id、goods_id、图片路径等)商品描述信息表:t_goods_ext(字段:id、goods_id、描述信息等)常规写法,伪代码如下:public Map<String,Object> detail(l原创 2021-11-17 14:39:21 · 1732 阅读 · 2 评论 -
java多线程遍历处理list集合
开发过程中经常遇到如下需求,拿到一个list数据,需要遍历它然后请求第三方接口,然后根据返回结果做一些事常规写法public static void main(String[] args) { List<User> list = getList(); test1(list);}//假设有500条数据static List<User> getList() { List<User> list = new ArrayList<>(原创 2021-11-08 21:50:49 · 9662 阅读 · 4 评论 -
linux安装jdk
1. 下载jdk8官网下载2. 解压下载好的文件上传到服务器 /usr/local目录(软件一般安装到这个目录,你也可以安装到自己的目录)使用解压命令解压tar -zxvf jdk-8u311-linux-x64.tar.gz3. 配置环境变量编辑/etc/profilevim /etc/profile加入以下内容export JAVA_HOME=/usr/local/jdk1.8.0_311export JRE_HOME=${JAVA_HOME}/jreexport CLAS原创 2021-11-05 16:58:56 · 80 阅读 · 0 评论 -
基于springboot的maven父子工程脚手架
github直接自取:project-managermaven父子工程,api模块采用springboot1. 工程说明1.1 适用场景同一套数据模型,需要开发手机端、运营管理端等几套api,存在公共的实体类,mapper接口,并且项目需求较为简单,不需要采用微服务架构1.2 技术框架该工程整体技术框架为springboot + mybatis-plus + mysql,在此基础上,保留了以下配置一些必要的工具:fastjson、hutool-all、lombok、spring-boot-原创 2021-11-04 20:12:07 · 339 阅读 · 0 评论 -
java代码修改yml配置文件
背景参加一个比赛,测评程序每次在测试的时候,都是随机分配3台服务器,IP地址不固定。程序提供一个接口,每次测评开始前会传过来3个IP地址,需要动态修改yml配置文件中程序连接的redis集群节点添加依赖<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId></dependency>修改文件的工具类package co原创 2021-09-06 13:54:23 · 5259 阅读 · 1 评论 -
MySQL根据某个字段判断新增或更新
有一个 USER表,字段有:id、username、password、email、phone我们需要开发一个创建用户接口,username唯一,判断username是否存在,如果存在,就更新,不存在,就新增看一下正常代码// 创建用户public void createUser(User user) { User userInfo = this.getUserByName(user.getUsername()); if (null != userInfo) { use原创 2021-07-16 15:16:36 · 4234 阅读 · 0 评论 -
HashMap为什么是线程不安全的
前言面试常常被问到HashMap为什么是线程不安全的。今天从源码分析为什么不安全JDK1.7版本不安全体现在死循环、数据丢失、数据覆盖问题上。JDK1.8版本修复了前两个问题,但是依然存在数据覆盖问题。JDK1.7中的线程不安全1.7中的不安全主要发生在扩容方法,根源在transfer()方法,1.7版本的transfer()方法如下:void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.l原创 2021-07-07 21:37:23 · 203 阅读 · 1 评论 -
java死锁怎么排查
什么是线程死锁死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下,这些线程会 直相互等待而无法继续运行下去。如图所示在图中,线程A已经持有了资源2, 同时还想申请资源1,线程B已经持有了资源 1,它同时还想申请资源2 ,所以线程A和线程B就因为相互等待对方已经持有的资源,而进入了死锁状态。死锁的必要条件互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待原创 2021-04-09 21:03:00 · 134 阅读 · 0 评论 -
HashMap源码分析
HashMap是我们日常编码中经常用到的一种集合,也是面试的高频问题。作为一个合格的码农,它的一些常用方法的底层源码,应当要能掌握今天带大家一起阅读下HashMap的源码,分析它的底层实现原理。本文的源码是基于JDK1.81. 数据结构这里简单介绍下,在1.8之前,HashMap数据结构是基于数组+链表,左边为哈希数组,当发生哈希冲突的时候(就是有2个元素,根据内部的哈希运算,得到在数组上的位置是一样的),就把元素放到链表中在1.8之后,是基于数组+链表+红黑树,在链表长度超过某个阈值的时候,链表原创 2021-03-31 23:38:41 · 177 阅读 · 1 评论 -
transient关键字作用
用java这么久,竟然发现不知道transient关键字的作用总的来说:transient修饰的关键字不会被序列化一、序列化和反序列化名词解释序列化:把java对象写入到I/O流 ,即把java对象转换为字节序列,并将字节序列保存在磁盘上,或通过网络传输反序列化:从I/O流中恢复对象,即把得到的字节序列恢复成java对象序列化的方法实现序列化有两种方法:实现Serializable接口或Externalizable接口二、transient的作用一旦变量被transient修饰,变量原创 2021-03-19 17:28:12 · 2834 阅读 · 0 评论 -
idea阅读jdk源码环境搭建
此方法可以在源代码写注释,记笔记1、新建项目新建一个普通java项目2、新建文件夹在src目录下新建两个文件夹jdk8:放jdk源码test:放测试的代码3、导入jdk源码jdk源码在哪找呢,在你的jdk安装目录里面,有个src.zip文件拷贝这个压缩包,到刚刚新建的项目的文件夹jdk8下解压,解压后的文件结构4、配置调试环境扩大编译的内存,否则会报内存不足设置方法:Preferences --> Build,Execution,Deployment -->原创 2021-03-18 16:21:10 · 264 阅读 · 0 评论 -
静态域、静态变量、静态方法
文章目录静态域静态常量静态方法静态域static关键字修饰的域class Employee { private static int nextId = 1; private int id;}这里Employee对象有一个实例域id和一个静态域nextId,每一个Employee对象都有一个实例域id,但是所有的对象共享一个静态域nextId。假设有1000个Employee对象,则有1000个实例域id,但是,只有一个静态域nextId。即使没有一个Employee对象,静态域nextId原创 2021-03-06 10:49:18 · 199 阅读 · 0 评论 -
js获取文件流实现下载功能
后台java代码@RequestMapping(value = "/rest/application/download", method = RequestMethod.POST)@ResponseBodypublic void download(HttpServletRequest request, HttpServletResponse response) { String fileName = "aaa.docx"; FileInputStream fis = null;原创 2020-09-30 12:10:34 · 4581 阅读 · 0 评论 -
使用策略模式优化大量if...else代码
一. 场景假如我们有一个订单业务,根据会员的类型不同,使用if...else判断,然后去执行不同的业务操作,伪代码如下:public class OrderService { public void method(HttpServletRequest req) { //type:会员类型 String type = req.getParameter("type"); if("free".equals(type)) { System.out.println("免费用原创 2020-11-21 10:35:39 · 514 阅读 · 0 评论 -
@Transactional注解为什么要指定rollbackFor
使用阿里巴巴编码规范插件,使用@Transactional注解,如果不加rollbackFor,会提示需要在Transactional注解指定rollbackFor或者在方法中显式的rollback在spring项目中,@Transactional注解默认会回滚运行时异常及其子类.,异常继承体系如下图从图中可以看出,RuntimeException是Exception异常的子类所以如果发生了Exception异常,spring就不会帮你回滚了解决办法@Transactional(rollback原创 2020-10-16 09:50:12 · 9920 阅读 · 0 评论 -
聊聊ArrayList的扩容机制
一、构造函数原创 2020-08-31 20:41:42 · 257 阅读 · 1 评论 -
Arrays.asList()的一些注意事项
1. 简介我们在开发中,经常用Arrays.asList()把一个数组转成一个List集合String[] arr = {"a", "b", "c"};List<String> list = Arrays.asList(arr);2. 《阿里巴巴Java 开发手册》的描述Arrays.asList()将数组转成集合后,底层依然是数组3. 注意事项3.1 传递的数组必须是对象数组,而不是基本类型。Arrays.asList()是泛型方法,传入的对象必须是对象数组。int[]原创 2020-07-30 11:45:03 · 448 阅读 · 0 评论 -
强引用,软引用,弱引用和虚引用的区别与用法
1. 强引用如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。如:List<String> list = new ArrayList<>();list.add("abc");在list集合里的数据不会释放,即使内存不足也不会2. 软引用软引用,类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就原创 2020-07-29 17:34:40 · 996 阅读 · 1 评论 -
集群模式,如何保证@Scheduled定时任务只执行一次
问题假如我们有一个定时任务,每天凌晨0点,给当天过生日的人,积分加1@Scheduled(cron = "0 0 0 */1 * * *")public void updateScore() { //doSomething...}单主机部署下不会有任何问题。但是如果有多台主机,假设我们有4台,那么这个定时任务就会执行4次,造成积分+4解决方法解决方法有很多种:redis + token,redis + 分布式锁,这里我们采用乐观锁数据库新建一张表:CREATE TABLE `t原创 2020-07-24 23:51:32 · 8861 阅读 · 5 评论 -
Java泛型类型擦除
文章目录1. 什么是类型擦除2. 什么是原始类型3. 类型擦除带来的问题和解决方法3.1 和多态的冲突3.2 不能使用`instanceof`3.3 在静态类和静态方法中的问题1. 什么是类型擦除Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java的泛型是伪泛型,Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包原创 2020-07-21 12:30:13 · 1340 阅读 · 0 评论 -
Java后台list转json的时候,Date类型字段转换的问题
问题:Java后台使用list转json,遇到实体类有Date类型的字段,获取到的日期格式不是我们想要的。如:"businessDate":{"date":9,"day":6,"hours":10,"minutes":36,"month":4,"seconds":51,"time":1588991811000,"timezoneOffset":-480,"year":120}希望得到的结果:"businessDate":"2020-05-0910:36:51"...原创 2020-05-09 18:15:28 · 1181 阅读 · 0 评论