202109-16 Java源码解析之详解ImmutableMap 一、案例场景遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样——publicstaticfinalMap<String,String>dayMap=newHashMap<>();static{dayMap.put("Monday","今天上英语课");dayMap.put("Tuesday","今天上语文课");dayMap.put("Wednesday","今天上数学课");dayMap.put("Thursday","今天上音乐课");dayMap.put("Sunday","今天上编程课");......}当时,我就... 继续阅读 >
202109-16 浅谈Java编程之if-else的优化技巧总结 一、使用策略枚举来优化if-else看到网上蛮多人推荐使用策略模式来优化if-else,但我总觉得,搞一堆策略类来优化大批量if-else,虽然想法很好,但无意之中很可能又会创造出很多类对象,就显得过于繁重了。若想使用策略模式来优化大批量if-else,其实有一种更好的方式,这是策略模式+枚举方式的改良,我以前写过这样一篇优化文章,详细直接点击该文了解《策略枚举:消除在项目里大批量使用if-else的优雅姿势》二、使用三目运算符来优... 继续阅读 >
202109-16 Java 实现RSA非对称加密算法 目录公钥与私钥Java实现公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生成有多种方式,可以通过程序生成(下文具体实现),可以通过openssl工具:#生成一个私钥,推荐使用1024位的秘钥,秘钥以pem格式保存到-out参数指定的文件中,采用PKCS1格式opensslgenrsa-outrsa.pem1024#生成与... 继续阅读 >
202109-16 Java 实现RSA非对称加密算法 目录公钥与私钥Java实现公钥与私钥公钥与私钥是成对的,一般的,我们认为的是公钥加密、私钥解密、私钥签名、公钥验证,有人说成私钥加密,公钥解密时不对的。公钥与私钥的生成有多种方式,可以通过程序生成(下文具体实现),可以通过openssl工具:#生成一个私钥,推荐使用1024位的秘钥,秘钥以pem格式保存到-out参数指定的文件中,采用PKCS1格式opensslgenrsa-outrsa.pem1024#生成与... 继续阅读 >
202109-16 java伪泛型知识点详解 说明1、Java中的泛型是伪泛型。这种泛型实现方法称为类型擦除,基于这种方法实现的泛型称为伪泛型。2、由于Java的泛型只在编译阶段发挥作用,因此在写代码时,起到了检查的作用,当代码运行时,它的内部并没有泛型。实例List<String>l1=newArrayList<String>();List<Integer>l2=newArrayList<Integer>();System.out.println(l1.getClass()==l2.getClass());//true结果为true,List<String>和List<Integer>在jvm... 继续阅读 >
202109-16 Java IO流之节点流与字符流的相关知识总结 一、Filefile是文件和目录路径名的抽象表示1.1File的用法用法:Filefile=newFile("路径名");//如Filefile=newFile("L:\\FileTestDemo\\AAA\\aaa.txt");注意:在windows中,路径名不能使用单个的\,单个的\为转义字符,可以使用\\,//或/1.2File的常用方法1.booleancreateNewFile()当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。注意:不能创建文件夹,只能创建文件System.out.p... 继续阅读 >
202109-16 详解JNI到底是什么 目录一、前言二、准备java代码三、生成头文件四、gcc环境安装五、生成动态链接库六、总结一、前言首先回顾一下jni的主要功能,从jdk1.1开始jni标准就成为了java平台的一部分,它提供的一系列的API允许java和其他语言进行交互,实现了在java代码中调用其他语言的函数。通过jni的调用,能够实现这些功能:通常情况下我们一般使用jni用来调用c或c++中的代码,在上一篇文章中我们用了下面的流程来描述了native方法的调用过程:JavaCod... 继续阅读 >
202109-16 Java面试必备之AQS阻塞队列和条件队列 一.AQS入队规则我们仔细分析一下AQS是如何维护阻塞队列的,在独占方式获取资源的时候,是怎么将竞争锁失败的线程丢到阻塞队列中的呢?我们看看acquire方法,这里首先会调用子类实现的tryAcquire方法尝试修改state,修改失败的话,说明线程竞争锁失败,于是会走到后面的这个条件;这个addWaiter方法就是将当前线程封装成一个Node.EXCLUSIVE类型的节点,然后丢到阻塞队列中;第一次还没有阻塞队列的时候,会到enq方法里面,我们仔细... 继续阅读 >
202109-14 C和Java没那么香了,Serverless时代Rust即将称王? 目录高并发模式初探C语言的高并发案例Java的高并发实现Go的高并发实现Rust的高并发实现总结高并发模式初探在这个高并发时代最重要的设计模式无疑是生产者、消费者模式,比如著名的消息队列kafka其实就是一个生产者消费者模式的典型实现。其实生产者消费者问题,也就是有限缓冲问题,可以用以下场景进行简要描述,生产者生成一定量的产品放到库房,并不断重复此过程;与此同时,消费者也在缓冲区消耗这些数据,但由于库房大小有限,... 继续阅读 >
202109-14 详解Java高并发编程之AtomicReference 目录一、AtomicReference基本使用1.1、使用synchronized保证线程安全性二、了解AtomicReference2.1、使用AtomicReference保证线程安全性2.2、AtomicReference源码解析2.2.1、getandset2.2.2、lazySet方法2.2.3、getAndSet方法2.2.4、compareAndSet方法2.2.5、weakCompareAndSet方法一、AtomicReference基本使用我们这里再聊起老生常谈的账户问题,通过个人银行账户问题,来逐渐引入AtomicReference的使用,我们首... 继续阅读 >
202109-14 分析Java并发编程之信号量Semaphore 目录一、认识Semaphore1.1、Semaphore的使用场景1.2、Semaphore使用1.3、Semaphore信号量的模型二、Semaphore深入理解2.1、Semaphore基本属性2.2、Semaphore的公平性和非公平性2.3、其他Semaphore方法一、认识Semaphore1.1、Semaphore的使用场景Semaphore的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前... 继续阅读 >
202109-14 java中重写父类方法加不加@Override详解 java重写父类方法加不加@Override这个是我在刚学习java时遇到的问题,希望能给像我一样的新手学习时带来帮助,如有错误请指正,谢谢!classFather{publicStringname;publicintage;publicFather(){}publicvoidwork(){System.out.println("盖房子");}}classSonextendsFather{publicintweight;publicSon(){}publicvoidwork(){System.out.println(i);}}... 继续阅读 >
202109-14 Java并发编程之Executor接口的使用 一、Executor接口的理解Executor属于java.util.concurrent包下;Executor是任务执行机制的核心接口;二、Executor接口的类图结构由类图结构可知:ThreadPoolExecutor继承了AbstractExecutorService接口;AbstractExecutorService接口实现了ExecutorService接口;ExecutorService继承了Executor接口;因此以下部分主要讲解ThreadPoolExecutor类。三、Executor接口中常用的方法voidexecute(Runnablecomma... 继续阅读 >
202109-13 浅谈Java 代理机制 目录一、常规编码方式二、代理模式概述三、静态代理3.1、什么是静态代理3.2、代码示例四、Java字节码生成框架五、什么是动态代理六、JDK动态代理机制6.1、使用步骤6.2、代码示例七、CGLIB动态代理机制7.1、使用步骤7.2、代码示例八、什么情况下使用动态代理九、静态代理和动态代理对比十、总结一、常规编码方式在学习代理之前,先回顾以下我们的常规编码方式:所有interface类型的变量总是通过向上转型并指向某个实例的。1)... 继续阅读 >
202109-13 Java 如何使用Velocity引擎生成代码 目录原理实战原理其原理如图:1.配置数据源信息(包括表名)2.读取数据表字段信息:列名、类型、字段注释、表注释3.编写代码模板,并将该模板加载到内存4.根据模板所需,组装Velocity引擎渲染所需字段Map5.创建Velocity上下文,将代码模板和替换字段传入6.velocity上下文创建引擎,执行merge合并替换并将最终代码写入文件实战1.通过maven构建项目,引入依赖:<dependency><artifactId>velocity</artifactId><groupId>org.a... 继续阅读 >
202109-13 浅析Java中为什么要设计包装类 目录一、为什么需要包装类二、装箱与拆箱三、不简单的Integer.valueOf四、Object类可以接收所有数据类型五、包装类在集合中的广泛使用六、数据类型转换一、为什么需要包装类在Java中,万物皆对象,所有的操作都要求用对象的形式进行描述。但是Java中除了对象(引用类型)还有八大基本类型,它们不是对象。那么,为了把基本类型转换成对象,最简单的做法就是将基本类型作为一个类的属性保存起来,也就是把基本数据类型包装一... 继续阅读 >