细说Java
春风化作秋雨
学而思,思而学
展开
-
Java使用泛型保证返回参数无需强转
【代码】Java使用泛型保证返回参数无需强转。原创 2023-06-17 18:20:00 · 493 阅读 · 0 评论 -
java 中泛型的三种使用方式
一般被称为静态泛型方法;在 java 中泛型只是一个占位符,必须在传递类型后才能使用。类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。原创 2022-11-03 13:17:04 · 1441 阅读 · 0 评论 -
java 多线程使用 join() 方法让主线程等待
java 多线程使用 join() 方法让主线程等待原创 2022-10-10 16:55:00 · 283 阅读 · 0 评论 -
java中join()方法理解与应用
java中,join()方法的作用是阻塞,即当前线程等待线程结束,才继续执行。线程T1执行至1, 进行中。线程T1执行至2, 进行中。线程T1执行至3, 进行中。线程T1执行至4, 进行中。线程T1执行至5, 进行中。线程T2执行至1, 进行中。线程T3执行至1, 进行中。线程T3执行至2, 进行中。线程T2执行至2, 进行中。线程T2执行至3, 进行中。线程T3执行至3, 进行中。线程T3执行至4, 进行中。线程T2执行至4, 进行中。线程T3执行至5, 进行中。线程T2执行至5, 进行中。原创 2022-10-10 16:25:18 · 467 阅读 · 0 评论 -
java 中静态内部类与普通内部类的区别
注:static修饰的内部类,是一种较为特殊的内部类,Java文档中描述static修饰的内部类:一旦内部类使用static修饰,那么此时这个内部类就升级为顶类。也就是说,除了写在一个类的内部以外,static内部类具备所有外部类的特性,同外部类没有分别。一般之定义和使用静态内部场景:该内部类仅外部类用到,以此减少类文件数量,方便代码维护和管理。2)普通内部类可访问外部类的静态和非静态成员变量和方法(包括私有属性),因其在外部类内部;5)类的内部,可定内部接口,并且可定义一个内部类实现这个内部接口。原创 2022-10-10 10:59:53 · 1733 阅读 · 0 评论 -
java 使用多线程池异步处理不同业务
【代码】java多个线程池分别异步处理不同业务。原创 2022-10-10 09:52:05 · 712 阅读 · 0 评论 -
java 实现线程间通信
thread_A 打印:thread_B已完成自增1,目前num=10,请知晓!thread_B 打印:thread_A已完成自增1,目前num=11,请知晓!thread_B 打印:thread_A已完成自增1,目前num=1,请知晓!thread_A 打印:thread_B已完成自增1,目前num=2,请知晓!thread_B 打印:thread_A已完成自增1,目前num=3,请知晓!thread_A 打印:thread_B已完成自增1,目前num=4,请知晓!thread_A 结束!原创 2022-09-13 15:17:03 · 284 阅读 · 0 评论 -
字符串引用之避坑
2、修改字符串引用对应的对象值,其实是重新初始化了,原来的对象依然存在;如有其他引用指向,则其引用对应的对象不变。1、字符串的特殊性-不可变的对象,只能做为常量,分配在堆内存。原创 2022-09-11 20:29:10 · 205 阅读 · 0 评论 -
Java 两个变量不借用其他变量进行交换
场景:两个变量,无需借助其他变量完成交换。适用:boolean,int等数值类型打印输出:原创 2022-09-11 20:16:34 · 193 阅读 · 0 评论 -
使用Spring序列化工具进行json序列化/反序列化
{"name":"张三 ","gender":"男","age":20}1、针对阿里fastjson安全漏洞频发,经常临时升级乃至不兼容问题。2、使用Spring自身序列化工具进行json序列化/反序列化。User(name=张三 , gender=男, age=20)3、分装成单例的工具类,代码如下。原创 2022-09-11 20:11:01 · 1260 阅读 · 0 评论 -
Java 字符串指定个位置的字符修改操作
【代码】Java 字符串指定个位置的字符修改操作。原创 2022-09-08 15:30:08 · 1189 阅读 · 0 评论 -
Java中去掉字符串中的非中文字符
代码】Java中去掉字符串中的非中文字符。原创 2022-08-08 11:49:08 · 1869 阅读 · 0 评论 -
线程同步注意事项
1、尽量缩小同步的范围,增加系统吞吐量。2、分布式下java提供的同步锁失去意义,须使用分布式锁。3、防止死锁,注意加锁顺序。原创 2022-02-21 10:09:09 · 232 阅读 · 0 评论 -
多线程编程中的原子性、可见性、有序性
原子性、可见性、有序性是多线程编程中最重要的几个知识点,由于多线程情况复杂,如何让每个线程能看到正确的结果,这是非常重要的。1、原子性原子性,是指一个线程的操作是不能被其他线程打断,同一时间只有一个线程对一个变量进行操作。在多线程情况下,每个线程的执行结果不受其他线程的干扰。举例:多个线程同时对同一个共享成员变量 n++ 累计100 次,若 n 初始值为 0,则 n 最后的值应该是 100,所以说它们是互不干扰的,这就是传说的中的原子性。但 n++ 并不是原子性的操作,要使用 AtomicInt原创 2022-02-21 10:04:22 · 1367 阅读 · 0 评论 -
死锁、活锁、饥饿、无锁
死锁、活锁、饥饿,是关于多线程是否活跃出现的运行阻塞障碍问题,若线程出现这三种情况,即线程不再活跃,无法再正常地执行下去。1、死锁死锁,是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。举例:工人A正在使用扳手,需要钳子配合,此时工人B正在使用钳子,需要扳手配合;两人都占用对方的工具,又都在等待对方手中的工具,如此死等下去,任务都阻塞了。此时,需要外力干预才解决,比如A先把把扳手借给B,或者...原创 2022-02-21 09:55:53 · 818 阅读 · 0 评论 -
Callable使用案例
1、两种实现方式import java.util.concurrent.*;public class TestSubmit { public Future<String> welcome1(String name, ExecutorService executor) { System.out.println("方法调用线程名:" + Thread.currentThread().getName()); return executor.submi原创 2021-10-11 21:17:46 · 344 阅读 · 0 评论 -
Java守护线程
1、什么是守护线程Java线程分两种:用户线程和守护线程。守护线程,是指在程序运行的时,后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。守护线程和用户线程的没有本质的区别,不同之处在于虚拟机的离开;若用户线程已全部退出运行,只剩守护线程存在,虚拟机也即退出。 因没有了被守护者,守护线程也就无工作可做,也原创 2021-10-09 15:52:15 · 2076 阅读 · 0 评论 -
ThreadLocal应用实例
1、ThreadLocal工具类import java.util.Random;public class ThreadLocalUtils { public static final ThreadLocal<Object> threadLocal = new ThreadLocal<Object>() { @Override protected Object initialValue() { System.o原创 2021-10-09 15:01:23 · 1593 阅读 · 0 评论 -
Java线程组-ThreadGroup
1、什么是线程组ThreadGroup类是线程组,表示一组线程的集合,可用其对一批线程和线程组进行管理。可把线程归属到指定的线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构类似于树形结构。开发人员创建的所有线程,都属于指定线程组;若没显式指定属于哪个线程组,则该线程就属于默认线程组,即main线程组。缺省情况下,子线程和父线程处于同一个线程组。说明:创建线程时,可指定其归属的线程组;线程运行中,不能改变它的归属线程组;即线程一旦指定所在的线程组就不可改变。2原创 2021-10-09 13:54:59 · 2107 阅读 · 3 评论 -
Java多线程任务分解-ForkJoinPool【带返回值】
1、多线程任务分解实现package threads;import java.util.concurrent.RecursiveTask;/** * 继承RecursiveTask来实现支持返回值的"可分解"的任务 */class CalculateTask extends RecursiveTask<Integer> { //每个任务处理上限 private static final int THRESHOLD = 20; private int a原创 2021-10-09 11:30:56 · 810 阅读 · 0 评论 -
Java对称加密解密方法
1、示例代码package com.picc.common.util.security;import org.apache.commons.collections4.CollectionUtils;import org.apache.commons.lang3.StringUtils;import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.io.UnsupportedEncodingExceptio原创 2021-06-01 23:54:41 · 1473 阅读 · 0 评论 -
java通过反射对任何对象的属性值进行处理
1、代码import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections4.CollectionUtils;import org.apache.commons.lang3.reflect.FieldUtils;import java.lang.reflect.Field;import java.util.HashSet;import java.ut原创 2021-06-01 23:40:56 · 488 阅读 · 0 评论 -
java获取所有类的注解信息
场景:获取所有类的注解,方法的注解,如果是controller获取urlpackage com.picc.vx.portal.util;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annota.原创 2021-04-21 10:43:06 · 3131 阅读 · 0 评论 -
HashMap的负载因子为何默认是0.75
一、负载因子的作用HashMap负载因子,是和扩容机制有关的,意思是如果当前容器的容量,达到了我们设定的最大值,就要开始执行扩容操作。举个例子,比如说:当前的容器容量是16,负载因子是0.75,16*0.75=12,也就是说,当容量达到了12的时候就会进行扩容操作。作用很简单,相当于是一个扩容机制的阈值。当超过了这个阈值,就会触发扩容机制。HashMap源码已经为我们默认指定了负载因子是0.75。截取部分源码,从这里可以看出,系统默认的负载因子值就是0.75,而且我们还可以在构造方法中.转载 2020-11-08 17:47:04 · 6405 阅读 · 7 评论 -
HashMap什么时候出现红黑树
1、出现条件满足:链表长度到8,并且数组长度到64情况一:链表长度到满足8,先尝试转红黑树TREEIFY_THRESHOLD:8如下图所示,判断链表长度到达8调用treeifyBin方法转换红黑树;情况二:校验数组长度满足64MIN_TREEIFY_CAPACITY:64如下图所示,treeifyBin()的方法代码,开头有判断数组长度是否小于64,小于则进行扩容;否则,转红黑树;...原创 2020-11-08 17:24:09 · 4076 阅读 · 0 评论 -
线程池主要参数及作用
1、线程池构造器public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAl...原创 2020-04-20 21:48:14 · 4783 阅读 · 0 评论 -
Java8使用LocalDate 获取日期间隔年、月、日,生日
1、代码package com.myfutech.insure.service.api.util;import org.apache.commons.lang3.time.DateUtils;import java.time.LocalDate;import java.time.ZoneId;import java.time.temporal.ChronoUnit;impor...原创 2020-01-13 14:56:57 · 7877 阅读 · 0 评论 -
Java关键字与标识符
1、Java 关键字1.1、概念java关键字,是java自身的保留字;保留字不能用来定义常量、变量、和任何标识符的名称。1.2、规则java中所有的关键字全部都是小写,程序中的标识符不能以关键字命名。1.3、说明1)java中const和goto是两个保留字关键字,虽存在,但无任何意义,在程序中也是不可以作为自定义的标识符。2)true、false和null不属于关键...原创 2020-01-10 09:58:54 · 348 阅读 · 0 评论 -
图解线程池工作原理
Java五种线程详解:说明:① 所有的使用线程池处理的任务,都是以新的线程处理,与原程序相异步。② 线程不用,减少线程的创建、销毁等的开销。1)newCachedThreadPool作用:可根据需要创建新线程的线程池,历史构造的线程可复用,并在需要时使用ThreadFactory 创建新线程,如上图所示。特征:(1)线程池中数量没有固定,可达到最大值(Interg...原创 2019-12-22 13:31:48 · 487 阅读 · 0 评论 -
Java8新特性stream
1、简要介绍 Java8,新增stream API,它与Java I/O中的流没有关系;此stream,用来处理集合数据,可看成一个高级迭代器;Collection接口中,新增非抽象的stream()方法,用来获取集合的流。 流的操作是内部迭代的,传统开发中使用的for循环、迭代器属于外部迭代。不太理想的是,java8中内部迭代的性能还是略差,有待提升。 特别注意:流...原创 2019-12-12 15:15:22 · 379 阅读 · 0 评论 -
Java通过反射判断对象是否包含属性,获取属性类型和属性值
1、工具类import com.myfutech.employee.service.api.vo.request.candidate.CandidateImportVO;import com.myfutech.employee.service.api.vo.request.employee.EmployeeModifyVO;import com.myfutech.employee.ser...原创 2019-11-13 15:54:40 · 7674 阅读 · 0 评论 -
Java 实现重试机制
1、场景批量给第三方回写数据,失败情况重发2、设计1)异常捕获2)循环重试(包括:重试次数,重试间隔)3、代码package com.retry;/** * @author liuxd * @version 1.0 * @date 2019-11-06 17:36 */import java.util.Random;import java.util.conc...原创 2019-11-06 18:31:17 · 8228 阅读 · 0 评论 -
Java hashCode是什么
1、目的用于对象比较,是一个本地方法,返回的对象的地址值。public int hashCode()2、引入hashCode和equlas的关系1)若两个对象相同(即用equals比较返回true),则它们的hashCode值一定要相同;2) 反之不成立:若两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)学习HashMap...原创 2019-11-06 14:46:52 · 5445 阅读 · 2 评论 -
你真的了解多线程编程吗?
1、多线程有什么用?1)发挥多核CPU的优势,单合并发->多核并行随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运...原创 2019-11-04 17:54:23 · 915 阅读 · 0 评论 -
Java 使用AtomicInteger实现锁,即无锁编程 代码实现
1. 原子操作 多线程并发编程中,容易出现并发安全问题;举一简单的例子,多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到预期的正确值,而这个问题,最常用的方法是通过Synchronized或者ReentrantLock进行控制来达到线程安全的目的。然而,synchronized采用的是悲观锁策略,并非特别高效的一种解决方案。实际上,在J.U.C下的atomic包...原创 2019-11-04 15:37:35 · 1743 阅读 · 0 评论 -
Java NIO 实现多人聊天系统案例
1、NIO简述Java NIO 主要由三个核心部分组成: Channels Buffers Selectors另有其它组件,如Pipe和FileLock,与三个核心组件共同使用的工具类。Channel 和 BufferIO 在NIO 中都从一个Channel 开始。Channel 象流。 数据可以从Channel读到Buffer中,也可以从Buf...原创 2019-11-04 10:55:08 · 1625 阅读 · 1 评论 -
Java 事件机制
java事件机制包括三个部分:事件、事件监听器、事件源。1、事件。一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。com.javaedu.event.CusEvent类Java代码packagecom.javaedu.event;importjava.util.EventObject;/***事...转载 2019-11-04 10:09:49 · 235 阅读 · 0 评论 -
Java 类是如何被加载的?
一:前言最近给一个非Java方向的朋友讲了下双亲委派模型,朋友让我写篇文章深度研究下JVM的ClassLoader,我确实也好久没写JVM相关的文章了,有点手痒痒,涂了皮炎平也抑制不住。我在向朋友解释的时候是这么说的:双亲委派模型中,ClassLoader在加载类的时候,会先交由它的父ClassLoader加载,只有当父ClassLoader加载失败的情况下,才会尝试自己去加载。这样可以实...转载 2019-10-31 11:28:06 · 434 阅读 · 0 评论 -
Java 自定义异常类与多种判空异常抛出工具类
1、目的异常统一管理,精简代码2、异常抛出工具类import com.myfutech.common.util.exception.BusinessException;import org.apache.commons.lang3.StringUtils;import java.util.List;/** * 异常抛出工具类 * */public class ...原创 2019-10-31 10:12:23 · 2565 阅读 · 1 评论 -
写一个内存溢出的java程序
1、线程沾满package lock;import java.util.concurrent.atomic.AtomicInteger;public class ThreadUPTest { public static void main(String[] args) { AtomicInteger atomicInteger = new AtomicInt...原创 2019-09-30 14:50:15 · 1085 阅读 · 0 评论