自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 收藏
  • 关注

原创 Java实现文件的解压缩并删除源文件

1.导入jar包2.java代码package com.xx;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;public class compressFile { /** * zip文

2021-06-15 17:36:03 1250

原创 jquery+css实现背景图片的切换

1.html页面代码如下:常使用在点击页面的div时出现2.css代码如下:第一个div的class为d2,d3,当d3位于后面时默认覆盖掉d2中d3存在的属性3.jquery代码如下:说明:当点击d2这个类的时候,先判断是否包含有d3这个class,如果有的话就返回,如果没有的话就先把其他div上的d3这个class删除,然后在当前点击的div中添加上d3这个class,d3的背景图片即可覆盖掉原来默认存在的背景图片。...

2021-06-15 17:26:53 813

原创 java之二维数组和稀疏数组的相互转换

package com.company;/*** * 将棋盘以二维数组的形式保存,棋盘上有两颗棋子,保存时先将其转换为稀疏数组再保存,打开时再将稀疏数组转换为棋盘 */public class Main { public static void main(String[] args) { /*** * 将二维数组转换为稀疏数组 */ //1.创建一个二维数组表示棋盘 int arr[][]=new int

2021-05-15 19:28:13 206

原创 顺时针输出矩阵

/*** * 执行方法 */ class Solution { public int[] spiralOrder(int[][] matrix) { //空值处理 if(matrix.length == 0) return new int[0];

2021-05-14 15:36:57 155

原创 SSM常见依赖总结

mybatis:<dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4&l

2021-04-10 12:15:40 160

原创 java基础之文件拷贝实战

package com.xx.InputAndOutputStream;import java.io.*;//完成一个文件的拷贝public class BufferMain { public static void main(String[] args) { try { //读取 FileInputStream fis=new FileInputStream("C:\\Users\\杨茜玲\\Desktop\\test\\a

2021-04-04 16:17:17 101

原创 java基础之OutputStream的使用

package com.xx.InputAndOutputStream;import java.io.*;public class OutputStreamTesting { public static void main(String[] args) throws IOException { String dir="C:\\Users\\杨茜玲\\Desktop"; String name="aa.txt"; //创建目标文件,在桌面中不存在

2021-04-04 16:15:55 435

原创 java基础之InputStream的使用

package com.xx.InputAndOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class InputStreamTesting { public static void main(String[] args) throws IOException { St

2021-04-04 16:14:32 623

原创 git项目的搭建步骤

1.完成git的本地安装后,创建gitee账号,如下图2.点开个人主页3.点击个人主页4.点击SSH公钥5.找c盘用户目录下的.ssh文件,默认是空文件夹,如果没有,直接手动新创建一个名为.ssh的空文件夹6.打开文件夹,在该文件夹下右击点击Git Bash Here,然后输入命令:ssh-keygen -t rsa,一直点击下一步直至生成完,此时会生成两个文件,如下图:7.打开.pub文件,复制全部内容,填写到公钥中如下图所示:8.创建仓库9.配置仓库相关信息10.配置完之后生成如下仓库

2021-04-03 14:38:23 741

原创 Lombok插件的使用

IDEA中Lombok插件的使用作用:简化代码各个注解的使用如下:@Data:注解在类上,为类提供读写属性相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。@NoArgsConstructor: 自动生成无参数构造函数。@AllArgsConstructor: 自动生成全参数构造函数。@Data: 自动为所有字段添加@ToString, @EqualsAndHashCode, @Get

2021-03-25 17:33:21 153

原创 Spring框架中的依赖注入讲解

依赖注入的意义是:让组件依赖于抽象,当组件要与其它实际对象发生依赖关系时,通过抽象来注入依赖的实际对象。1.使用构造方法进行依赖注入<!--通过带参的构造函数注入--><!--类中记得写空构造函数--><bean id="video" class="com.xx.domain.Video" scope="singleton"> <constructor-arg name="title" value="面试专题课程"></construct

2021-03-25 11:16:18 131

原创 Spring从xml配置转换到注解配置

1.各自优势注解的优势:配置简单,维护⽅便xml的优势:单修改xml时不⽤改源码,不⽤重新编译和部署2.常用注解bean定义注解⽅式:@Component 通⽤组件​ 细分: @Controller (⽤于web层)​ @Service (⽤于 service层)​ @Repository (⽤于dao仓库层)bean取名xml⽅式:通过id或者name注解⽅式:

2021-03-25 11:13:59 691

原创 Spring5.x自动装配Autowire属性

1.属性注⼊前⾯学过属性注⼊,set⽅法、构造函数等,属于⼿⼯注⼊有没办法实现⾃动装配注⼊?2.Spring⾃动注⼊使⽤元素的 autowire 属性为⼀个 bean 定义指定⾃动装配模式autowire设置值 no:没开启byName: 根据bean的id名称,注⼊到对应的属性⾥⾯byType:根据bean需要注⼊的类型,注⼊到对应的属性⾥⾯ 如果按照类型注⼊,存在2个以上bean的话会抛异常 expected single matching bean but found 2constru

2021-03-25 11:12:07 255

原创 IOC容器bean之间的依赖和继承

1.bean的继承两个类之间大多数属性相同,为了避免重复配置,通过bean标签的parent属性可重用已有的bean元素的配置信息该继承指的是配置信息的复用,与java类的继承没有关系<bean id="video" class="com.xx.domain.Video" scope="singleton"> <!--属性注入--> <property name="id" value="9"/> <property name="titl

2021-03-25 11:10:59 139

原创 Bean的二次加工—Spring5.x后置处理器BeanPostProcessor

1.什么是BeanPostProcessor?是Spring IOC容器给我们提供的⼀个扩展接⼝在调⽤初始化⽅法前后对 Bean 进⾏额外加⼯,ApplicationContext 会⾃动扫描实现了 BeanPostProcessor的 bean,并注册这些 bean 为后置处理器是Bean的统⼀前置后置处理⽽不是基于某⼀个bean2.执⾏顺序Spring IOC容器实例化Bean调⽤BeanPostProcessor的postProcessBeforeInitialization⽅法调⽤be

2021-03-25 11:08:13 150

原创 SpringIoc容器Bean的生命周期的init和destroy方法

1.SpringIOC容器对Bean的生命周期的管理过程:1、通过构造器或工厂方法创建Bean的实例2、为Bean的属性赋值或对其他Bean的引用3、调用Bean的初始化方法4、使用Bean5、当容器关闭时,调用Bean的销毁方法2.代码如下:1.实体类中的init和destroy方法//资源初始化 public void init(){ System.out.println("init方法被调用"); } //资源回收销毁 public void destroy(){

2021-03-25 11:07:00 202

原创 spring思维导图

2021-03-25 11:03:27 130

原创 集成开发环境概述

1.什么是集成开发环境?集成开发环境(IDE, Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等-体化的开发软件服务套。所有具备这一特性的软件或者软件套(组) 都可以叫集成开发环境。如微软的Visual studio系列,Borland的C++ Builder、 Delphi系列等。该程序可以独立运行,也可以和其它程序并用。IDE多被用于开发H

2021-03-24 17:35:26 1046 1

原创 java基础复习篇之入门知识

1.什么是java?Java是一种可以撰写跨平台应用程序的、面向对象的程序设计语言。简单说,Java就是一种语言,不过是一种针对jvm的语言,Java编译后是字节码,而jvm会把这些字节码解释成机器码,然后做出相应的动作。Java语言概念特点(也叫面向的基本概念):类:就是模板,用来定义一类对象的方法和属性,比如人、学生、猫,万物都是有模板,都是可以定义为类。(类名首字母大写)2.JVM,JRE,JDK三者的关系JVM:Java Virtual Machine Java虚拟机,简单看成一 个操作系

2021-03-24 17:04:33 196 1

原创 java多线程并发之生产者消费者

通俗来讲,生产者就是好比如吃自助的时候的厨师,消费者就是我们吃自助的人。只有厨师做了菜,消费者才可以吃;而当没有人吃的时候厨师停止做菜。在 Java 中,负责产生数据的模块是生产者,负责使用数据的模块是消费者. 生产者消费者解决数据的平衡问题,即先有数据然后才能使用,没有数据时,消费者需要等待。在此可能生产者与消费者的数量可能是:1.一个生产者与一个消费者2.一个生产者多个消费者3.多个生产者多个消费者简单地代码例示如下:package com.company.producerdata;/

2021-03-24 15:49:58 173

原创 java多线程并发之当wait条件发生变化

例示代码如下:package com.company.wait;import java.util.ArrayList;import java.util.List;/*** * wait条件发生变化 * 定义一个集合 * 定义一个线程向集合中添加数据,添加完数据后通知另一个线程从集合中取数据 * 定义一个线程从集合中取数据,如果集合中没有数据就去等待 */public class WaitTesting02 { public static void main(String[]

2021-03-24 13:02:12 150

原创 java多线程并发之通知过早引发问题

线程 wait()等待后,可以调用 notify()唤醒线程, 如果 notify()唤醒的过早,在等待之前就调用了 notify()可能会打乱程序正常的运行逻辑。因为start的方法他只是告诉线程调度器我准备好了,什么时候调用由线程调度器决定。解决方法是可以设置线程标志。代码例示如下:package com.company.notify;public class TestingIsTooEarly { static boolean isFirst=true;//定义静态变零是否是作为第一个

2021-03-24 12:23:32 226

原创 java多线程并发之wait和sleep的区别

从表面上看,wait和sleep方法都可以使当前线程进入阻塞状态,但是两者之间存在本质的区别,下面我们将总结两者的区别和相似之处:wait和sleep方法都可以使线程进入阻塞状态。wait和sleep方法均是可中断方法,被中断后都会收到中断异常。wait是Objcct的方法,而sleep是Thread特有的方法。wait方法的执行必须在同步方法中进行,而sleep则不需要。线程在同步方法中执行sleep方法时,并不会释放monitor的锁,而wait方法则会释放monitor的锁。sleep方法

2021-03-24 09:11:52 191

原创 java基础复习篇之匿名内部类

匿名内部类简而言之就是一个没有名字的类,属于局部内部类的一种,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。匿名内部类的缺点:1.可读性差2.不能重复使用,只适用于只使用一次的类。语法结构如下:new 父类构造器(实参列表) | 实现接口(){ //匿名内部类的类体部分}代码例示如下:正常情况下,创建了一个接口我们通常会写他的实现类如下代码:A.接口:package innerClass;public interface Compute

2021-03-23 20:31:50 128

原创 java多线程并发之线程间的通信

1.什么叫做等待通知?就好比如:服务员等待厨师拿菜的过程就做等待;厨师做好了菜按铃通知服务员就做通知。而在单线程编程中,要执行的操作需要满足一定的条件才能执行,可以把这个操作放在 if 语句中;在多线程编程中,可能 A 线程的条件没有满足只是暂时的, 稍后其他的线程 B 可能会更新条件使得 A 线程的条件得到满足. 可以将 A 线程暂停,直到它的条件得到满足后再将 A 线程唤醒.它的伪代码:atomics{ //原子操作while( 条件不成立 ){ 等待 } 当前线程被唤醒条件

2021-03-23 19:33:09 142

原创 java多线程并发之原子变量类的使用(下)

3.AtomicIntegerFieldUpdaterAtomicIntegerFieldUpdater 可以对原子整数字段进行更新,要求:字符必须使用 volatile 修饰,使线程之间可见只能是实例变量,不能是静态变量,也不能使用 final 修饰代码示例:定义一个User类:package com.company.atomics;/**使用AtomicInterFiledUpdater更新的字段必须使用volatile修饰* */public class User {

2021-03-22 19:01:51 148

原创 java多线程并发之原子变量类的使用(上)

1.AtomicLong使用AtomicLong设计一个计数器:package com.company.atomics;/** 使用原子变量类定义一个计数器* 该计数器在整个程序中都能使用,并且在所有的地方都可以使用这个计数器,* 这个计数器可以设计为单例* */import java.util.concurrent.atomic.AtomicLong;public class Indicator { //构造方法私有化 private Indicator(){}

2021-03-22 15:50:43 237 1

原创 java多线程并发之原子变量类概述

原子变量类基于CAS实现的, 当对共享变量进行read-modify-write更新操作时,通过原子变量类可以保障操作的原子性与可见性.对变量的 read-modify-write 更新操作是指当前操作不是一个简单的赋值,而是变量的新值依赖变量的旧值,如自增操作i++. 由于volatile只能保证可见性,无法保障原子性, 原子变量类内部就是借助一个 Volatile 变量,并且保障了该变量的 read-modify-write 操作的原子性, 有时把原子变量类看作增强的 volatile 变量. 原子变量

2021-03-22 14:48:12 144 1

原创 java多线程并发之使用CAS实现线程安全的计数器

例示代码如下:package com.company.cas;//使用CAS实现一个线程安全的计数器public class CASTest { public static void main(String[] args) { CASCounter casCounter=new CASCounter(); for (int i = 0; i < 100; i++) { new Thread(new Runnable() {

2021-03-21 19:01:27 239

原创 CAS中的ABA问题

CAS 实现原子操作背后有一个假设: 共享变量的当前值与当前线程提供的期望值相同, 就认为这个变量没有被其他线程修改过.。实际上这种假设不一定总是成立。如有共享变量 count = 0A 线程对 count 值修改为 10B 线程对 count 值修改为 20C 线程对 count 值修改为 0当前线程看到 count 变量的值现在是 0,现在是否认为 count 变量的值没有被其他线程更新呢? 这种结果是否能够接受??这就是 CAS 中的 ABA 问题,即共享变量经历了 A->B-&gt

2021-03-21 18:40:01 96

原创 java多线程并发之CAS简介

**CAS(Compare And Swap)**是由硬件实现的。 可以将 read- modify - write 这类的操作转换为原子操作。i++自增操作包括三个子操作:1.从主内存读取 i 变量值2.对 i 的值加 13.再把加 1 之后 的值保存到主内存CAS 原理: 在把数据更新到主内存时,再次读取主内存变量的值,如果现在变量的值与期望的值(操作起始时读取的值)一样就更新。更详细说明如图:...

2021-03-21 18:18:03 108

原创 java多线程并发之volatile与synchronized的使用

1) volatile 关键字是线程同步的轻量级实现,所以volatile性能肯定比 synchronized 要好; volatile 只能修饰变量,而 synchronized 可以修饰方法,代码块. 随着 JDK 新版本的发布,synchronized 的执行效率也有较大的提升,在开发中使用 sychronized 的比率还是很大的.。2) 多线程访问 volatile 变量不会发生阻塞,而 synchronized 可能会阻塞。3) volatile 能保证数据的可见性,但是不能保证原子性;

2021-03-21 18:03:48 324

原创 java多线程并发之volatile的作用

volatile 关键的作用是使变量在多个线程之间可见,可以强制线程从公共内存中读取变量的值,而不是从工作内存中取,解决了线程的可见性。但其不具有原子特性。有关volatile的可见性代码示例:package com.company.volatilekw;public class Test02 { public static void main(String[] args) { PrintString printString=new PrintString();

2021-03-21 17:59:15 114

原创 java多线程并发之守护线程

守护线程:是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者;如果所有用户线程都执行结束了,但是守护线程还在执行,程序依然会结束运行,同时杀死所有的守护线程。简单来说就是没有需要被守护的线程,那么守护线程就没必要存在。虚拟机必须要确保用户线程执行完毕,但不用等待用户线程执行完毕。在Daemon线程中产生的新线程也是Daemon守护线程。守护线程例示代码:package com.company.state;//测试守护线程//上帝守护你public clas

2021-03-21 15:39:20 155

原创 java多线程并发之死锁

死锁:在多线程程序中,同步时可能需要多个锁,如果获得锁的顺序不一致,可能会导致死锁,死锁不一定会出现。如何避免死锁?答: 当需要获得多个锁时,所有线程获得锁的顺序保持一致即可。代码例示如下:package com.company;/** * 死锁: * 在多线程程序中,同步时可能需要多个锁,如果获得锁的顺序不一致,可能会导致死锁,死锁不一定会出现 * 如何避免死锁? * 当需要获得多个锁时,所有线程获得锁的顺序保持一致即可 * */public class

2021-02-18 13:08:14 104

原创 java多线程并发同步过程出现异常会自动释放锁对象

代码示例如下:package com.company;/*** 同步过程中出现了异常,会自动释放锁对象* */public class Test09 { public static void main(String[] args) { //创建对象,通过对象调用方法 Test09 obj =new Test09(); //一个线程调用m1方法 new Thread(new Runnable() { @O

2021-02-18 13:04:41 317

原创 java多线程并发之脏读

出现读取属性值出现了一些意外,读取的是中间值,而不是修改之后的值。出现的原因:对共享数据的修改和读取可能不同步。解决方法:同时对修改数据的代码块和读取数据的代码块进行同步。代码例示如下:package com.company;/** 脏读* */public class Test08 { public static void main(String[] args) { //开启子线程设置用户名和密码 PublicValue publicValue=n

2021-02-18 13:02:36 328

原创 java多线程并发同步代码块与同步方法的比较

区别:同步方法锁的粒度粗,并发执行效率低,相反的,同步代码块锁的粒度细,并发效率高;根据实际情况选择。代码例示如下:package com.company;/**同步代码块与同步方法的选择问题* 同步方法锁的粒度粗,并发执行效率低,相反的,同步代码块锁的粒度细,并发效率高;根据实际情况选择* */public class Test07 { public static void main(String[] args) { Test07 obj=new Test07();

2021-02-18 12:58:42 243

原创 Java多线程并发之内部锁:synchronized 关键字

Java 中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保障原子性,可见性与有序性.。内部锁是通过 synchronized 关键字实现的.synchronized 关键字修饰代码块,修饰该方法。修饰代码块的语法:synchronized( 对象锁 ) {同步代码块,可以在同步代码块中访问共享数据}修饰实例方法就称为同步实例方法。修饰静态方法称称为同步静态方法。例示代码如下:A.同步代码块1.使

2021-02-09 00:19:49 167

原创 java并发编程之锁相关概念

1.锁概念线程安全问题的产生前提是多个线程并发访问共享数据.。将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问.锁就是复用这种思路来保障线程安全的。锁(Lock)可以理解为对共享数据进行保护的一个许可证. 对于同一个许可证保护的共享数据来说,任何线程想要访问这些共享数据必须先持有该许可证. 一个线程只有在持有许可证的情况下才能对这些共享数据进行访问; 并且一个许可证一次只能被一个线程持有; 许可证线程在结束对共享数据的访问后必须释放其持有的许可证。一线程在访问共享数

2021-02-08 22:43:45 120

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除