随笔分类 - Java知识学习
摘要:一、问题引子:执行顺序 public static int test1() { int x = 1; try { return x; } finally { x = 2; } } 答案是1不是2,你答对了吗?大家都知道在TCF中,执行到return的时候会先去执行finally中的操作,然后才会返回
阅读全文
摘要:Java自定义注解的简单介绍就不说了,这里主要说一下自定义注解 aop 切面的使用。 一、什么是AOP? 1、AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。 AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构。AOP最早由AOP联盟的组织提出
阅读全文
摘要:API开发中经常会遇到一些对请求数据进行验证的情况,这时候如果使用注解就有两个好处: 1、一是验证逻辑和业务逻辑分离,代码清晰 2、二是验证逻辑可以轻松复用,只需要在要验证的地方加上注解就可以 因此,我们在业务开发过程中经常遇到形形色色的注解(Java提供了一些基本的验证注解,比如 @NotNull
阅读全文
摘要:项目中遇到的问题的结论,具体现象就不描述了,通过查资料,就是知道一点就行:缓存、事务、异步不能同一个类中相互调用,会失效(只能在别的类里调用)。具体问题描述我们直接看网上的文章吧。 一、同一个类中方法调用,导致@Transactional失效 一、问题现象 开发中避免不了会对同一个类里面的方法调用,
阅读全文
摘要:一、Java 使用 AES 步骤解析 AES是一种对称的加密算法,可基于相同的密钥进行加密和解密。Java采用AES算法进行加解密的逻辑大致如下:(1)生成/获取密钥;(2)加/解密。 (一)关于密钥步骤 1、生成密钥 密钥的生成是通过KeyGenerator来生成的。通过获取一个KeyGenera
阅读全文
摘要:一、问题背景及原因分析 需求对保密性要求严格点,就用的 AES + 盐值 + 偏移向量 去做,前端加密传递参数,Java 解密参数,然后查询数据,得到数据后再将数据加密返给前端,前端最对数据进行解密,得到具体数据使用。 在此过程中发现偶尔使用 Java AES 解密前端传递的参数时会报这个异常,如下
阅读全文
摘要:一、问题背景 1、问题报错:How to fix "Cannot read JPEG2000 image: Java Advanced Imaging (JAI) Image I/O Tools are not installed" 我正在建立一个java项目,使用pdfBox从PDF中获取图像。因
阅读全文
摘要:经常听说“不使用的对象应手动赋值为null”,但是要问原因,大都回答“有利于GC更早回收内存,减少内存占用”,但再往深入问就回答不出来了。所以这里做一点深入研究。 一、将对象赋值为null,对垃圾回收有用吗? 网上很多java性能优化里都会有这么一条:尽量把不使用的对象显式得置为null,这样有助于
阅读全文
摘要:一、为什么需要 Stream —— 分库分表之后大数据需要合并,传统方式效率不理想 现在很多大数据量系统中都存在分表分库的情况。例如,电商系统中的订单表,常常使用用户ID的Hash值来实现分表分库,这样是为了减少单个表的数据量,优化用户查询订单的速度。但在后台管理员审核订单时,他们需要将各个数据源的
阅读全文
摘要:一、Java 8 Stream 介绍 Java8 API 添加了一个新的抽象称为 流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream 这种风格将要处理的元素集合看作一种
阅读全文
摘要:Optional 是 Java 8 引进的一个新特性,通常用于缓解常见的空指针异常问题。Brian Goetz (Java语言设计架构师)对Optional设计意图的原话如下: Optional is intended to provide a limited mechanism for libra
阅读全文
摘要:一、Java8 之前时间存在的问题 Java 8 (又称为 jdk1.8) 是 Java 语言开发的一个主要版本,它支持函数式编程,新的日期 API,新的Stream API 等。Java 8通过发布新的 Date-Time API (JSR 310) 来进一步加强对日期与时间的处理。在旧版的 Ja
阅读全文
摘要:一、方法引用 若Lambda体中的内容已经有方法实现过了,我们可以使用方法引用,使用方法引用的时候需要保证引用方法的参数列表和返回值类型与我们当前所要实现的函数式接口方法的参数列表和返回值类型保持一致。方法引用是Lambda表达式的另外一种表现形式。 主要有 3 种语法格式: (1)对象 :: 实例
阅读全文
摘要:在前面一篇文章中简单介绍了Lambda表达式,我们知道使用Lambda表达式是需要使用函数式接口的,那么岂不是在开发过程中需要定义许多函数式接口?当时我就有这个疑问,每次还需要自定义一个纯函数式接口,也挺烦的。 后来了解到其实不然,Java8 其实已经为我们定义好了4类内置函数式接口,这4类接口已经
阅读全文
摘要:一、Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。 1、语法: (parameters) -> expression
阅读全文
摘要:一、对象的创建过程 关于对象的创建,第一反应是 new 关键字。Student stu =new Student("**","18");就拿这句代码来说: 1、虚拟机首先会去检查Student这个类有没有被加载,如果没有,首先去加载这个类到方法区。 2、然后根据加载的Class类对象创建stu实例对
阅读全文
摘要:一、JVM 堆溢出 在 jvm 运行 java 程序时,如果程序运行所需要的内存大于系统的堆最大内存(-Xmx),就会出现堆溢出问题。创建对象时如果没有可以分配的堆内存,JVM就会抛出OutOfMemoryError:java heap space异常。 // 执行该段代码需要大于10m内存空间 p
阅读全文
摘要:一、HttpServletRequest对象 HttpServletRequest对象:用来接收客户端发送过来的请求信息,例如:请求参数,发送的消息头信息等都属于客户端发来的信息。 1、常用方法:记几个常用的,其他需要用的时候 idea 会有提示 getRequestURL() :获取客户端发出请求
阅读全文
摘要:在多线程环境下ArrayList是线程不安全的,所以需要使用线程安全的List,我第一时间使用的是Collections.synchronizedList(new Arraylist<>()),但是在实际使用过程中却发生了安全事件。 一、使用Collections.synchronizedList(
阅读全文
摘要:一、Collections.synchronizedList 实现原理及如何做到线程安全 大家都知道ArrayList并不是线程安全的,如果想要做到线程安全,我们可以使用 Collections.synchronizedList, 但是使用 Collections.synchronizedList后
阅读全文