
Java
文章平均质量分 59
从基础到深入,从玩轮子到写轮子,掌握世上最强脚本语言-Java
Thecoastlines
努力是为了让自己不再平庸
展开
-
面试官:序列化和反序列化为什么要实现Serializable接口?
文章目录前言1、什么是序列化和反序列化2、什么时候需要进行序列化和反序列化2.1、服务器和浏览器交互时用到了Serializable接口吗?2.2、前言最近在阅读别人的源码时,发现很多实体类都实现了Serializable接口,而且还指定了serialVersionUID,心中不免有些疑问(说实话是因为自己菜才有疑问????)Ⅰ.序列化和反序列化到底是什么?Ⅱ.到底什么时候需要进行序列化和反序列化?Ⅲ.为什么还要指定serialVersionUID的值呢?Ⅳ.1、什么是序列化和反序列化原创 2021-03-31 21:17:41 · 759 阅读 · 2 评论 -
你是否真正理解了泛型、通配符、类型擦除
泛型结????前言一、使用反射绕过编译时的类型检查二、为什么要引入泛型的呢?三、泛型的使用方式1.泛型类2.泛型方法3.泛型接口四、通配符的使用你是否还不知道为什么要引入泛型?你是否还不知道怎么使用泛型?你是否还不知道类型擦除?你是否还不知道怎么使用通配符?你是否还不知道泛型的使用场景?那么读上几分钟,让你的人生不再遗憾?哈撒给????前言泛型是JDK1.5引入的新特性,泛型提供了编译时类型检测安全机制。可能不是太好理解,下面使用代码演示没错,当你定义了泛型为Integer类型之后原创 2021-04-02 18:03:15 · 2413 阅读 · 7 评论 -
深入浅出Java值传递
傻冒1:最近翻看了很多关于值传递的文章,发现好多不同的见解,这果然是一个鱼龙混杂的时代,没错我就是那条咸鱼。傻冒2:哈????,进入今天的正题,带你从底层认识值传递。【希望优快云不要在商业化的道路上继续行走了】如果你拥有以下几个疑问,那么希望你花费你分钟看完这篇文章。让这篇文章凸显出它的价值。你是否还不了解值传递?你是否还认为Java也有引用传递?你是否认为基本类型就是值传递,引用类型就是引用传递?Java只有值传递举个简单的例子public class ValueTest {原创 2021-04-04 12:57:09 · 1060 阅读 · 6 评论 -
“==“和equals的区别是什么
2021年了,奉上我最喜欢的一句话“愿你孤独的努力都有回报,愿你前行的路上有人陪伴”;愿所有默默努力的人在某个时刻都可以一鸣惊人,我也希望你们可以一直坚持下去,你们也为了自己的目标而不断努力,我也始终相信,付出的努力终会有所回报。编程是一个漫长的过程,一旦技术积累到某个节点,终会成爆发之势。一起加油,健康最重要,远离ICU????最近突然浏览到了一篇“==”和“equals”的区别,突然觉得自己应该深入理解一下它们之间的区别了(哈,不找理由了,菜是原罪????)相信只要你学过编程,那么“==”和原创 2021-04-04 17:50:01 · 14199 阅读 · 5 评论 -
一个小小的String问题引发的血案
今天在项目中遇到了一个问题,然后我头铁的认为一直是bug,结果居然是String引起的,我一直没有往String这个点上去思考,直到debug之后… …(菜是原罪呀????) 不知道你对String了解多少呢?一般来说经常用过String的人都会说String是不可变的,你觉得呢? 这个不可变到底该怎么理解?是值?地址?还是其他不可变呢? String str = "a"; str = "b"; System.out.println(str);看上面这原创 2021-04-10 12:31:29 · 255 阅读 · 0 评论 -
浅析JVM是如何处理异常的?finally块必须执行的原理?
JVM是如何捕捉异常的?每个方法在经过Javac编译之后,都会附带一个异常表;看下面代码的字节码指令 public void method2() { try { int a = 1 / 0; } catch (Exception e) { e.printStackTrace(); } }在该异常表中有四个重要的概念,from指针、to指针、target指针、异常类型。from指针和.原创 2022-05-25 00:46:07 · 888 阅读 · 1 评论 -
浅析ThreadLocal的底层实现【线程隔离+内存泄漏】
❓首先ThreadLocal有什么作用?它最为突出的特点就是"线程隔离",可能你心中会疑问线程隔离是什么?此刻可以拿synchronized做对比,在并发环境下,synchronized将共享资源进行锁定,线程必须一个个的去挨个访问。而ThreadLocal它相当于每个线程都有一份该资源,然后线程之间对资源的操作是互不可见的;可以这样说:synchronized采用的是以时间换空间的方式,而ThreadLocal采用的是以空间换时间的方式。❓ ThreadLocal如何使用呢?第一个线程执行.原创 2022-05-18 00:00:27 · 417 阅读 · 0 评论 -
浅析CountDownLatch闭锁底层实现原理
🍀CountDownLatch是基于AQS同步器的一种同步工具,它可以让一个或多个线程等待,一直等到其他线程完成一组工作,它是AQS共享模式的实现。它的使用方式如下:查看它的内部实现,它的设计模型和ReentrantLock类似,都是内部定义了一个Sync继承了AQS同步器。而且CountDownLatch内部并没有太多的方法。首先查看它的构造方法,如果了解过ReentranLock的实现,那么你就会很熟悉了,老一套。✨与ReentrantLock中的Sync不同的是,它们虽然都是继承了AQ.原创 2022-05-17 14:32:51 · 392 阅读 · 0 评论 -
一文彻底搞懂ReentrantLock原理【基于AQS的公平锁+非公平锁】
🍀 JVM已经帮我们内置了synchronized关键字来实现同步,为什么还要引入Lock呢?首先需要明白synchronized是JVM层面的锁,Lock是API层面的锁,synchonized的灵活度是远不及Lock的;在JDK5时 Lock的效率是优于synchronized,在JDK6开始官方对synchronized进行了大量优化,包括锁升级、锁消除、锁粗化等,事实证明在锁竞争激烈的场景,ReentrantLock还是优于synchronized,但是synchronized还有增长空间,官方原创 2022-05-17 01:39:49 · 996 阅读 · 0 评论 -
从汇编角度理解CAS机制+浅析ABA问题
✨CAS全称"Compare And Swap",也就是"比较并替换";它涉及三个操作数:内存值、预期值、新值。只有当内存值和预期值一致时,才能将内存值修改为新值。📚CAS操作具有原子性,它的原子性由CPU硬件指令来保证;在HotSpot中...原创 2022-05-16 11:08:28 · 515 阅读 · 0 评论 -
深入HotSpot虚拟机源码探究synchronized底层实现原理【万字总结synchronized】
一、synchronized原理synchronized是Java中的关键字,无法通过JDK源码查看它的实现,它是由JVM提供支持的,所以如果想要了解具体的实现需要查看JVM源码(1)首先准备好HotSpot源码jdk8 hotspot源码下载地址:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/选择zip或者gz格式下载即可(2)解压,使用vscode或者其他编辑器打开src是hotspot的源码目录cpu:和cpu相关的一些操作os原创 2022-05-11 02:14:28 · 697 阅读 · 0 评论 -
【虚拟化】Dockerfile构建JDK镜像
1.准备压缩包2.编写Dockerfile文件vim DockerfileMAINTAINER:编写人ADD:解压路径ENV:环境变量配置3.构建镜像docker build docker build -t=“jdk1.8”4.查看构建之后的镜像docker images原创 2022-02-27 10:23:25 · 1111 阅读 · 0 评论 -
【大白话系列】深入浅出Cleaner+虚引用完成堆外内存的回收
在NIO技术中,使用allocateDirect()方法可以创建直接内存;如何释放该内存呢?(1)通过手动释放内存(Cleaner+虚引用)(2)交给JVM进行处理(Full GC)文章目录1.直接内存的创建与销毁2.通过Cleaner+虚引用完成堆外内存回收3.总结创建与销毁流程4.如何一步步顺序解读源码流程5.使用直接内存的利弊分析1.直接内存的创建与销毁base = UNSAFE.allocateMemory(size);在DirectByteBuffer类构造方法中,主要通过al原创 2021-11-22 16:55:41 · 2022 阅读 · 5 评论 -
深入浅出在NIO技术中,如何理解直接缓冲区要比非直接缓冲区效率高?
如何理解两者之间的效率高,主要是从allocate()方法和allocateDirect()这两个方法的源码进行分析文章目录1.直接缓冲区的底层创建源码2.非直接缓冲区的底层创建源码3.非直接缓冲区与直接缓冲区的具体实现1.直接缓冲区的底层创建源码直接缓冲区的创建通过allocateDirect()方法实现可以看出它主要是通过DirectByteBuffer类来实现的(通过DirectByteBuffer直接操作Native内存)通过这个构造函数可以看出它主要是通过UNSAFE类实.原创 2021-11-22 14:18:03 · 574 阅读 · 1 评论 -
深入浅出Java复用类【从字节码角度看toString调用机制、对象代理、组合与继承、转型、final、初始化】
这个世界上有10种人:一种是懂二进制的,一种是不懂二进制的你觉得类是在什么时候被加载的?【访问static域时,为什么?看完9就明白了】文章目录1、深入理解Java中toString方法的调用机制1.1.关于Java代码层面的toString的调用机制1.2.从字节码角度剖析toString观察toString方法的调用1.3.为什么如果没有重写toString()方法就会打印类似的地址呢?2、深入字节码探究基类与导出类的构造初始化2.1.如何理解继承中基类与导出类之间的关系2.2.如何理解基类与导.原创 2021-11-18 15:24:45 · 1046 阅读 · 2 评论 -
字节码编辑器JClassLIb下载教程
下载地址:https://github.com/ingokegel/jclasslib/releases不同的系统下载不同的软件即可。原创 2021-10-10 20:59:48 · 1404 阅读 · 0 评论 -
二进制代码查看器Binary Viewer下载教程
1.首先进入腾讯软件中心(在其他地方下载会包含一些恶意软件)地址:https://pc.qq.com/detail/16/detail_163136.html2.搜索即可3.选择普通下载即可4.测试将.class文件直接拉进去即可显示出二进制代码(如下图)...原创 2021-10-10 20:46:15 · 1849 阅读 · 0 评论 -
Java8函数式接口编程【lambda表达式、FunctionalInterface注解、Supplier、Consumer、Predicate、Function函数式接口】
1、函数式接口的定义2、FunctionalInterface注解3、函数式接口的使用4、lambda延迟执行特性5、Supplier函数式接口6、Consumer函数式接口7、Predicate函数式接口8、Function函数式接口1、函数式接口的定义有且仅有一个抽象方法的接口函数式接口顾名思义就是函数式编程的接口,在Java中最能体现函数式编程的无非就是Lambda,所以函数式接口是可以适用于Lambda使用的接口;只有确保只有一个抽象方法,Lambda才能顺利地推导2、Funct.原创 2021-10-07 14:34:29 · 423 阅读 · 0 评论 -
【GitHub加速工具,让你的GitHub、StackOverflow网站流畅度快到飞起,建议收藏~】
优快云下载地址:https://download.youkuaiyun.com/download/Kevinnsm/22038644Github地址:https://github.com/docmirror/dev-sidecar一、使用步骤二、GitHub介绍https://github.com/docmirror/dev-sidecar原创 2021-09-09 18:46:20 · 725 阅读 · 0 评论 -
【如何在IDEA中修改连接git远程库中的密码,史上最详细,建议收藏!】
如上图所示,当我们第一次连接并记住密码之后,如果后来我们修改了gitee的登录密码,那么我们如何修改默认的密码呢?1.打开控制面板2.用户账户3.管理window凭据4.修改原创 2021-09-08 17:17:50 · 1221 阅读 · 0 评论 -
【如何利用idea提交本地代码到git远程仓库,史上最详细教程,建议收藏!】
1.首先在gitee上注册一个账号2.在gitee创建一个远程仓库3.idea配置git注意git要提前下载配置好4.建立一个简单项目5.建立本地仓库本地仓库选择在本项目即可6.建立本地仓库与远程库连接7.提交代码到远程库中8.成功!...原创 2021-09-08 16:53:37 · 14467 阅读 · 2 评论 -
【Linux环境下安装Maven与环境配置简易教程】
1.首先下载maven安装包maven下载地址:https://maven.apache.org/download.cgi有两种实现方式第一种:(linux命令下载)wget https://downloads.apache.org/maven/maven-3/3.8.2/binaries/apache-maven-3.8.2-bin.tar.gz第二种:下载到window,然后传输到linux即可2.解压缩tar -zxvf apache-maven-3.8.2-bin.tar.原创 2021-09-07 22:15:06 · 350 阅读 · 0 评论 -
【深度解析RBAC用户-角色-权限设计方案,以及核心逻辑代码的讲解】
首先对于b2b、b2c等这一些网站后台,一般情况下都需要权限管理的设计与实现,对于这部分,通常是固定不变的,每次只需要做少量的改动即可。如何设计这几张表呢?RBAC(基于角色的访问控制),也就是用户通过角色与权限进行关联;一个角色拥有多个角色,一个角色拥有多个权限;这样就构成了下图中的用户-角色-权限的授权模型;用户与角色之间、角色与权限之间一般是多对多的关系。对于一对多关系表的设计中,我们一般是多的那一方多加入一个字段即可;而对于多对多关系表的设计,一般来说我们要借助第三方表这五张表.原创 2021-09-06 19:39:15 · 898 阅读 · 0 评论 -
整理Java相关的工具类Utils,持续更新中,建议收藏【目前更新至24】
下载地址:BigDecimalUtilBigDecimalUtil计算工具类CaptchaUtil图片验证码工具类CoordinateTransformUtil坐标系转换工具类DateUtil日期加减工具类EmailUtilemail发送工具类EncodeDecodeUtil加密工具类GzipUtil压缩工具类HttpClienthttp远程调用工具类JwtUtiljwt工具类LanguageUtil语种工具类.原创 2021-09-05 23:36:12 · 1421 阅读 · 2 评论 -
【static关键字的作用是什么?它用在什么场景?static关键字深度解析来袭】
2021/9/4/18:37文章目录1、一般情况下类的创建2.一般情况下类创建产生的问题2.1、第一种情况如何使用static解决2.2、第二种情况如何使用static解决3.如何调用static修饰的属性或方法4.静态变量、方法和非静态变量、方法之间的调用问题5、有关static相关的案例6、静态代码块7、静态代码块的作用以及需要注意的细节1、一般情况下类的创建一般情况下,只有当我们执行new来创建对象时,才能为数据分配存储空间;其中的方法或者属性才能被外界调用2.一般情况下类创建产生的.原创 2021-09-04 23:18:43 · 1050 阅读 · 0 评论 -
网站如何接入微信支付功能?微信支付详细教程它来了(建议收藏)
2021/9/3/23:23文章目录原创 2021-09-04 15:38:34 · 14182 阅读 · 1 评论 -
第三方微信登录教程
2021/9/3文章目录一、前置准备二、微信登录流程分析第一步:请求code第二步:通过code获取access_token第三步:通过access_token调用接口三、接口核心代码详解1、编写生成微信二维码接口2、编写回调接口一、前置准备首先要去微信开放平台进行开发者资质认证地址:https://open.weixin.qq.com/腾讯的东西你肯定也明白(白嫖不可能滴—>需要审核费)当通过认证之后,需要记录下来三个核心参数1、appid2、app3、redirec.原创 2021-09-03 22:19:59 · 9058 阅读 · 4 评论 -
接入腾讯云短信服务(史上最详细+该短信服务如何申请成功+发送短信验证码API讲解+相关错误分析)
2021/8/17/23:01{2021/8/17/23:01}2021/8/17/23:01文章目录前言一、如何成功申请到腾讯云短信服务1、签名申请2、正文模板申请二、发送短信API开发1、腾讯云在线测试2、使用springboot进行测试三、常见的错误分析前言或许有的人会问我为什么不使用阿里云短信服务,那是因为如今的阿里云短信服务对于大部分人来说很难申请成功,它需要备案或者项目已经上线。而腾讯云短信相对来说比较宽松一些,可以利用个人公众号进行申请成功提示:以下是本篇文章正文内容一、如.原创 2021-08-18 00:55:05 · 16054 阅读 · 26 评论 -
腾讯云短信出现there are both domestic mobile phone numbers and international mobile phone numbers in the...
以上是短信发送响应结果{以上是短信发送响应结果}以上是短信发送响应结果可以看出原因是:请求中既有国内手机号码,也有国际手机号码从中可以分析出是请求参数出现问题,肯定是手机号参数无疑。仔细一看就明白了,我们没有在手机号最前面加入86,系统无法识别而导致的错误。手机号前加入86,再次测试即可成功{手机号前加入86,再次测试即可成功}手机号前加入86,再次测试即可成功...原创 2021-08-17 22:33:32 · 2940 阅读 · 0 评论 -
使用腾讯云短信服务技术出现FailedOperation.TemplateIncorrectOrUnapproved
以上是测试短信发送响应结果其中的message的值可以看出:原因是模板未批准或请求内容与批准的模板内容不匹配由于我们的模板申请已经通过所以我们可以肯定错误出现在模板内容不匹配上此时我们可以发现模板内容中有一个{1}参数,也就是我们必须要设置该参数的值,否者就会报该错误由于我们的模板内容只有一个参数,所以只需要填入一个值即可,这个上面这个参数就是验证码,只不过是我用RandomUtil随机生成的(这个类需要自己编写)再次测试,即可成功(记得手机号前要加入86)...原创 2021-08-17 22:21:56 · 2992 阅读 · 0 评论 -
简单几步让你实现本地jar包引入到maven当中
2021/8/14{2021/8/14}2021/8/14本文目录1、为什么要了解该操作流程2、操作流程1、为什么要了解该操作流程众所周知,有的jar包不能通过maven从远程仓库直接下载引入,可能是引入该jar包未开源,比如阿里的视频点播技术当中的aliyun-java-vod-upload,该jar包处于闭源状态;还有一些其他的原因会造成引入jar包失败,所以本文还是要了解的,说不准哪天你就碰到了。提示:以下是本篇文章正文内容2、操作流程我以redis的连接池commons-po.原创 2021-08-14 18:25:06 · 2144 阅读 · 2 评论 -
那些年,我的数据结构课设,现在满满的回忆!(现如今身处内卷之中,已经很难出现当初那份乐趣了)
一、看到这个图标很有感觉距离当初完成数据结构课设已经过去很久很久了,当初由于U盘失踪,也丢失了很多宝贵的东西,我也伤心的好久`(>﹏<)′!不过最近找到了失散多年的亲兄弟,打开U盘,感概万千!里面很多东西都是自己刚入门时的记录,翻开一篇数据结构课设#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct PolyLNode{ float coef; int exp原创 2021-06-08 11:14:30 · 857 阅读 · 23 评论 -
云服务器Linux jdk安装详解(centos8)
1、使用阿里云服务器演示jdk的安装教程(我不是为阿里云打广告的)2、使用xshell作为云服务器的远程连接工具,使用xftp作为本地windows和云服务器的文件传输工具(注意我真不是打广告的)文章目录1、前置准备2、jdk的安装3、配置环境变量4、测试1、前置准备JDK的下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html下载到本地之后,使用xshell连接云服务器,xftp用于.原创 2021-04-27 11:03:28 · 1114 阅读 · 1 评论 -
2021年Java后端技术知识体系
从第一阶段到第九阶段按顺序学习,一般来说学完前五阶段就可以去实习了,自己也是时候对所有技术知识进行分模块总结了 -----2021/1/22摘自:韩老师原创 2021-01-22 11:02:17 · 728 阅读 · 2 评论 -
第一阶段:Java基础之变量
1.实例变量 #实例变量只能在类种声明,必须在构造函数、方法、任何块之外#实例变量只能通过创建对象使用,当使用new创建对象,实例变量也同时被创建,当垃圾回收器回收对象时,实例变量也被销毁#当在堆中给对象分配空间时,为每个实例变量分配一块区域#实例变量都有自己的默认值(默认值byte-0,short-0,int-0,long-0L,float-0.0f,double-0.0d,char-\u0000,boolean-false)#每个对象都有一个实例变量副本,因此在对象中修改实例变量的值不会对其.原创 2021-01-22 20:55:49 · 176 阅读 · 0 评论 -
第一阶段:Java基础之控制结构
1.顺序结构按照顺序控制结构运行,即语句从上到下,从左到右2.选择结构if..else..语句switch..case..语句3.循环结构while循环do...while & while...dofor原创 2021-01-23 17:35:32 · 188 阅读 · 0 评论 -
第一阶段:Java基础之OOP
OOP:面向对象编程三大特征:封装继承多态原创 2021-01-23 19:12:57 · 191 阅读 · 0 评论 -
第一阶段:Java基础之数组
注意点:@Java语言是把数组当作一个“对象”来看待的 @把数组分为两部分看,一部分是数组的引用,放置在栈内存中,一部分是数组对象,放置在堆内存中@数组的引用可以指向任何有效的内存,只有当数组的引用指向有用的内存时,才可以通过数组变量访问数组元素@如果引用数组对象的数组引用是局部变量,那么这个数组对象存放在栈内存中栈内存和堆内存 @当一个方法执行时,这些方法都会建立自己的内存栈,定义在方法内部的局部变量会被放入到栈内存中;伴随着方法的执行结束,栈内存也被销毁@在内存中创建对象时,这个对象会被放原创 2021-01-24 18:19:57 · 218 阅读 · 0 评论 -
第一阶段:Java基础之API
…待写原创 2021-01-24 19:04:56 · 178 阅读 · 0 评论 -
第一阶段:Java基础之异常和处理
文章目录Java中异常处理机制的简单和应用一、异常的体系结构&分类二、问题扩展三、应用场景Java中异常处理机制的简单和应用异常也是一种对象,Java中有很多异常类,并且定义了基类Java.lang.Throwable为许多异常类的超类许多异常类的继承结构查看API文档一、异常的体系结构&分类题目分析 *什么是异常? 异常指的是程序的不正常,简单理解就是程序所发生的错误 *异常的体系结构&分类: 分类: 1.编译时异常:指的是编译期间,编译器检测到某段代原创 2021-01-25 20:01:18 · 163 阅读 · 0 评论