![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 83
呆东
小菜鸡也有大梦想,努力拼搏,就是为了给那些曾经看轻你的人一记响亮的耳光
展开
-
java线程详解
线程状态在java.lang.Thread.State这个枚举类中定义了6种线程,如下图所示New:尚未启动的线程的线程状态。Runnable:可运行线程的线程状态,等待CPU调度(分两种情况,正在运行,另一种等待cpu来执行)。Blocked:线程阻塞等待监视器锁定的线程状态。处于synchronized同步代码块或方法中被阻塞。Waiting:等待线程的线程状态。下列不带超时的方式:Object.wait、Thread.join、LockSupport.parkTimed Waiting原创 2021-04-11 15:54:38 · 814 阅读 · 0 评论 -
Java SPI机制
定义SPI全称为Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,通过SPI实现接口编程,通过 SPI 服务加载机制进行服务的注册和发现,可以有效的避免在代码中将服务提供者写死。从而可以基于接口编程,实现模块间的解耦,方便我们在代码中进行扩展实现。实现步骤在 META-INF/services/ 目录中创建以接口全限定名命名的文件。 文档的内容,是每个接口的实现类全类名。 使用 ServiceLoader 类动态加载配置文件中的具体实现原创 2021-02-17 12:05:35 · 901 阅读 · 1 评论 -
与架构师一步之差 —— 注解和反射
一、注解简介:注解(Annotation)是java5引入的一种代理辅助工具,它的核心作用是对类、方法】变量、参数和包进行标注,通过反射来访问这些标注信息,以此在运行时改变所注解对象的行为。java中的注解由内置注解和元注解组成。元注解:元注解只要包括四个,用来修饰注解的作用。@Retention定义注解的生命周期:【source -> class -> runtime】主要是作用在runtime时。 @Documented文档注解,会被javadoc工具文档化 @Inherit原创 2020-06-14 19:47:35 · 156 阅读 · 0 评论 -
了解虚拟机——类加载过程
类加载的整个过程如下图所示:包括加载,验证,准备,解析,初始化,使用,卸载整个流程。一、加载目的:通过一个类的全限定名来获取定义此类的二进制字节流,并将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,并在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。其中获取Class文件可以有如下途径: 1.从zip压缩包中读取; 2.从网络中获取; 3.运行时计算生成; 4.由其他文件生成; ...原创 2020-05-11 22:47:54 · 168 阅读 · 0 评论 -
详解虚拟机识别的Class类文件结构信息
一、魔数每个class的头4个字节叫做魔数,用来表示这个文件是不是能被虚拟机所识别的文件。这个值就是cafebabe(咖啡宝贝)。二、版本号class文件中,第5和第6个字节表示的是java的此版本好,第7和第8个字节是主版本号,上图中0034表示的是10进制的52,也就是java8的版本。依次类推,JDK7表示51,JDK6表示50。三、常量池常量池可以作为class文件...原创 2020-05-07 22:34:31 · 605 阅读 · 0 评论 -
详解java程序一个new的过程
在java的世界里,只要当我们去创建一个对象时,都是通过关键字去new的,那么当我们写完这个new之后,我们的程序是怎么帮我们生成这个对象的呢?带着这个问题,我们一起来讨论一下:首先当虚拟机接受到new的字节码指令的时候,先要去常量池中,看能否找到这个类的符号引用信息;当我们没有找到的这个信息的时候,就会去执行这个类的加载信息过程;加载完成后,java虚拟机就会给我们创建的对象去分配内存。...原创 2020-04-23 22:39:26 · 593 阅读 · 0 评论 -
使用idea对多线程进行调试
首先展示我们的调试代码示例:public class UnsafeArrayList { static ArrayList al = new ArrayList(); static class AddTask implements Runnable { @Override public void run() { t...原创 2020-04-20 21:31:27 · 654 阅读 · 0 评论 -
一文读懂netty对javabytebuf的增强
一、JDKByteBuffer的缺点1.无法动态扩容:长度是固定,不能动态扩展和收缩,当数据大于ByteBuffer容量时,会发生索引越界异常。2.API使用复杂:读写的时候需要手工调用flip()和rewind()等方法,使用时需要非常谨慎的使用这些api,否则很容易出现错误。二、ByteBuf做的增强方面1.API操作便捷性2.动态扩容3.多种ByteBuf实现4....原创 2020-04-12 21:54:06 · 344 阅读 · 0 评论 -
使用zookeeper实现分布式锁
在zookeeper中,根据zookeeper的特性,我们有两种方式来实现分布式锁。实现方式一:在zookeeper节点下面,让需要获得锁的程序,都去创建名为Lock的临时节点,因为多实例创建的节点名称相同,只会有一个实例创建节点成功,那么这个实例就可以获得锁,就可以去执行本身代码逻辑,其他没有创建成功的实例,就去注册一个watch去监听Lock节点,当抢到锁的实例执行完本身程序后,就会去...原创 2020-03-01 17:10:29 · 1486 阅读 · 3 评论 -
idea编写类和方法的自定义注解
类的自定义注解模板:File —> Settings —> Editor —> File and Code Templates ——> Files ——> Class;然后自定义自己的注解模板/** * @Description:${TODO} * @Author hdd * @Date ${DATE} ${TIME} */publ...原创 2020-02-27 15:45:25 · 700 阅读 · 0 评论 -
activemq安装及简单使用
准备工作:首先去官网下载activemq的安装包,官网地址:http://activemq.apache.org/activemq-5158-release.html然后将安装包上传到服务器上。1.解压安装包:tar -zxvf apache-activemq-5.15.8-bin.tar.gz -C2.修改文件名称,并进入activemq的bin目录下:mv /va...原创 2019-08-24 16:30:19 · 431 阅读 · 0 评论 -
深入理解synchronized关键字
同步关键字的用法当使用synchronized关键字修饰普通方法时,加锁对象就是Object,对静态方法,静态代码块加synchronized关键字,加锁对象就是Class对象。jvm对synchronized锁优化锁优化:当一个对象在单个线程中使用,并且多次调用synchronized进行加解锁操作时,JIT编译就会对方法进行优化,消除加锁操作。比如如下代码:StringBuf...原创 2019-08-06 00:30:31 · 156 阅读 · 0 评论 -
理解jvm —— 类加载机制
一、类的生命周期1.加载 —— 读取二进制内容。2.验证 —— 验证class文件格式规范、语义分析、引用验证、字节码验证。3.准备 —— 分配内存、设置类static修饰的变量初始值。4.解析 —— 类、接口、字段、类方法等解析。5.初始化 —— 为静态变量赋值;执行静态代码块。6.使用 —— 创建实例对象。7.卸载 —— 在jvm方法区中进行卸载。二、类加载器...原创 2019-07-05 00:36:56 · 180 阅读 · 0 评论 -
理解jvm —— 垃圾回收机制
一、java的垃圾回收策略java采用的是自动垃圾收集策略,并不需要我们在程序代码中进行手动的垃圾回收,自动垃圾收集是查看堆内存,识别正在使用那些对象以及那些对象未被删除和删除未使用对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针,程序的任务部分都不再引用未使用的对象或未引用的对象,因此可以回收未引用对象使用的内存。二、如何确定内存需要被回收1.标记。这...原创 2019-07-07 16:57:26 · 254 阅读 · 0 评论 -
使用CORS解决跨域问题
一、产生跨域的原因:浏览器会向服务器发送一个Option方法的预检请求,如果服务器拒绝响应,浏览器就无法访问。因此我们可以针对Option请求来处理跨域问题。二、解决办法:在spingboot中针对option请求添加一个准入机制:@SpringBootApplicationpublic class BackendApp { public static void m...原创 2019-06-25 22:09:20 · 1338 阅读 · 0 评论 -
巧妙利用注解+aop实现关联查询
需求:在不实用关联查询时,如果更优雅的实现两个表的查询并组合在一起返回。1.首先定义两个注解:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface NeedSetFiledValue {}@Target(ElementType.FIELD)@Retention(Ret...原创 2019-06-16 14:01:53 · 693 阅读 · 0 评论 -
基础数据结构——图、DFS、BFS
一、图定义:是一种比线性表和树更为复杂的数据结构,在图形结构中结点之间的关系可以是任意的,任意两个数据元素都可能存在相关性,因此图论在计算机中应用相当广泛,例如:知识图谱、推荐算法等。图的基本元素: 1.结点:在图中的数据元素称为结点。 2.弧(边):在图中各结点之前的关系用弧(边)表示。 3.有向图:如果图中的边是带方向的,这称为有向图。 4.无向图:如果图的边是...原创 2019-05-22 01:00:53 · 409 阅读 · 0 评论 -
基础数据结构——树、二叉树
一、树定义:树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样特点:1.有一个根结点,称为root结点。2.每一个元素都被称为node。3。除了root结点外,其余的结点都会被分成n个互不相交的集合,并且每个子集又都是一个树。基本术语:1.结点:树形结构里面的元素2.子树:当结点大于1的时候,其余的结点分为互不相...原创 2019-05-12 10:40:53 · 162 阅读 · 0 评论 -
基础数据结构——二叉搜索树、红黑树
一、二叉搜索树1.定义:二叉搜索树,又称二叉排序树,若它的左子树不为空,则左子树的结点都小于根结点;若它的右子树不为空,则右子树的结点值都大于根结点,并且子树同样遵循这个原则。(为什么叫二叉排序树呢?因为对这个树进行中序遍历是有序的。)2.好处:使用二叉搜索树,进行数据查找时,时间复杂度为logn,有利于数据的查找。3.缺点:有时在特殊情况下,会退化成一个链表的结构,失去其查找的优越性...原创 2019-05-14 23:01:18 · 414 阅读 · 0 评论 -
controller层的引用service层一直报空指针问题
注入的service层一直报空指针的错误,原因就是controller层有个方法是private的方法,将这个private改为public问题即可解决解决后的:原创 2018-07-03 14:07:30 · 11041 阅读 · 4 评论 -
阿里云通过邮箱发送验证码
1.首先导入所需要的jar包,在pom.xml加入 <!--发送邮件的jar包--> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</原创 2018-07-17 15:37:53 · 3050 阅读 · 6 评论 -
SpringMVC概述
一、传统Model和MVC设计思想对比Model1开发模式:整个Web应用几乎全部由jsp页面组成,jsp页面接受处理客户端请求,对请求处理后直接做出响应。用少量的JavaBean来处理数据库连接、数据库访问等操作。Model2是基于MVC架构的设计模式,Servlet作为前端控制器,负责接收客户端发送的请求。在Servlet中只包含控制逻辑和简单的前端处理;然后调用JavaBean来完成...原创 2018-07-18 23:37:51 · 395 阅读 · 0 评论 -
SpringMVC常用注解
一、@Controller注解1.作用:@Controller用于标记一个类,使用它标记的类就是一个SpringMVC Controller对象,即一个控制器类。Spring使用扫描机制查找应用程序中所有基于注解的控制器类。2.使用步骤:先在SpringMVC的配置文件的头文件中引入spring-context,然后使用<context:component-scan/>元素,该...原创 2018-07-25 23:30:54 · 197 阅读 · 0 评论 -
java调用MQTT的后台代码 和 js调用MQTT
一、java后台调用MQTT准备工作:需要导入的jar包 <!-- mqtt依赖包--> <dependency> <groupId>org.fusesource.mqtt-client</groupId> <artifactId>mqtt-client</artifactId> &l...原创 2018-07-31 10:07:36 · 3775 阅读 · 2 评论 -
java各种类型与json进行转化的工具类
package com.jugan.utils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.beans.IntrospectionException;import java.beans.Introspector;import java.b...原创 2018-08-03 09:32:30 · 249 阅读 · 1 评论 -
mysql保存表情问题
今天进行微信绑定时,数据库一直报下面这个错误:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8C\x99' for column 'f0014' at row 2查询资料发现是因为表情导致的问题,现提供两个解决方法:一、修改数据库的编码集。1.一般数据的编码集是utf-8,但是utf-8不能保存表情,需要将ut...原创 2018-09-29 10:36:18 · 1926 阅读 · 0 评论 -
什么是RESTful风格的API
一、含义什么是restful,引用百度百科中的解释就是:一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。二、传统API和RESTfulAPI有何差异传统api和RESTful API对比 传统API RESTfulAPI 查询 /...原创 2018-12-04 11:42:29 · 3428 阅读 · 0 评论 -
java小技巧 —— 自动关闭资源的try语句
当我们在进行io流处理数据的时候,在最后需要把我们的流资源释放掉,一般就加载finally语句后面,来确保资源的关闭,一般代码书写如下:public static void main(String[] args) { InputStream is = null; try { is = new FileInputStream("sourc...原创 2018-12-27 15:52:28 · 828 阅读 · 1 评论 -
Linux下安装jdk和配置环境变量
1.首先根据自己需要的jdk版本去官网下载。2.在linux(centos系统)中,运行如下命令:rpm -qa | grep jdk ,查看是否默认下载了openjdk等软件我这里已经删除了,如果有,则执行卸载命令:sudo yum remove XXX(XXX为上一个命令查到的结果)。3.将下载下的文件进行权限赋予:sudo chmod 777 文件名。其中第一个7代表用户(u...原创 2019-02-15 14:18:34 · 924 阅读 · 0 评论 -
针对面试谈谈LinkedList和ArrayList的区别
1.说一下LinkedList和ArrayList的区别:从数据结构上进行分析:LinkedList的实现是采用了链表的结构,而ArrayList的底层实现是数组。ArrayList的查询速度快,但是添加、删除的操作慢;LinkedList查询速度慢,但是添加、删除操作快。2.为什么LinkedList的查询效率比ArrayList的查询效率慢呢?因为LinkedList的是链表结...原创 2019-02-27 23:28:30 · 216 阅读 · 0 评论 -
深入理解NIO
一、什么是BIOBIO:又叫阻塞io,例如我们进行socket网络编程的,当服务端没有接到客户端的连接时,这时服务端就回处于阻塞状态,当处于阻塞状态时,我们无法在对程序进行操作。二、BIO存在的问题当我们的程序阻塞时,会对服务端造成什么影响呢?—— 当阻塞时,回影响并发请求,无法处理多个请求!为了解决这个问题这时,我们就需要引入多线程来解决这个问题 —— 当进行io操作的时候,每个...原创 2019-02-20 22:14:40 · 252 阅读 · 0 评论 -
记一次HashMap面试经历
一、首先说一下HashMap中几个重要参数即默认桶的数量为16,一般第一次扩容时会扩容到64,之后为2倍的扩容loadFactor译为装载因子,默认为0.75,装载因子用来衡量HashMap满的程度最大容量: 2^ 30 次方树形阈值:JDK 1.8 新增的,当使用 树 而不是列表来作为桶时使用。必须必 2 大,也就是当桶后的链表大于8时,链表会升级为红黑树...原创 2019-03-13 23:05:10 · 232 阅读 · 0 评论 -
记一次git clone 远程代码报错
直接上错误图片:因为是第一次拉取线上项目,项目过大,导致每次拉取都报错,所以需要设置一个git的最大缓存大小。解决方法:git config --global http.postBuffer 524288000在终端使用上述命令,问题即可解决。...原创 2019-03-26 13:45:33 · 448 阅读 · 0 评论 -
常见的排序算法
1.冒泡排序定义:比较相邻的元素。如果第一个比第二个大,就交换他们两个;走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。例如:对一个数组进行从小到达的排序,代码实现如下:ublic class ChooseSort { public static void main(String[] args) { int[] array ...原创 2019-04-18 23:23:47 · 81 阅读 · 0 评论 -
工作中遇到的异常(持续更新中。。。。)
对于工作中出现的异常,特做记载,帮助自己记忆,也希望可以帮助到其他遇到相同问题的人。1.com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 解决方案:没有连接上数据库,看是否是数据库的配置有问题。2.org.springframework.beans.fa...原创 2018-06-27 19:19:32 · 311 阅读 · 0 评论