
编程语言
文章平均质量分 90
什么啊什么Q
keep slow
展开
-
java的getResource方法
1. 前言在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异。2.Class.getResource(String path)path不以'/'开头时,默认是从此类所在的包下取资源;path以'/'开头时,则是从项目的ClassPath根下获取资源。在这里'/'表示ClassPath的根目录。JDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同的资源文件,转载 2021-03-12 10:50:25 · 1616 阅读 · 0 评论 -
双重检查的单例模式之volatile
此处volatile用来防止指令重排,Singleton初始化分配内存后,有肯能会直接赋值给uniqueInstance索引,然后再进行初始化。因此其他线程有可能会拿到一个为初始化完成的uniqueInstance。原创 2020-11-11 11:07:44 · 147 阅读 · 0 评论 -
RandomAccess 作用
众所周知,在List集合中,我们经常会用到ArrayList以及LinkedList集合,但是通过查看源码,就会发现ArrayList实现RandomAccess接口,但是RandomAccess接口里面是空的!Linked并没有实现RandomAccess接口。这是为什么呢?-----------------------------------------------------------------------------------------------------这是ArrayLis转载 2020-11-06 17:32:39 · 192 阅读 · 0 评论 -
Metrics介绍
系统开发到一定的阶段,线上的机器越来越多,就需要一些监控了,除了服务器的监控,业务方面也需要一些监控服务。Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作。使用Metrics通过构建一个Spring Boot的基本应用来演示Metrics的工作方式。在Maven的pom.xml中引入Metrics:<dependency> <groupId>io.dropwizard.metrics</groupId>.转载 2020-10-27 11:29:34 · 2977 阅读 · 0 评论 -
javaagent使用指南
今天打算写一下 Javaagent,一开始我对它的概念也比较陌生,后来在别人口中听到字节码插桩,bTrace,Arthas后面才逐渐了解到Java还提供了这么个工具。JVM启动前静态InstrumentJavaagent 是什么?Javaagent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项。 Premain-Class 指...转载 2020-10-27 10:06:59 · 890 阅读 · 0 评论 -
2020-10-26
javassist使用全解析Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深入的了解。同时也可以去生成一个新的类对象,通过完全手动的方式。1. 使用 Javassist 创建一个 class 文件#首先需要引入jar包:<dependency> <转载 2020-10-26 18:50:18 · 169 阅读 · 0 评论 -
BitMap原理
经常能够看到有些大厂的面试题里有一些这样的题目:一个10G的文件,里面全部是自然数,一行一个,乱序排列,对其排序。在32位机器上面完成,内存限制为 2G。首先来分析一下题目,10G的文件,只有2G内存,显然,不可能一次性把数据放入内存中直接排序。那么,还有什么其他办法呢?遍寻资料,可以发现大致有两种解决方案:1、把大文件分成多个小文件,分别排序,到最后合并成一个文件(我暂时还没搞懂这个方法,所以不会描述,有兴趣的看官可以自己去查一下);2、另外一种方法就是著名的bitmap算法了。引用一下《编程转载 2020-09-16 11:48:29 · 286 阅读 · 0 评论 -
String、StringBuffer和StringBuilder的区别
String、StringBuffer和StringBuilder的区别:文章目录 String StringBuffer StringBuilder StringBuffer是如何实现线程安全的呢? Java9的改进 String String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。 这个是String类的解释,之前小咸儿看到这个情况,不能理解上述的解释,如下<.转载 2020-09-14 14:45:50 · 378 阅读 · 0 评论 -
ReadWriteLock读写锁的使用
说到Java并发编程,很多开发第一个想到同时也是经常常用的肯定是Synchronized,但是小编这里提出一个问题,Synchronized存在明显的一个性能问题就是读与读之间互斥,简言之就是,我们编程想要实现的最好效果是,可以做到读和读互不影响,读和写互斥,写和写互斥,提高读写的效率,如何实现呢?Java并发包中ReadWriteLock是一个接口,主要有两个方法,如下:public interface ReadWriteLock { /** * Returns th..转载 2020-07-15 16:33:55 · 229 阅读 · 0 评论 -
Java多线程 -- 公平锁和非公平锁
在java的锁机制中,公平和非公平的参考物是什么,个人而言觉得是相对产生的结果而立,简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。本文围绕ReenTrantLock来讲。实现原理那如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。在公平的锁中,如果有另一个线程持有锁或者有其他.转载 2020-07-15 16:25:35 · 130 阅读 · 0 评论 -
EngineScript和CompiledScript的使用
Jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机“这一目标。ScriptEngine功能强大,基本能实现笔者所能想到的Java与JavaScript交互的需求。而且十分的方便简洁。jdk1.8又对ScriptEngine接口进行了一定改变,因此,在jdk1.8能运行的代码,在1.6中可能会报错,反之亦然。翻译 2020-07-14 17:06:14 · 3505 阅读 · 0 评论 -
共变数组和类型擦除 java
1、数组的协变性数组的协变性(covariant)是指:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。而泛型是不可变的(invariant),List<Base>不会是List<Sub>的基类,更不会是它的子类。数组的协变性可能会导致一些错误,比如下面的代码:public static void main(String[] args) { Object[] array = new String[10]; array[0转载 2020-05-30 15:44:11 · 170 阅读 · 0 评论 -
Java中内嵌groovy,JS脚本
最近设计一个数据统计系统,系统中上百种数据统计维度,而且这些数据统计的指标可能随时会调整.如果基于java编码的方式逐个实现数据统计的API设计,工作量大而且维护起来成本较高;最终确定为将"数据统计"的计算部分单独分离成脚本文件(javascript,或者Groovy),非常便捷了实现了"数据统计Task" 与 "数据统计规则(计算)"解耦,且可以动态的加载和运行的能力.顺便对JAVA嵌入运行Groovy脚本做个备忘. Java中运行Groovy,有三种比较常用的类支持:GroovyShell,G..转载 2020-05-13 19:22:31 · 1406 阅读 · 0 评论 -
Java使用JNI调用Native方法原理
前言写这个是出于好奇。我们知道cpu只认得 “0101101” 类似这种符号, C、C++ 这些代码最终都得通过编译、汇编成二进制代码,cpu才能识别。而Java比C、C++又多了一层虚拟机,过程也复杂许多。Java代码经过编译成class文件、虚拟机装载等步骤最终在虚拟机中执行。class文件里面就是一个结构复杂的表,而最终告诉虚拟机怎么执行的就靠里面的字节码说明。Java虚拟机在执行的时候,可以采用解释执行和编译执行的方式执行,但最终都是转化为机器码执行。Java虚拟机运行时的数据区,转载 2020-05-12 17:45:06 · 2032 阅读 · 1 评论 -
golang的类型转换(断言等)
go类型转换go存在4种类型转换分别为:断言、强制、显式、隐式。通常说的类型转换是指断言,强制在日常不会使用到、显示是基本的类型转换、隐式使用到但是不会注意到。断言、强制、显式三类在go语法描述中均有说明,隐式是在日常使用过程中总结出来。断言类型转换断言通过判断变量是否可以转换成某一个类型类型断言Type assertions语法文档镜像地址一个简单的断言表达式:...转载 2020-04-22 10:38:26 · 385 阅读 · 0 评论 -
Gradle语法的理解
做过java开发或者android开发,你一定使用gradle,这也是现代大部分项目使用的项目构建和项目依赖管理的工具。用过很多年,也知道怎么用,但就是不知道为什么要那么写,gradle的各种花式配置,到底怎么是什么意思呢,要怎么理解这些写法呢?比如以下的gradle配置(android项目的gradle配置)apply plugin: 'com.android.applicatio...转载 2020-04-09 18:50:41 · 515 阅读 · 0 评论 -
Go的Type用法
golang中,type是非常重要的关键字,一般常见用法就是定义结构,接口等,但是type还有很多其它的用法,在学习中遇到了以下几种,这点简单总结记录下定义结构type Person struct { name string age int}type Mutex struct {}type OtherMutex Mutex //定义新的类型func (m *Mu...转载 2020-04-09 11:04:22 · 581 阅读 · 0 评论 -
Go语言-int类型取值范围
相比于C/C++语言的int类型,GO语言提供了多种int类型可供选择,有int8、int16、int32、int64、int、uint8、uint16、uint32、uint64、uint。文章目录1.各int类型的取值范围如下2.关于int类型3.代码示例4.总结1.各int类型的取值范围如下int8: -128 ~ 127int16: -32768 ~ 32767int3...转载 2020-04-09 10:00:01 · 16679 阅读 · 0 评论 -
Go的interface{}类型,已经interfece{}.()类型判断
nterface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。空interface(interface{})不包含任何的method,正因为如此,所有的类型都实现了空interface。我们知道interface的变量里面可以存储任意类型的数值(该类型实现了interface)。那么我们怎么反向知道这个变量里面实际保存了的是哪个类型的对象呢?目前常用的有两种...转载 2020-04-08 11:19:43 · 637 阅读 · 0 评论 -
MockIto进行模拟单元测试
JUnit和Mockito对于JUnit,这里就不详细介绍了,网上的教程有很多,比如这个和这个。下面主要介绍一下Mockito。什么是mock测试,什么是mock对象?先来看看下面这个示例:从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。一种替代方案就是使用mocks从图中可以清晰的看出:mock对象就是在调试期间...转载 2020-04-07 21:30:05 · 837 阅读 · 0 评论 -
Go单元测试
更新、更全的《Go从入门到放弃》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11517502.html不写测试的开发不是好程序员。我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分。 这篇文章主要介绍下在Go语言中如何做单元测试和基准测试。...转载 2020-04-07 18:09:29 · 360 阅读 · 1 评论 -
String value = StringFormatter.format().getValue()方法阻塞问题
String value = StringFormatter.format("abc%.1f", a).getValue();这样一行代码,在macOs上运行正常,在docker linux环境下却卡死,java所谓的跨平台呢????。经验:即使是javaSe,冷门api未经过千锤百炼,还是会有狠深狠深狠蛇很深的坑呢。坑了我和架构师将近8个小时的时间????。 在dev环境无法debug的情况...原创 2020-03-20 11:59:52 · 528 阅读 · 0 评论 -
synchronized和volitile保证可见性
JMM关于synchronized的两条规定: 1)线程解锁前,必须把共享变量的最新值刷新到主内存中 2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值 (注意:加锁与解锁需要是同一把锁) 通过以上两点,可以看到synchronized能够实现可见性。同时,由于synchronized具有同步锁,所以它也具有原子性。...转载 2020-03-15 19:00:39 · 316 阅读 · 0 评论 -
CPU和java多线程的关系
#### Java多线程线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位。Java中的所有线程在JVM进程中,CPU调度的是进程中的线程。当Java线程数大于cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。#### CPU概念cpu个数:是指物理上,也及硬件上的核心数;核数:是逻辑上的,简单理解为逻辑上模拟出的核心数;一...转载 2020-03-11 22:02:23 · 939 阅读 · 0 评论 -
正则表达式,贪婪型,勉强型,占有型
今天在做markdown转换器项目时遇到了一个问题,让我回顾了一下正则表达式中量词的贪婪型,勉强型和占有型这三种类型的匹配方式。这些匹配方式在匹配时需要根据项目需求合理地选择搭配,否则程序结果可能完全出乎你的意料。我的问题是,有如下字符串:“This is [google][1],this is [apple][2],and this is [ms][3].”我需要依次将“[google][...转载 2020-03-05 18:57:44 · 289 阅读 · 0 评论 -
SpEL表达式
概观Spring Expression Language(缩写为SpEL)是一种强大的表达式语言。在Spring产品组合中,它是表达式计算的基础。它支持在运行时查询和操作对象图,它可以与基于XML和基于注解的Spring配置还有bean定义一起使用。由于它能够在运行时动态分配值,因此可以为我们节省大量Java代码。项目设置对于Maven项目,应使用以下依赖项:前两个依赖项 ...转载 2019-12-31 16:52:10 · 2217 阅读 · 0 评论 -
MessageSource简介
文章目录 基础知识 Locale 本地化工具类 ResourceBoundle MessageFormat MessageSource 简介 ApplicationContext HierarchicalMessageSource ResourceBundleMessageSource ReloadableResourceBundleMess...转载 2019-12-31 10:58:16 · 2651 阅读 · 1 评论 -
volatile保证可见性,不保证原子性
1 保证内存可见性说到内存可见性就必须要提到Java的内存模型,如下图所示:如上图所示,所有线程的共享变量都存储在主内存中,每一个线程都有一个独有的工作内存,每个线程不直接操作在主内存中的变量,而是将主内存上变量的副本放进自己的工作内存中,只操作工作内存中的数据。当修改完毕后,再把修改后的结果放回到主内存中。每个线程都只操作自己工作内存中的变量,无法直接访问对方工作内存中的变量,线程间变量值...转载 2019-12-26 11:28:55 · 651 阅读 · 0 评论 -
C语言中的.h文件的作用
C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐认识清楚他的本来面目。揪其原因,我的 驽钝和好学而不求甚解固然是原因之一,但另外还有其他原因。原因一:对于较小的项目,其作用不易被充分开发,换句话说就是即使不知道他的详细使用方法,项 目照样进行,程序在计算机上照样跑。原因二:现在的各种C语言书籍都是只对C语言的语法进行详细的...转载 2019-12-10 17:41:59 · 19016 阅读 · 3 评论 -
ClassLoader简介
java.lang.ClassLoader类概述: 中文文档中对ClassLoader类的定义如下: 从文档中对ClassLoader类的介绍可以总结出这个类的作用就是根据一个指定的类的全限定名,找到对应的Class字节码文件,然后加载它转化成一个java.lang.Class类的一个实例.类加载器的划分: 大部分java程序会使用以下3中系统提供的类加载器:启动...转载 2019-12-09 15:50:27 · 548 阅读 · 0 评论 -
MappedByteBuffer和DirectByteBuffer
1 、概述(1)系统IO调用首先来看一下一般的IO调用。在传统的文件IO操作中,我们都是调用操作系统提供的底层标准IO系统调用函数 read()、write() ,此时调用此函数的进程(在JAVA中即java进程)由当前的用户态切换到内核态,然后OS的内核代码负责将相应的文件数据读取到内核的IO缓冲区,然后再把数据从内核IO缓冲区拷贝到进程的私有地址空间中去,这样便完成了一次IO操作。如下...转载 2019-12-06 15:09:45 · 2607 阅读 · 0 评论 -
Jvm的metadata和compressed class space含义
在对java jvm进行性能监控时,发现了两个新名词Meta space和compressed class space ,通过查阅一些资料下面进行一下总结。Meta space元空间(metaspace)这是在java8才出现的新概念,在java6中堆结构如下图:持久代中存的内容1. JVM中类的元数据在Java堆中的存储区域。2. Java类对应的HotSpot虚拟机中的内...转载 2019-12-06 14:46:07 · 2278 阅读 · 0 评论 -
Jvm参数介绍
堆设置-server:一定要作为第一个参数,在多个CPU时性能佳-Xms:初始堆内存大小,Server端JVM最好将-Xms和-Xmx设为相同值-Xmx:堆内存最大值,建议不要超过物理内存的一半-Xmn:年轻代堆内存的大小,一般设置为Xmx的三分之一-XX:NewSize=n:设置年轻代大小-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3...转载 2019-12-06 13:48:58 · 537 阅读 · 0 评论 -
Jvm内存区域
JVM区域总体分两类,heap区和非heap区。heap区又分为:Eden Space(伊甸园)、 Survivor Space(幸存者区)、 Old Gen(老年代)。非heap区又分:Code Cache(代码缓存区); Perm Gen(永久代); Jvm Stack(java虚拟机栈); Local Method Statck(本地方法栈);下面我们对每一个内存区域...转载 2019-12-06 13:44:58 · 546 阅读 · 0 评论 -
java8新增特性五:Optional
NullPointerException相信每个JAVA程序员都不陌生,是JAVA应用程序中最常见的异常。之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPointerException。受此影响,JDK8的类中也引入了Optional类,在新版的SpringData Jpa和Spring Redis Data中都已实现了对该方法的支持。1、Optiona...转载 2019-11-20 18:13:27 · 587 阅读 · 0 评论 -
java8新增特性四:接口中定义默认方法和静态方法
在JDK1.8以前,接口(interface)没有提供任何具体的实现,在《JAVA编程思想》中是这样描述的:“interface这个关键字产生了一个完全抽象的类,它根本就没有提供任何具体的实现。它允许创建者确定方法名、参数列表和返回类型,但是没有任何方法体。接口只提供了形式,而未提供任何具体实现”。 但是这一限制在JDK1.8中被打破了,JDK1.8开始,接口允许定义默认方法和静态方法。...转载 2019-11-20 17:40:38 · 664 阅读 · 0 评论 -
java8特性三:stream api
Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式。Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作,在新版的JPA中,也已经加入了Stream。如:1 @Query("select u from User u")2 Stream<User> findAllByCustomQ...转载 2019-11-20 17:33:39 · 539 阅读 · 1 评论 -
java8新增特性一:lambda表达式
Java8是自java5之后最重大的一次更新,它给JAVA语言带来了很多新的特性(包括编译器、类库、工具类、JVM等),其中最重要的升级是它给我们带来了Lambda表达式和Stream API。1、什么是Lambda表达式? Lambda是一个匿名函数,可以理解为是一段可以传递的代码,可以将代码像传递参数、传递数据一样进行传输。使用Lambda表达式,可以写出更加紧凑、更加简洁、更加灵活...转载 2019-11-20 16:52:57 · 552 阅读 · 0 评论 -
java8特性二:方法引用 ::
1、方法引用的使用场景 我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。...转载 2019-11-20 16:44:58 · 536 阅读 · 0 评论 -
正则表达式?的使用
要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:// 前瞻:exp1(?=exp2) 查找exp2前面的exp1// 后顾:(?<=exp2)exp1 查找exp2后面的exp1// 负前瞻:exp1(?!exp2) 查找后面不是exp2的exp1// 负后顾:(?<!exp2)exp1 查找前面不是exp2的exp1举例:"中国人"...转载 2019-11-06 10:29:01 · 1131 阅读 · 0 评论