Java
結城
渴望着美好结局,却没能成为自己。
展开
-
回调是什么以及同步异步回调怎么实现
在 Java 中,回调(Callback)和异步回调(Asynchronous Callback)都可以通过接口、匿名类或 lambda 表达式来实现。下面我将分别展示如何在 Java 中实现回调和异步回调。原创 2024-09-04 22:57:56 · 261 阅读 · 0 评论 -
threadlocal的一些用法,以及如何解决可重入分布式redis锁
好的,经过我的思考,threadlocal是一个还不错的选择,因为是对线程内共享的,事实上threadlocal应该是为了解决一些在线程内传递状态所使用的手段,(要不然你还得疯狂传参,中间要是遇到封装的第三方库,你还改不了),好,这个状态其实说起来应该是叫上下文context比较合适,除了状态外,它也可以是用户身份,任务信息等。这里的话对于可重入分布式锁,就可以有一个Integer类型的threadlocal变量,重入就+1,释放就-1,直到0了,才真正释放锁就可以了。原创 2024-08-26 17:07:51 · 542 阅读 · 0 评论 -
fastjson和jackson的对比,同样的序列化/反序列化,有什么区别
挖个坑,之后填。原创 2024-07-24 16:55:30 · 137 阅读 · 0 评论 -
Java的序列化和反序列化
C++语言具有内存操作符,所以二进制串的概念容易理解,例如,C++语言的字符串可以直接被传输层使用,因为其本质上就是以’\0’结尾的存储在内存中的二进制串。对于跨语言间的通讯,序列化后的数据当然不能是某种语言的特殊数据类型。因为互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。一般而言,TCP/IP协议的应用层对应与OSI七层协议模型的应用层,展示层和会话层,所以序列化协议属于TCP/IP协议应用层的一部分。至于为什么要序列化和反序列化呢?原创 2024-07-24 15:59:55 · 482 阅读 · 0 评论 -
@Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
而SubmitParam中的某一个参数,我给加上了@Data和@Builder,注释,这个@Builder注释可好,直接给我干400了,其实去掉@Builder或者加上@AllArgsConstructor和@NoArgsConstructor都可以解决这个问题。(4)如果你想让子类继承父类的属性,那么你需要在子类的全参构造函数上使用 @Builder 注解,并且在父类上使用 @AllArgsConstructor 注解,否则子类的构造器类不会包含父类的属性。所以我就排查了半天,结果没发现啥错误,有点懵。原创 2024-07-23 20:14:03 · 674 阅读 · 0 评论 -
Java8新特性stream的原理和使用
看起来好像是一个个方法顺序对所有的操作(map、filter、distinct。)执行,实际上不是,因为效率上是无法接受的,其基本思想是在一次迭代中尽可能多的执行用户指定的操作。原创 2024-06-28 10:54:59 · 346 阅读 · 0 评论 -
Java的lambda表达式使用方式,lambda表达式到底为了做什么
感觉从狭义的使用目的来说,lambda表达式就是为了简化某些匿名内部类,当然不是所有的匿名内部类都能被简写。也就是你想要某些返回值作为参数不用去显示的写调用方法或者传参,具体来看看下面的。具体的语法实际上就是->前面是传参,假设无参就是(),只有一个参数可以省略括号,多个参数就(a, b, c)。->后面是执行代码。进一步的写法还可以用::代替一些->,这是Java 8中的Lambda表达式写法之一,原创 2024-06-27 14:14:39 · 173 阅读 · 0 评论 -
Maven的一些基础知识
Maven是帮你编译测试打包程序啥的用的,最简单的例子,你写项目要用到各种各样的驱动,例如jdbc,那么你要手写在java程序里,并且耦合的很深,肯定是不好的,所以Maven会帮你自动下载依赖(jdbc、Mybatis等),不用你手动下载了。转载 2023-11-15 15:11:39 · 27 阅读 · 0 评论 -
ConcurrentLinkedQueue的offer方法源码解析,新的节点如何入队
此时理论上新节点是尾节点,p!=t代表p不是尾节点了,不能插入新节点到他后面,有其他线程在其之前更新了队列,就要重新获得尾节点才行。就是说先找尾节点,找到以后把新节点插入到尾节点后面。很显然for循环,反复自旋。原创 2023-10-12 14:45:41 · 123 阅读 · 0 评论 -
java并发编程,lock(),trylock(),lockInterruptibly()的区别
lockInterruptibly和lock类似,也是一直尝试获取锁,只要没获取到就一直阻塞,直到获取到锁。但是线程会响应中断命令,如果有其他线程发送了中断(Interrupt)指令,那该线程会中断,放弃获取锁,去throw InterruptedException。trylock则是就尝试一次,拿到了返回true,没拿到返回false,带时间限制的话拿不到会等一会,超出时间限制还没拿到才会返回false。lock优先获取锁,只要拿不到锁就一直在阻塞状态,一直阻塞到获取到锁。原创 2023-10-08 16:06:56 · 159 阅读 · 0 评论 -
mac如何修改环境变量文件
终端执行 vim ~/.bash_profile点一下向下箭头,进入bash_profile文件键盘敲"i"进入编辑模式,进行编辑编辑完成后,点esc 退出直接输入":wq!"这四个字符后,回车即可保存最后输入:source ~/.bash_profile,刷新一下...原创 2020-08-01 18:41:21 · 797 阅读 · 0 评论 -
Java实现生产者消费者问题,虚假唤醒
这里需要注意的是判断条件时候,为了避免虚假唤醒,我们需要使用while来判断,而不是使用if,因为if只会判断一次条件,而while的条件不符合就会一直在里面循环。这里解释一下虚假唤醒,之前看到的,但是找不到出处了,如果有朋友知道,希望可以指出。什么是虚假唤醒?举个例子,我们现在有一个生产者-消费者队列和三个线程。1) 1号线程从队列中获取了一个元素,此时队列变为空。2) 2号线程也想从队列中获取一个元素,但此时队列为空,2号线程便只能进入阻塞(cond.wait()),等待队列非空。3)原创 2020-07-28 17:24:59 · 188 阅读 · 0 评论 -
中断线程的休眠/睡眠
尝试一下中断线程的睡眠,这个其实很好用,就假设某个线程在做事,做完了让他等着,然后当另一个线程触发某个条件,就会唤醒这个睡眠的线程。程序例子如下。package ProcessAndThread.thread;/** * sleep()睡眠太久了,如果希望半道醒来,你应该怎么办?也就是说怎么叫醒一个正在睡眠的线程呢? * 注意:这个不是终断线程的执行,是终止线程的睡眠 */public class ThreadTest { public static void main(String[原创 2020-07-25 17:30:56 · 537 阅读 · 0 评论 -
实例对象调用静态方法,线程休眠到底休眠的是谁
关于继承和多态的一个问题,在上课的时候,老师曾提到一个问题,如下老师给出了原因好像是说什么静态方法是不被继承的。但是我对这个说法其实不太赞同。我还是认为只有构造方法是不被继承的(私有属性、方法等我认为是继承的,但是问题在于能不能访问得到),而且在创建子类型对象时候应该是默认会建一个父类型对象蕴含其中。所以这个题的真正解释应该是在调用静态方法时,底层会识别它所对应的类,将其自动转换成对应的Base.test()和Child.test(),并相应执行对应的代码块。另写一个证明程序如下,可以试着运行一下。原创 2020-07-25 17:04:40 · 156 阅读 · 0 评论 -
java目录的复制拷贝,整个目录包括下属文件的复制拷贝
package iostream.homework;import java.io.*;/** * 拷贝目录 */public class CopyAll { public static void main(String[] args) { //拷贝源 File srcFile = new File("/Users/yuuki/Downloads/src"); //拷贝目标 File destFile = new File(原创 2020-07-24 16:21:17 · 269 阅读 · 0 评论 -
mac下的隐形文件.DS_Store,Java获取目录下文件数目不对
我们使用mac的时候,经常会发现压缩东西之类的发给Windows用户,文件夹终会有一个奇怪的文件——.DS_Store,这个东西是干什么的呢?由于它一直没对使用产生太大影响,所以我也就一直没管它。直到在学习过程中,发现Java获取到的目录下的文件数目与视图中不同,我这才意识到问题的所在。//先拿到目录下所有文件File[] files = srcFile.listFiles();System.out.println(files.length);for (File f : files) {Syst原创 2020-07-24 15:28:58 · 716 阅读 · 0 评论 -
Java字符流拷贝/复制文本文件,字节流拷贝文本文件乱码,很经典简便
先简单说明一下,文本文件与后缀无关,不论是“.txt”,“.java”,还是“.什么”,只要能使用记事本/文本编辑打开/编辑的,都可以称为文本文件。相比于字节流拷贝文件而言,字符流拷贝文本文件更好用一些,但是对于其他类型的文件,字符流是不能拷贝的。同时,对于write()方法而言,除了char[]数组以外,还可以直接使用String类型,非常方便,中文也是可以的,字节流则可能会乱码。那么我们来看一看具体实现吧。package iostream.FileWriter;import java.io.F原创 2020-07-23 17:05:24 · 1279 阅读 · 0 评论 -
Java使用字节流复制文件,最经典、万能的方式
Java中其实有很多种方式可以完成对文件的复制,这里可以参考我之前的一片博客,本次我们主要是详细地对其中一种进行实现。众所周知,任何文件都是一个一个字节组成的,而这些字节我们把它复制过来,就相当于我们复制过来了一个文件了!当然了,由于使用的是字节流,而非字符流,所以任何格式的文件我们都可以拷贝,包括但不仅限于文本文件、音频、图片、视频等等。下面让我们来一起看一看吧!package iostream.FileOutputStream;import java.io.*;/** * 使用FileIn原创 2020-07-23 16:00:18 · 987 阅读 · 1 评论 -
Java多态的使用(父类子类与接口)
记个笔记:Java在开发过程中尽量多使用多态,除了父类子类之间的多态,还有接口,在进行类型强转时候,如果是一个子类实现了某个接口,而父类引用指向这个子类,这个引用强制转成接口类型,这时即便是这个引用(父类)是没实现这个接口的,但是他所指向的对象是实现该接口的子类,这样也是可以的。...原创 2020-07-15 11:14:20 · 1202 阅读 · 0 评论 -
Java中Integer的静态方法parseInt()和valueOf()的区别
我们经常会应用到一个功能,就是将字符串转换成一个整数(或者浮点数之类的,都大同小异),比如说一个网页啊之类的,客户会在输入框中输入一些信息,而我们要将其存到我们的数据库中,但是输入框中输入的即便是数字,它也是一个字符串,我们需要将其转换成整数。那么就会用到一个经典的方法,就是parseInt()了,但是我们其实还有一个方法就是valueOf(),我们发现这个也能用,那区别在于何处呢?int ret1 = Integer.parseInt("123");int ret2 = Integer.valueOf原创 2020-07-11 21:12:40 · 845 阅读 · 0 评论 -
彻底理解Java深克隆和浅克隆的原理及实现
一、为什么要克隆?答案是:克隆的对象可能包含一些已经修改过的属性,保留着你想克隆对象的值,而new出来的对象的属性全是一个新的对象,对应的属性没有值,所以我们还要重新给这个对象赋值。即当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。二、如何实现克隆分三步:对象的类实现Cloneable接口;覆盖O转载 2020-07-07 10:11:00 · 233 阅读 · 1 评论 -
成员变量与局部变量的区别,实例变量与静态变量的区别
成员变量被分为类变量和实例变量两种,简单来说,定义成员变量时没有 static 修饰符的就是实例变量,反之,有static修饰符的就是静态变量。而什么是局部变量呢?局部变量就是在一个方法内或一个代码块内有效的变量,出了这个方法或代码块就失效了的变量。接下来谈谈具体的。什么时候成员变量声明为实例变量?所有对象都有这个属性,但是这个属性会随着对象的变化而变化——————————————————————————什么时候成员变量声明为静态变量?所有对象都有这个属性,但是这个属性不随着对象的变化而变化原创 2020-07-05 17:25:47 · 282 阅读 · 0 评论 -
实例方法与静态方法的区别
回顾一些,发现一些Java的基础知识有点记不清了。在这里记录一下。说得通俗点就是实例方法没有static关键字,而静态方法存在static关键字。那么什么时候用这两种方法呢。实例方法要求其执行方法体中程序时,每个对象产生的结果不同,或者说是,实例方法中要访问实例变量。这时是要涉及到this关键字的,那么也就要明确对象了,也就需要使用对象来访问。这时,我们需要这个方法是实例方法。静态方法呢,它带有static关键字,换个说法就是,在执行中不涉及对象存在,大家都一样。直接使用类名.的方式来调用。也就是说,原创 2020-07-05 16:34:49 · 182 阅读 · 0 评论 -
Java复制文件的四种方法
java复制文件的4种方式摘要尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候。 然而有几种方法可以进行Java文件复制操作,下面列举出4中最受欢迎的方式。使用FileStreams复制这是最经典的方式将一个文件的内容复制到另一个文件中。 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B。 这是第一个方法的代码:private static void转载 2020-06-20 15:27:50 · 1151 阅读 · 1 评论 -
idea无法同时开多个窗口,idea解决同时开多个窗口
最近在进行一个socket编程的实验,需要多开窗口,之前用Qt写过一次c++的socket编程,可以同时开多个窗口,但这次用Java时,发现idea不能同时开多个窗口运行程序。解决方法如下。选中如下图所示的Edit Configurations然后勾选这个即可这样就可以实现多开,进行服务器与客户端的对话了。...原创 2020-06-19 11:27:29 · 6891 阅读 · 2 评论 -
idea没有database选项卡,jdbc
idea是一个功能十分强大的IDE,大家在使用他进行开发时候(我好像轮不到用开发这么高大上的词),必不可少的就是连接数据库了,但是我找了一下,发现网上说的database选项卡我并没有,不知道是不是我是用的是教育版的原因,所以经过一番摸索,我发现了这样一条途径。首先我按网上很多人说的,在View里找tool windows里的database,但是我并没有,所以这是为什么呢?原因在于当初我可能并没有下载对应的数据库插件。所以我们要做的就是下载插件。三步走,第一步打开设置那个按钮找plugins然后原创 2020-06-11 16:11:38 · 22646 阅读 · 18 评论 -
Java父类引用指向子类,多态,动态绑定与静态绑定
这次我们来看一个Java中经典的问题。我们都知道面向对象三大特征:封装、继承、多态我们先来看一个小小的程序class A{ public void fun1(){ System.out.println("A1"); } public void fun2(){ this.fun1(); }}class B extends A{ public void fun1(){ System.out.println("B1")原创 2020-05-14 11:13:39 · 410 阅读 · 0 评论