Java进阶及开发总结
文章平均质量分 60
Java进阶及开发总结
极光雨雨
“芝士”与你分享 ———纳西妲
展开
-
ScheduledThreadPoolExecutor 周期性执行任务的线程池作用,基本使用,使用场景
是Java并发编程中一个非常实用的类,它是包下的一个线程池实现,专为定时或周期性任务执行而设计。它提供了灵活且强大的定时任务调度功能,相比传统的Timer类,它具备更好的并发控制能力和错误处理机制。原创 2024-05-23 16:34:49 · 508 阅读 · 0 评论 -
将字符串内容写入多个文件并加入到zip文件中输出,以及zip输出到 HttpServletResponse
下面是一个简单的示例代码,演示了如何遍历一个字符串集合,为每个字符串创建一个.sql文件,然后将这些文件打包成一个zip文件并导出。请确保在运行此代码之前,您的项目已经正确设置了文件读写权限,并且理解这只是一个基础示例,实际应用中可能需要更复杂的错误处理逻辑。请注意,这个示例假设您已经有了一个包含字符串的集合,以及一个合适的方法来处理文件路径和权限问题。)时,它会生成一个包含单个字符串条目的ZIP文件,并通过HTTP响应发送给客户端,触发文件下载。可以使用Java的IO和Zip相关的API来完成。原创 2024-05-20 17:25:01 · 286 阅读 · 0 评论 -
Java jstat 基本使用 gc 查看,jstat -gcutil等
jstat(Java Statistics Monitoring Tool)是JDK自带的一个命令行工具,用于监视Java虚拟机(JVM)的各种运行时性能统计信息,如垃圾收集、内存使用情况等。它允许用户无需附加到目标Java进程中,即可查看诸如堆内存、方法区、垃圾收集器活动等详细统计数据。这对于分析Java应用的性能问题和调优特别有帮助。使用jstat时,你可以指定不同的选项来查看不同类型的统计信息。原创 2024-04-30 17:13:01 · 1031 阅读 · 2 评论 -
Java jstack线程分析工具的使用,jps 使用等
jstack是一个强大的命令行工具,用于分析 Java 应用程序的线程堆栈信息。下面是使用jstack。原创 2024-04-30 16:40:35 · 821 阅读 · 1 评论 -
spring DisposableBean作用,在spring Bean销毁时的钩子 以及@PreDestroy
在Spring框架中,DisposableBean是一个接口,它定义了一个单一的方法,用于在Spring容器关闭时或一个由Spring管理的Bean不再需要时执行特定的清理操作。DisposableBean接口在Spring框架中用于定义Bean的销毁逻辑,允许开发者在Bean生命周期结束时执行必要的资源释放、清理工作,以保证应用程序的健壮性和系统资源的有效管理。在Spring的XML配置文件中,可以直接为某个元素指定一个destroy-method属性,其值为Bean类中需要在销毁时调用的方法名。原创 2024-04-24 16:48:26 · 830 阅读 · 0 评论 -
什么是悲观锁,乐观锁,举例和适用场景,悲观锁实现
乐观锁的情况下当我们查询和修改数据时都不会去做限制,只有当我们需要提交本次修改的时候需要检查当前的记录的这个标识字段是否和我们刚拿到时一样,例如刚开始拿到本条数据的时候 version 为 1,准备提交修改的时候也为1,那么就没有人动过,我们就可以执行更新操作,并将该字段加 1。但悲观锁的开销是固定的,即使再多的请求也一样,但乐观锁不同,由于乐观锁的反复重试的机制,当竞争非常激烈的情况下,会消耗大量算力和资源,最终整体的性能和速度反而会降低。原创 2024-03-15 11:21:52 · 1060 阅读 · 0 评论 -
Java 批量执行某一动作,添加进度条查询接口思路和要点记录
来存放所有提交记录的唯一标识的作为 map 的 Key put 入内,并将执行的结果作为对应 key 的值,也就是结果,成功的则更新对应标识key put 为成功,异常的为失败,依旧还在进行中的为执行中。即第一步全部发起成功,然后提供第二个接口来查询之前的提交的内容的执行进度。对列表执行大批量的提交,或者发起流程等,由于时间较长而需要发起异步操作。原创 2023-11-14 16:53:53 · 249 阅读 · 0 评论 -
分布式锁的三种实现方式 学习总结
数据库分布式锁,redis 缓存分布式锁,zookeeper 分布式锁原创 2023-07-17 13:55:53 · 727 阅读 · 0 评论 -
JAVA POI excel 添加下拉字典的方式与案例 以及图文详解及个人理解
由于向单元格(cell)中写入数据时需要先指定行,但行需要先创建出来才能继续,所以这里我的思路是取出字典值最多的一项,并在字典值最长的长度上加 3 (这里加3只是为了兼容第一行的标题行和额外两行作为容错行)做为要创建的行数。二、如果给定的字典值数量以及关联原有列的位置这些都是会改变的,那么就是第二种比较复杂的场景,变量增多计算增多,但这样的代码也有更强的兼容性,但理解需要一定时间。这里我们一般的范围是某一列都需要,在每一行都是这一列,如果你的列是固定的那么直接指定固定的列所在索引即可,在我定义的类。原创 2023-05-30 16:41:30 · 2977 阅读 · 3 评论 -
Arthas 接口性能定位学习总结
阿里开源的线上调试工具,可以做到代码性能监控,查看 JVM的实时运行状态, 代码反编译查看线上代码 等等Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断Arthas 官方文档首先需要有 Arthas 以及具备 Java 环境变量即可trace 方法内部调用路径,并输出方法路径上每个节点耗时 注意空格不要丢了 输入完成后回车,然后在页面或者其他方式触发对应的请求 请求结束后会出现每一行的用时原创 2022-07-07 16:45:09 · 670 阅读 · 0 评论 -
Arthas tt -t , tt -i 以及 watch相关使用理解 解析入参和结果等
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。原创 2023-01-04 16:43:23 · 3468 阅读 · 0 评论 -
Java Stream 与 CompletableFuture 连用示例及代码分析
Stream对于一般集合的流式处理,简化代码的书写复杂的。介绍文章 链接封装的多线程处理方式,可以替代一般的 ExecutorService 执行任务,同时提供多种方法应对多线程场景。介绍文章 链接。原创 2022-12-17 16:17:51 · 1669 阅读 · 0 评论 -
Java中Stream的 flatMap 与 map 实际使用场景与区别对比
一般用于对List 中的每一个元素执行指定方法使得最终结果为最终的集合为每一个记录的某一属性的集合(get 方法)或者通过自定义的转换方法等通过方法的加工将每一个元素处理为另一种元素最终返回成为一种全新元素的集合,如果我们处理一个人的List 集合,并想把所有人的 服装List 合并到一起时就可以使用 flatMap。Stream 流式操作,一般用于操作集合即 List 一类的数据结构,JDK 1.8 后的新特性。Stream 的 map 使得其中的元素转为另一种元素的映射(map)方法。原创 2022-12-17 14:24:06 · 1431 阅读 · 0 评论 -
BeanMap 使用及简单介绍
默认的键集是 所有属性名称(getter或setter)的联合。尝试设置 只读属性将被忽略,而只写属性将作为null返回。删除对象不是支持(密钥集是固定的)。来源于spring 框架,可以将一般的类转为 Map 结构存储。实现了Map 所以Map 的一些方法也可以使用。基于Map的JavaBean视图。重点看示例类的 toMap 方法;原创 2022-12-12 16:20:05 · 2450 阅读 · 2 评论 -
Java guava框架 LoadingCache,CacheBuilder 本地小容量缓存框架学习以及总结
主要是一种将本地数据缓存到内存中,但数据量并不能太大,否则将会占用过多的内存,虽然框架本身已经做了相当的数据回收,但还是不可以滥用,需要符合以下优点场景,才是合适使用,访问内存的速度快于访问 redis 等数据库。对性能有非常高的要求愿意消耗一些内存空间来提升速度预计到某些键会被多次查询缓存中存放的数据总量不会超出内存容量关键有频繁访问的数据,且这些数据本身占用内存量很少,将这些数据存储到该缓存框架中管理以提供性能。:缓存的初始数据容量大小,一般要贴合实际否则会造成资源浪费。原创 2022-10-24 17:38:38 · 5559 阅读 · 0 评论 -
Java @PreDestroy 注解的使用
与相对应@PostConstruct 用于初始化动作,功能类似代码块或静态代码块@PreDestroy 与 @PostConstruct 相反,为程序环境整体结束前执行的动作源码给出的注释说明如下:PreDestroy注释在方法上用作回调通知,以表示实例正在被容器移除。带有PreDestroy注释的方法通常用于释放它一直持有的资源。除了Java EE 5中的应用程序客户端容器之外,所有支持PostConstruct*的容器管理对象都必须支持此注释。原创 2022-10-21 11:01:41 · 3984 阅读 · 0 评论 -
Java 主动从当前线程获取异常信息的方式
在单个方法内主动捕获异常,并将异常的错误栈信息以日志的方式打出来。原创 2022-10-13 14:03:29 · 525 阅读 · 0 评论 -
Java 一般列表排序,stream sort 排序的使用总结以及案例
Stream// 按照Pid 排序 默认升序 List < PersonVO > collect = list . stream() . sorted(Comparator . comparing(PersonVO :: getPId)) . collect(Collectors . toList());原创 2022-09-24 17:31:50 · 4948 阅读 · 0 评论 -
Java CountDownLatch 学习总结
同为 java.util.concurrent 下的,即也是并发多线程相关下的类,直译 “倒计时锁存器”,一般用于多线程场景,单一的线程也可以,用于等待多个任务完成后再执行其他操作;就是当使用了这个方法后当前这一个线程将进入等待状态,直到计数器被减到0或者当前线程被中断,计数器被减到0后,所有等待的线程将被唤醒继续向下执行。同上,但是指定了等待的超时时间,即线程除了上方两种被唤醒的情况下,等待到超时时间后也会被唤醒。则抛出{@link InterruptedException},并清除当前线程的中断状态。.原创 2022-08-29 15:51:39 · 1234 阅读 · 0 评论 -
Java8 CompletableFuture runAsync等使用学习总结 submit() execute()等
返回的CompletableFuture是多个任务都执行完成后才会执行,只要有一个任务执行异常,则返回的 CompletableFuture 执行get方法时会抛出异常,如果都正常执行,则get返回null。指定某个任务执行异常时执行的回调方法,会将抛出异常作为参数传递到回调方法中,如果该任务正常执行则 exceptionally方法返回的CompletionStage的result就是该任务正常执行的结果。当某个任务执行完成后执行的回调方法,会将执行结果或者执行期间抛出的异常传递给回调方法。原创 2022-08-25 19:02:30 · 4067 阅读 · 0 评论 -
Java AtomicInteger 学习以及理解
然而,这个类确实扩展了{@code Number},允许处理基于数值的类的工具和实用程序进行统一访问。这个类在我看来实现了一个数字自增和自减的一个类,由于有初始的创建值,因此如果不做其他处理额外处理的话,每次重新启动那么这个初始值都会被初始化,重新递增。经过一些资料的查询和确认,该类更多的是用在多线程场景,或校验保证操作的原子性,原子性,即唯一一个,保证只有一个可操作对象。否则不予赋值,返回是否一致的 布尔值。在实际使用时可能有多个这个样的计数器,例如JDK 内部对线程的生成名做区别则如下使用。原创 2022-08-25 15:03:11 · 710 阅读 · 0 评论 -
Java 线程池手动创建示例及自我理解的解读 ThreadFactory手动创建示例
第一种方式:lambda构建方式为:运行后第二种,仿照源码的方式创建:可以参考源码中默认工厂的创建方式,查看路径如下:进入再进入 new 的类可见自己创建一个工厂时需要实现 ThreadFactory 的接口做部分解读如下:= null)?return t;} }原创 2022-08-25 14:03:28 · 987 阅读 · 0 评论 -
Java线程任务 创建一个单独的任务线程并提交到线程池中执行 案例
awaitTermination() 作用即: 阻塞,直到所有任务在 shutdown 请求后完成执行,或发生超时,或当前线程中断,以先发生的为准。在未来的某个时间执行给定的命令或任务,可能在一个新的线程中执行,也可能在一个线程池中执行,或在调用的线程中执行,这由 Executor 的实现决定。此时结果依旧一致 但是 main 方法没有停止运行,依旧处于运行中,添加 shutdown() 后其实任务已经停止。可见 awaitTermination() 作用与JDK 接口描述的一致 其实并不是必须的。原创 2022-08-23 14:17:54 · 1750 阅读 · 0 评论 -
JVM关闭与关闭钩子 Runtime.getRuntime().addShutdownHook() 作用以及相关注意事项
即在 JVM 关闭前的最后一些收尾操作,但是也需要注意一些使用事项。原创 2022-08-22 16:01:05 · 710 阅读 · 0 评论 -
Java Map.forEach 用法示例
一般集合 List ,set 之类的直接使用 foreach 即循环遍历时,直接for 循环list 内每一个单个对象即可,对于Map 同时遍历key 与 value 除了一般的 entrySet , keySet ,迭代器等等,Map 同样支持 for的增强 for 循环。原创 2022-08-22 11:29:49 · 12246 阅读 · 0 评论 -
Java 任意class类型判断及使用场景 getName() getCanonicalName() getSimpleName() getTypeName() isAssignable()
可以看的出,只要判断的是一般的类那么只要保证标红的方法使用一致那么就可以保证类型的判断正确,如果需要判断入参为某一个类的子类那么使用 isAssignableFrom(子类对象.class) 即可。任意一个对象 Java 都有它自己的类,例如一般的字符串对象都给与了 String 这个类,而对于定义类 Class 本身也是拥有着自己的类定义和通用的方法。返回Java语言规范定义的基础类的规范名称。如果此类对象表示数组类,则名称的内部形式由元素类型的名称组成,前面是一个或多个字符,表示数组嵌套的深度。原创 2022-08-19 17:34:46 · 2447 阅读 · 0 评论 -
isAssignableFrom 与 instanceof
instanceof 关键字是判断是否某个类的子类 直接判断当前对象,而当前对象不一定是 class,可以是任何对象类,可以是自己定义的类的对象。isAssignableFrom() 判断当前类是否为某个类的父类 对象为当前类 即 class。isAssignableFrom() 从类继承的角度去判断。instanceof 关键字是从实例继承的角度去判断。为 class 具备的方法。(子类.class)...原创 2022-08-18 18:14:48 · 202 阅读 · 0 评论 -
Collections unmodifiableCollection,emptyList,singletonList 介绍以及总结
通过JDK Collections 自带提供的 unmodifiableCollection() 可以直接通过 arrays.aslist的方式直接构造该一个该对象,从字面意思理解就是这是一个不可修改的集合,即通过这样方式创建出来的内容只能执行一般的查询操作不支持 任何类似 add remove 等修改操作,否则直接抛出 不支持的操作异常。获取的均是不可修改的内容,满足了最常见的使用场景,即确定了长度的集合,长度为1的集合,空集合。:如果需要操作可以使用一般的 ArrayList 等的构造函数去转换。..原创 2022-08-15 11:27:21 · 305 阅读 · 0 评论 -
Jackson @JsonIgnoreProperties(ignoreUnknown = true) 作用和使用场景
在 JSON 使用 util 转为实体类的过程中可能出现 json 中的属性多于或者少于 要转换的实体,一般情况下在 json 中属性少于 要转换的实体时并不会出现问题,但当出现属性多于要转换的实体的时如果不添加此注解则会直接抛出异常,故此注解用于对实体转换的兼容保护。用于一般的 JSONUtil 将 json 串转为 指定的类实体。(当指定的类使用了注解。则 StartBusDTO 的实体如果添加了注解。指定的 json 为 jackson。...原创 2022-08-08 16:49:58 · 2596 阅读 · 0 评论 -
ThreadLocal 的作用和使用方式学习总结(内存泄漏以及内存溢出的概念)
ThreadLocal 作用一般创建的每一个变量所有线程均可以访问和修改,为了实现每一个线程有自己独有的变量,ThreadLocal 就可以用来解决这种问题自己的理解:相当于在一个类中定义了一个独有的线程 static final,这个线程中存储了独有的变量 和数据,相当于某一个类下的全局变量容器,可以存放一些想要的数据,不论是主线程还是其他线程在 执行过程中访问到的都是相同的内容,一旦修改,那么所有访问到这个线程的内容也都将更改。但 ThreadLocal 如果使用不当会造成内存泄漏的问题,内存原创 2022-05-24 09:49:00 · 562 阅读 · 0 评论 -
Java Junit注解 @Test @Before @After @BeforeClass @AfterClass 学习以及实践总结
@Test方法为只能为 public void 不能私有,不能有返回值,不能为静态方法。用于测试运行某一方法,加上 static 后方法无法执行,而且 不能有返回值,否则直接报错java.lang.Exception: Method xxxxxxx() should be void私有时会报错java.lang.Exception: Method xxxxxxx() should be public@Before方法为只能为 public void 不能私有,不能有返回值,不能为静态方法。在原创 2022-05-20 16:22:48 · 1255 阅读 · 0 评论 -
Java Optional 理解以及个别使用案例
Optional直译:可选择的用于对一个对象的包装,直接作用是协助对对象的 null 判断,也就是用来对对象的null 的包装,如果有值就是本身,为null 时 Option 的对象的 Value 为null来源于 JDK 1.8时的新特性,当然现在也有其他被其他公司或者开源组织完善后的 Optional实际尝试静态类直接提供的方法有三种Optional.of(arg)Optional.empty()Optional.ofNullable(arg) Optional<I原创 2022-05-18 17:38:42 · 400 阅读 · 0 评论 -
Java 对象序列化和对象反序列化学习总结 (IDEA 开启序列化快捷补全)
对象序列化将对象转为字节序列的过程称为对象的序列化对象反序列化将字节序列转为对象的过程称为对象反序列化用途将对象字节序列保存到硬盘上,放到某一个文件中。或者在网络上传输对象的字节序列。使用场景让对象离开内存空间,减少对内存的占用,长久的保存到硬盘当中,需要时再还原对象到内存中。例如web中的Session 对象当上万的并发访问时就可能产生上万的 session 对象(如果没有使用其他手段对项目进行调优或者分流访问),上万的对象放到内存中对内存的占用是很大的,很浪费资源。两个进程远程通信,互原创 2022-05-18 11:32:15 · 549 阅读 · 0 评论 -
Java Stream map, Collectors(toMap, toList, toSet, groupingBy, collectingAndThen)等学习和使用理解及案例
.map 方法原创 2022-05-17 17:17:22 · 1772 阅读 · 0 评论 -
主线程与一般线程共用一个或多个对象造成的问题
示例 public static void main(String[] args) { MyPerson myPerson = new MyPerson(132, "noName"); Thread thread = new Thread(()-> System.out.println(myPerson.getId() + "11111")); thread.start(); myPerson.setId(315);原创 2022-05-17 10:16:56 · 243 阅读 · 0 评论 -
Java 内存溢出 java.lang.OutOfMemoryError: java heap space
heap 堆原因:一次性从数据库获取到大量数据放到了内存中,默认内存大小并放不下导致溢出;内存已经达到了当前规定的最大值,无法申请新的内存导致报错,旧的对象(认为)无法回收;等等解决方式最直接的方式是修改JVM 内存大小JAVA_OPTS="-server -Xms1024m -Xmx1024mXms 为初始值,Xmx 为最大值,二者最好保持一致 这样可以保证稳定性做代码优化,看是否存在大量数据获取后未使用的情况,是否存在很深的递归调用,大量数据执行操作时是否可以分开做小批量持续操作,数原创 2022-05-14 13:02:45 · 416 阅读 · 0 评论 -
Java 枚举 ordinal 使用以及介绍
介绍ordinal 用于获取当前枚举在定义时的索引, 从 0 开始 依次累加,当做一些状态存储时,使用状态的索引顺序来代表莫一个状态,例如 一个枚举中定义了 oneDay, twoDay, threedDay 使用 ordinal 获取时分别值为 0,1,2 即存储的 0,1,2 分别代表了上面的三个枚举。示例枚举定义:public enum TaskExportEnum { RUNNING("调度中"), FINISH("已完成"), FAILED("失原创 2022-03-15 15:18:33 · 5032 阅读 · 0 评论 -
多线程 业务中最简单的开启异步线程的方式示例
目的在业务代码中,需要某一部分代码与主线程分离,即一部分的操作将交给另一个线程去完成,主线程中的代码继续向下执行。也就是所说的异步操作方式示例在某方法的内部// ------其他业务代码Thread thread = new Thread(() -> doAnotherThings());thread.start();// start 后主线程将继续向下执行,不会等待 thread 中的其他业务代码的完成// ------继续其他业务代码doAnotherThings 为你定义原创 2022-03-08 18:49:31 · 1033 阅读 · 0 评论 -
JPA 注解 @MappedSuperclass 意义及作用
使用场景JPA 方式基于代码复用和模型分离的思想使用JPA的 @MappedSuperclass 注解将实体类的多个属性分别封装到不同的非实体类中。例如,数据库表中都需要 某些字段,例如创建时间,更新时间,有效标识,id等等那么使用一个父类来封装这些通用属性,并用@MappedSuperclas标识该类,作为父类,让其他子类继承。特殊点:添加注解 @MappedSuperclass 的类将不是一个完整的实体类,不会映射到数据库表中,即不会创建它对应的表,但是其属性都将映射到其子类的数据库字段中原创 2022-03-01 17:08:41 · 776 阅读 · 0 评论 -
Java POI 设置所有列的默认行宽示例
示例// 生成工作簿(XSSFWorkbook对应的是xlsx格式的文件,HSSFWorkbook对应的是xls格式的文件)XSSFWorkbook wb = new XSSFWorkbook();// 生成sheetSheet sheet = wb.createSheet();// 设置默认行宽 这里我设置了 22 大概是默认一般9-10个文字左右的宽度sheet.setDefaultColumnWidth(22);...原创 2022-02-25 15:25:04 · 868 阅读 · 0 评论