
Java
文章平均质量分 83
我不是臭弟弟
好吃懒做 无所不为
展开
-
Tomcat打破双亲委派
复习复习JVM类加载机制,再谈谈 Tomcat 的类加载器如何打破 Java 的双亲委托机制。JVM 的类加载器Java 的类加载,就是把字节码格式“.class”文件加载到 JVM 的方法区,并在 JVM 的堆区建立一个java.lang.Class对象的实例,用来封装 Java 类相关的数据和方法。那 Class 对象又是什么呢?你可以把它理解成业务类的模板,JVM 根据这个模板来创建具体业务类对象实例。JVM 并不是在启动时就把所有的“.class”文件都加载一遍,而是程序在运行过程中用到了这个原创 2021-05-16 23:12:29 · 416 阅读 · 1 评论 -
零拷贝
传统 IO 问题传统的 IO 将一个文件通过 socket 写出File f = new File("helloword/data.txt");RandomAccessFile file = new RandomAccessFile(file, "r");byte[] buf = new byte[(int)f.length()];file.read(buf);Socket socket = ...;socket.getOutputStream().write(buf);内部工作流程是原创 2021-03-31 21:10:17 · 309 阅读 · 0 评论 -
NIO基础--三大组件
non-blocking io 非阻塞 IO1. 三大组件1.1 Channel & Bufferchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层#mermaid-svg-cW8kro41NMvXWohD .label{font-family:'trebuchet ms', ver原创 2021-03-23 22:01:35 · 247 阅读 · 0 评论 -
Flink 1.10.1 Cannot find compatible factory for specified execution.target (=local)n编辑器1
前言学习flink时写的一个本地demo在测试过程中报错,一个很简单的word count代码package com.ieg.wc;import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.java.DataSet;import org.apache.flink.api.java.ExecutionEnvironment;import org.apache.flink.api原创 2021-01-05 21:46:58 · 227 阅读 · 0 评论 -
单点登录
单点登录什么是单点登录?单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分1、登录 相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授原创 2021-01-01 02:42:22 · 293 阅读 · 0 评论 -
Java线程中start和run的区别
start()它的作用是启动一个新线程。通过start()方法来启动新线程,处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行相应线程的run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程随即终止。start()不能被重复调用。用start方法来启动线程,真正实现了多线程运行,即无需等待某个线程的run方法体代码执行完毕就直接继续执行下面的代码。这里无需等待run方法执行完毕,即可继续执行下面的代码,即进行了线程切换。run()r原创 2020-12-13 18:51:27 · 1248 阅读 · 0 评论 -
静态方法中直接使用注入的bean对象
项目场景:最近做学校一个项目,最后接入SpringBoot单点登陆,接口啥的都是对的,就是登陆成功后回调给我的东西很奇怪为什么是分号,我人为改成问号就ok。问题描述:查看报错org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String ";"就是分号的原创 2020-11-30 21:28:39 · 1009 阅读 · 0 评论 -
Java中的锁
]1.乐观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程转载 2020-11-08 22:21:51 · 120 阅读 · 1 评论 -
ArrayList是如何实现序列化的
从jdk源码中可以看出 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA * w原创 2020-11-01 22:32:18 · 2384 阅读 · 0 评论 -
nginx转发后如何获取真实的ip地址
前言最近做一个团队的打卡系统,需要通过连接实验室WiFi来判是否人在实验室,网上千篇一律的获取主机ip的方法由于我使用了nginx反向代理,导致获取到的ip地址为127.0.0.1,这肯定是不符合我们验证标准的,还有就是失去了校验的意义了。正确姿势nginx配置这样配location / { proxy_pass http://localhost:8090; proxy_set_header X-Real-IP $remote_addr;原创 2020-09-05 10:35:09 · 6081 阅读 · 0 评论 -
dubbo入门学习
众所周知,看官方文档是程序员的优良传统:dubbo文档原创 2020-09-01 00:02:28 · 121 阅读 · 0 评论 -
intern()的使用:jdk6 vs jdk7/8
总结String的intern()的使用:jdk1.6中,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址。jdk1.7开始,将这个字符串尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址。...原创 2020-08-28 21:49:46 · 159 阅读 · 0 评论 -
说一说八种基本数据类型及其包装类
简介Java基本数据类型分为四大类:整数型:byte,short,int,long浮点型:float,double逻辑型:boolean字符型:char原始类型原始类型所占的字节包装类byte1个字节Byteshort2个字节Shortint4个字节Integerlong8个字节Longfloat4个字节Floatdouble8个字节Doubleboolean1个字节Booleanchar2个字节Ch原创 2020-08-28 19:28:23 · 909 阅读 · 0 评论 -
JVM内存分配策略(或对象提升(Promotion)规则)
针对不同年龄段的对象分配原则如下所示:优先分配到Eden大对象直接分配到老年代(尽量避免程序中出现过多的大对象)长期存活的对象分配到老年代动态对象年龄判断(如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄)空间分配担保(-XX:HandlePromotionFailure)...原创 2020-07-30 00:07:48 · 226 阅读 · 0 评论 -
动态规划和滑动窗口解决最长重复子数组
问题描述给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。提示:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100动态规划这题一看就知道其实就是求最长公共子串问题,我们就以题中的示例画个图来看一下。最长的公共子数组就是上面红色所对应的[3,2,1原创 2020-07-21 15:03:05 · 349 阅读 · 0 评论 -
jdk源码学习——StringBuilder和StringBuffer源码分析
StringBuilder和StringBuffer源码分析前言javadoc小结分析类的声明成员变量看几个常见方法的不同实现StringBufferStringBuilderStringBuilder.toString()StringBuffer.toString()底层扩容机制两者对比总结思考前言StringBuilder和StringBuffer是两个容易混淆的概念,本文从源码入手,简单看二者的异同。容易知道的是,这两者有一个是线程安全的,而且线程安全的那个效率低。javadoc小结java原创 2020-07-18 10:07:05 · 569 阅读 · 0 评论 -
jdk源码学习——AbstractStringBuilder类
类图结构类的申明1.默认访问控制修饰符,说明只能在包内使用,即只能在JDK内部使用,可能有人会问我创建一个java.lang包然后里面的类就可以使用AbstractStringBuilder类了,想法不错,但jkd不允许,会报SecurityException : Prohibited package name: java.lang。故这个类只是给StringBuffer和StringBuilder类使用的。2.类名用abstract修饰说明是一个抽象类,只能被继承,不能直接创建对象。查了里面的方法原创 2020-07-17 20:08:15 · 248 阅读 · 0 评论 -
jdk源码学习——String类
String类String类String类属性String类构造函数String类的常用方法equalscompareTohashCodeconcatreplacetrimintern其他常用的简单方法总结String类String类被final所修饰,也就是说String对象是不可变量。String类实现了Serializable, Comparable, CharSequence接口。Comparable接口有compareTo(String s)方法,CharSequence接口有length原创 2020-07-17 13:28:58 · 496 阅读 · 0 评论 -
jdk源码学习——你真的了解Object源码吗
前言Object应该算是比较简单的源码了。Object是类层次结构的根,Java体系里面的每个类默认都有一个超类就是 Object。总之,所有对象,包含数组,都默认实现该类的方法。主体框架native关键字因为 Object 类里面有很多地方都用到 native 关键字。我们先了解一下这家伙。native 关键字是 JNI(Java Native Interface)的重要体现。什么是 JNI ,JNI 是Java调用其他语言(c,c++) 的一种机制。native 关键字修饰的是方法,起声明作用原创 2020-07-17 00:26:53 · 181 阅读 · 0 评论 -
简单实用的IDEA搭建JDK1.8阅读环境
1、新建一个HelloWorld的java程序。2、将JDK目录下的src.zip解压并将下面的文件夹放入新程序的src包下3、如果启动程序报内存不足File->Settings->Build,Execution,Deployment->Compiler->Build process heap size(Mbytes): 将 700 改为 1000)4、Project Structure->Project Settings->Libraries下左上角有个+原创 2020-07-16 21:06:34 · 375 阅读 · 0 评论 -
volatile很难?由浅入深怼到CPU汇编,彻底搞清楚它的底层原理
Tips:但凡是个像样的公司面试官都得问对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!本文记录个人学习volatile。主要包含以下内容,力求简单明了:1、一段代码来演示问题背景2、volatile解决内存可见性问题3、Java内存模型原子操作4、总线加锁太慢?MESI缓存一致性协议(总线嗅探机制)5、彻底掌握volatile底层原理1、多线程环境下共享变量的线程安全问题package volati原创 2020-07-06 16:11:20 · 457 阅读 · 0 评论 -
为什么 ConcurrentHashMap 的读操作不需要加锁?
前言我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题——为什么它不需要加锁呢?ConcurrentHashMap的简介我想有基础的同学知道在jdk1.7中是采用Segment + HashEntry +ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS +Synchronized来保证并发安全进行实现原创 2020-06-29 00:23:05 · 172 阅读 · 0 评论 -
DSA数字签名算法及其实现
一、实验目的在掌握了ElGamal和Schorr数字签名算法的基础上,进一步地学习和掌握DSA签名算法。深入地理解该算法是如何降低了签名信息的长度(当其中一个重要参数选为512bit的素数时,ElGamal签名的长度为1024bit,而DSA中通过160bit的素数可以将签名的长度降低为320bit),从而减少了存储空间和传输带宽。二、实验要求4.学习DSA数字签名算法。5.掌握如何使用Java BigInteger类,简单实现最基础的DSA公私钥签名算法。6.深入地理解DSA签名算法与RSA算法原创 2020-06-26 19:02:05 · 6093 阅读 · 4 评论 -
对于final关键字和concat()方法的思考
前置首先我们都知道final关键字修饰的变量必须初始化,且值不能改变。如果是基本类型则值不能改变,如果是引用类型,则引用地址不能改变,但是这个引用所指向的对象里面的内容还是可以改变的。我们先来猜猜看,以下哪一句会通不过编译器编译:public class FinalBean { private final int i = 0; private final int j; private final String name = ""; public FinalBean()原创 2020-06-24 22:54:07 · 273 阅读 · 0 评论 -
如何借助哈希算法实现高效字符串匹配?——RK算法
前言字符串匹配算法简单的有BF算法,RK算法,今天我们只谈论RK算法。BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在讨论RK算法前,定义两个概念,方便我后面讲解。它们分别是主串和模式串。作为最简单、最暴力的字符串匹配算法,BF 算法的思想可以用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个原创 2020-06-24 17:43:17 · 960 阅读 · 0 评论 -
JVM类加载机制
前言众所周知,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。类加载的时机一个类型从被加载到虚拟机内存开始,到卸载出内存为止,他的生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。这七步的发生顺序如下:加载——>验证——&g原创 2020-06-22 13:14:57 · 121 阅读 · 0 评论 -
开闭原则
前言开闭原则是 SOLID 中最难理解、最难掌握,同时也是最有用的一条原则。如何理解“对扩展开放、修改关闭”?开闭原则的英文全称是 Open Closed Principle,简写为 OCP。它的英文描述是:software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification。我们把它翻译成中文就是:软件实体(模块、类、方法等)应该“对扩展开放原创 2020-06-22 01:23:56 · 132 阅读 · 0 评论 -
抽象类与接口对比
抽象类1.抽象类中可以构造方法(因为抽象类中可以有一些变量,这些变量需要通过构造方法来初始化)2.抽象类中可以存在普通属性,方法,静态属性和方法。3.如果一个类中有一个抽象方法,那么当前类一定是抽象类;反之抽象类中不一定有抽象方法。4.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。5.实例化一般指new一个对象,所以抽象类不能实例化(类都有构造方法,但是抽象类的构造方法不能new)接口1.在接口中只有方法的声明,没有方法体。,并且抽象方法可是没有方法体的(原创 2020-06-21 21:24:51 · 219 阅读 · 0 评论 -
Docker入门连载——(1)Docker简介
1.什么是 Docker官网的介绍是“Docker is the world’s leading software container platform.” 官方给Docker的定位是一个应用容器平台。Docker 是一个容器平台的领导者 Docker 容器平台 Docker 应用容器平台application项目 Mysql Redis MongoDB ElasticSeacrh …application项目 Docker 应用容器平台 Mysql Redis原创 2020-06-09 14:56:49 · 327 阅读 · 0 评论 -
java 使用Runtime.getRuntime().exec()时Process.waitFor()死锁问题理解和解决
前言最近在开发一个系统时,需求是Java调用Python脚本,这里我使用 Process process = Runtime.getRuntime().exec() 来调用,脚本用命令行能完整运行,但用Java调却一直转圈圈,等很久也不见结束.文章为记录…参考文章process参考waitfor挂起解析1.使用process调用py脚本 public static ResultVO pyInvoke(String[] arguments) throws Exception { .原创 2020-06-04 22:43:19 · 3759 阅读 · 7 评论 -
Java中的Class类
Class类简介在java世界里,一切皆对象。从某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,基本类型 (boolean, byte, char, s原创 2020-05-31 17:33:44 · 309 阅读 · 0 评论 -
JAVA实现DES加密
DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥。加密原理:DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行"异或"运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运原创 2020-05-30 17:47:04 · 417 阅读 · 0 评论 -
MySQL如何有效的存储IP地址
序言网上看到一道面试题,面试官问IP地址是怎么存在数据库的?没多想,就回答了字符串吧(心想:这么简单的问题,怕不是看不起我吧)前面这段权当看看,毕竟 IP地址 本来就是一个字符串,存放在数据库作为字符穿类型,也是无可厚非的。但是,阿粉我可是一个喜欢换位思考的人,站在面试官的角度,你觉得我会问这么一个低级的问题么?那么答案当然是否定的。所以,面试官想知道的是你对这个问题会不会有深度思考,从此来一定程度的判断你在平常的开发中只是一个单纯的 “搬砖” 的码农,还是一个有灵魂的 Coder 。正文针对这个问原创 2020-05-30 13:12:29 · 428 阅读 · 0 评论 -
mybatis的association以及collection的用法
前言:在项目中,某些实体类之间肯定有关键关系,比如一对一,一对多等。在hibernate 中用one to one和one to many,而mybatis 中就用association和collection。association: 一对一关联(has one)collection:一对多关联(has many)注意,只有在做select查询时才会用到这两个标签,都有三种用法,且用法类似。一、association的三种用法:先看如下代码(省略set、get方法):public class原创 2020-05-28 17:14:05 · 335 阅读 · 0 评论 -
520特辑--谈谈对象的创建
想必学过java的小伙伴们都知道new一个对象,借此520这个机会我们来谈谈Hotspot虚拟机的对象的创建.Java是一门面对对象编程语言,Java程序运行过程中无时不刻都有对象创建出来,在Java语言层面上,创建对象通常就仅仅是一个new关键字而已(复制,反序列化例外),而在虚拟机中,对象(指普通Java对象,不包括数组和Class对象等)的创建是一个什么过程呢?食用下面内容前建议先了解JVM内存模型.当Java虚拟机遇到一个字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个原创 2020-05-20 11:06:01 · 280 阅读 · 0 评论 -
解决swagger No mapping for GET /警告
今天下午用着swagger,本来没啥事的,突然重启项目后,打开swagger就报然后swagger也点不动查阅无数博客,发现屁用没有最后在yml里将8080端口改了,随便换成了8085万事大吉了。。...原创 2020-04-17 19:45:25 · 5874 阅读 · 0 评论 -
微信小程序登录功能开发--SpringBoot
目录微信小程序登录功能实现整体思路开始代码部分到了激动人心的后端部分!!给微信服务器发请求开发一个请求工具类开发一个json转实体类的工具类创建接收的model类service代码层微信小程序登录功能实现微信小程序可以调用微信登录的接口,直接使用微信登录。思路也不是很难,了解过程就很轻易就可以写出来了。 感觉微信登录涉及很多东西,就想记录一下,不过,我想我的方法应该不是最合理或者安全的,但...原创 2020-04-17 00:48:06 · 2503 阅读 · 0 评论 -
LeetCode 72. 编辑距离
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 '...原创 2020-04-06 22:12:49 · 147 阅读 · 0 评论 -
HashMap与ConcurrentHashMap
首先我们来说一下HashMap的数据结构,在Java编程语言中,最基本的结构有两种,一个是数组,一个是指针,也就是我们平时说的引用,HashMap就是基于这两个数据结构实现的我们从这个图可以看出来,HashMap的底层就是一个数组结构,而数组中的明细呢,是一个链表,当我们初始化一个HashMap的时候,就会初始化一个数组出来,HashMap有两个参数影响它的性能,它们分别是初始容量和加载因子,...原创 2020-03-24 20:08:48 · 236 阅读 · 0 评论 -
incrementAndGet是如何实现线程安全的
我们先来看一下线程安全性的定义.定义:当多个线程访问某个类时.不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的线程安全主要体现在三个方面:原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作可见性:一个线程对主内存的修该可以及时的被其他线程观察到有序性:一个线...原创 2020-03-20 15:34:17 · 4930 阅读 · 2 评论