![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 69
Cobb141
这个作者很懒,什么都没留下…
展开
-
java验证公钥私钥是否匹配及公钥私钥与字符串相互转换
本文记录使用java生成公钥私钥,将公钥私钥转换成字符串,验证公钥私钥是否匹配。验证公钥私钥是否匹配的思想:使用公钥对字符串进行加密,再使用私钥进行解密,若解密生成的字符串与原字符串一致,则说明公钥私钥匹配。引入第三方依赖bouncycastle: <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15原创 2022-02-06 16:48:33 · 7566 阅读 · 0 评论 -
代理模式(静态代理和动态代理)与SpringBoot AOP实现
代理模式代理模式分为静态代理和动态代理。代理模式类似现实世界中的中介,比如租房,中介会为双方提供公共服务,如出租房屋、看房、签合同、收取费用等;通过中介(代理),业务双方就不用操心这些繁琐的事务,房东只要将钥匙交给中介,从中介那里收租金;房客只要从中介那里拿房子,交钱给中介即可。其他事情有中介办妥。静态代理静态代理中的角色:1.抽象角色:业务的抽象,如租房这一业务,通常由接口或抽象类来实现2.真实角色:被代理的角色,如房东3.代理角色:代理真实角色,为业务双方提供服务,执行操作4.客户:访问原创 2021-09-01 15:49:57 · 733 阅读 · 0 评论 -
Java并发编程(六):任务取消、中断与关闭
这一节介绍并发编程中如何对任务执行取消操作。java中没有提供停止线程的方法,只用通过协作——使代码遵循一定的协议来请求取消。轮询检查一种常见的取消任务的办法是轮询检查。线程在执行的过程中通过定期检查一个boolean变量来决定是否终止任务。下面是一个使用轮询检查来终止素数生成的例子:public class PrimeGenerator implements Runnable { private static ExecutorService exec = Executors.newCache原创 2021-08-17 11:47:49 · 1525 阅读 · 1 评论 -
Java并发编程(五):执行并发任务
Executor框架适用面Executor框架代替Thread以实现更灵活的执行策略,Executor基于生产者-消费者模式,对任务提交和执行进行了解耦。使用Executor的线程池实现web server实例:public class TaskExecutionWebServer { private static final int NTHREADS = 100; private static final Executor exec = Executors.n原创 2021-08-12 11:58:52 · 322 阅读 · 0 评论 -
Java并发编程(四):构建并发程序的机制
迭代和ConcurrentModificationException在使用迭代器或for-each对同步容器(Vector和Hashtable)进行迭代时,倘若容器在迭代期间被修改,会抛出一个ConcurrentModificationException异常。避免这个异常的常用方法是给迭代加锁,例:public List<E> list = Collections.synchronizedList(new ArrayList<E>());synchronized(list){原创 2021-08-11 11:30:23 · 144 阅读 · 0 评论 -
Java并发编程(三):组合与扩展线程安全类
这一节介绍:实现线程安全组件的常用方法如何使用线程安全的组件来组合新的组件并避免线程安全问题如何扩展已有线程安全类即使一个类中的对象不是线程安全的,但仍有许多办法将其安全地用于多线程程序。常用的方法有线程封闭、使用锁来保护对状态变量的所有的访问。java监视器模式常用的避免线程安全问题的方法:在一个类中封装所有状态变量(都是private的),并且对于访问变量的方法都使用了同步。这种模式也被称为java监视器模式。除了使用对象内部锁,还可以使用私有锁来对状态进行保护,例:public c原创 2021-08-09 11:39:31 · 108 阅读 · 0 评论 -
Java并发编程(二):共享对象
可见性我们希望一个线程在修改了一个可变状态之后,这一修改对其他线程是可见的,而这仍然由同步来实现。倘若没有同步,一个线程在修改一个可变状态时,另一个线程可能读取到过期的值;除此之外,未同步的多线程会有重排序现象,即JVM为了提高效率,在执行多线程时并不是按照代码编写顺序执行的,执行顺序可能出乎预料。线程封闭与synchronized不同,synchronized通过线程等待来完成同步,避免共享数据带来的线程安全问题;而线程封闭的解决办法是不共享数据,即数据的使用在不同线程之间是隔离的,只有在本线程之原创 2021-08-06 11:46:54 · 104 阅读 · 0 评论 -
Java不可变对象
不可变类指的是其实例不可被修改的类,它更易于设计、实现和使用。不可变类应该遵循如下规则:保证类不会被扩展,一般的做法是将类声明成final的,当然还有其他方法不要提供任何修改对象状态的方法(如setter)声明所有的成员变量都是private和final的如果类具有指向可变对象的成员,则确保客户端无法获得该对象的引用,并且永远不要用客户端提供的引用对象来初始化这些属性,也不要从任何访问方法中返回该对象引用。在构造器、访问方法和readObject方法中使用拷贝性保护技术。例:public f原创 2021-08-06 11:40:04 · 764 阅读 · 0 评论 -
Java并发编程(一):线程安全
线程安全编写线程安全代码的本质就是对状态的管理,即那些共享的、可变的状态。线程安全问题的本质是多个线程访问同一资源,这会产生隐患,解决的方法有三种:不要跨线程共享变量使状态变量为不可变的在访问状态变量时使用同步线程安全的定义:如果一个类能被多个线程安全的使用,那么它就是线程安全的。或者说,一个类在被多个线程访问时仍然能做出正确的行为。原子性:就是一个事务要么全部执行,要么一点也没有执行,不存在其他状态。要保证线程安全就要保证事务是原子地执行。要使变量为原子的,可以使用java.util.c原创 2021-08-05 11:40:04 · 104 阅读 · 0 评论 -
Java保护性拷贝
对于不可变类,我们在构造器中或方法返回引用对象时要考虑进行保护性拷贝。下面是一个不安全的例子:public final class Period{ private final Data start; private final Date end; public Period(Date start, Date end){ //此处省略参数有效性检验。。。 this.start = start; this.end = end;原创 2021-03-12 18:55:34 · 254 阅读 · 0 评论 -
Java对象通用方法equals,hashCode,toString以及Comparable接口
总括:1.覆盖equals方法时请遵守通用约定2.覆盖equals时应同时覆盖hashCode方法3.始终要覆盖toString方法4.考虑实现Comparable接口1.覆盖equals方法时请遵守通用约定不用覆盖equals的情况:(1)类的实例本质上是唯一的(2)类没有提供“逻辑相等”的功能,object的默认实现是引用相同(3)超类已经覆盖了equals,且超类的行为对于这个类也是合适的(4)类是private或protected的所以,当类具有逻辑相等的概念并且超类没有覆盖e原创 2021-03-04 17:47:01 · 372 阅读 · 1 评论 -
Java创建和销毁对象的一些技巧和注意事项
总括1.使用静态工厂方法代替构造方法2.当构造函数有很多参数时考虑使用构建器3.用私有构造器或枚举类型实现单例模式4.在想让一个工具类不被实例化的时候使用私有构造函数5.优先考虑使用依赖注入来引用资源6.避免创建不必要的对象7.消除不必要的对象引用8.避免使用finalize和clear方法9.try-with-resources优先于try-finally1.使用静态工厂方法代替构造方法如将boolean转成Boolean对象的方法:public static Boolean va原创 2021-03-02 19:48:08 · 393 阅读 · 2 评论 -
SpringBoot简单入门(使用vscode)
SpringBoot的作用是整合整个Spring框架各个技术栈,省去繁琐的项目配置。vscode配置Spring Boot和maven详见这里:VsCode搭建springboot 并配置maven环境Hello World使用Spring Boot的开发流程:1.创建Spring Boot工程及引入依赖vscode创建spring工程后需等待一段时间进行导入。创建工程时要选择依赖,web开发选择如下的包:DevTools(代码修改热更新,无需重启)、Web(集成tomcat、SpringMV原创 2021-01-10 20:35:54 · 1569 阅读 · 1 评论 -
Java面向对象笔记(详细)
面向过程程序设计以功能分解为基础设计软件系统,它的缺点:代码中数据结构和和功能可重用性差;软件可维护性差;它适合小程序,单个算法或很成熟的系统;而不适合大型系统或需要频繁变化的系统。面向对象程序设计步骤:1.确定系统中接收消息的对象;2.确定每个对象上执行消息的操作;类和类之间的关系:1.相互独立2.通过继承建立联系3.通过type(interface)建立联系,通过接口(interface)实现多继承封装面向对象程式设计中,封装(Encapsulation)就是把类的内部与外界隔离起来,把原创 2020-09-24 22:29:07 · 383 阅读 · 0 评论 -
Java Swing(一):入门实例
一段简单的程序:import javax.swing.*;import java.awt.*;public class demo01 { public static void main(String[] args) { JFrame frame = new JFrame();//JFrame表示一个窗口 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//表示右上角叉叉关闭程序原创 2020-09-21 08:05:53 · 288 阅读 · 0 评论 -
对于Java数组和对象数组内存分配的理解
Java中数组的内存分配关于数组变量:本质上,数组变量是数组的管理者而非数组本身;数组变量之间的赋值是管理权限的赋予;数组变量之间的比较是判断是否管理同一个数组。所以要由一个数组得到一个和它完全一样的数组,要采用遍历赋值的方法。Java一维数组的内存分配堆区中分配空间后会把每个数组元素初始化为0。array是引用变量,它在栈区占用的空间大小为4bytes。由此可以看出,数组变量其实就是指针。它存储着数组元素在堆区的首地址。Java中对象数组的内存分配创建对象数组:Departmen原创 2020-07-26 16:49:05 · 623 阅读 · 0 评论