- 博客(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
原创 集成开发环境概述
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->
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关注的人