java基础
文章平均质量分 56
tinysakurac
蹒跚学步的猿
展开
-
CacheLine伪共享机制和解决方案
认识CPU CacheCPU Cache概述随着CPU的频率不断提升,而内存的访问速度却没有质的突破,为了弥补访问内存的速度慢,充分发挥CPU的计算资源,提高CPU整体吞吐量,在CPU与内存之间引入了一级Cache。随着热点数据体积越来越大,一级Cache L1已经不满足发展的要求,引入了二级Cache L2,三级Cache L3。(注:若无特别说明,本文的Cache指CPU Cache,高速缓存)CPU Cache在存储器层次结构中的示意如下图:计算机早已进入多核时代,软件也越来越多的支持多核运行转载 2021-02-03 13:41:34 · 1261 阅读 · 1 评论 -
获取一个java程序主函数声明的类
观spring boot源码,看到一个有意思的简单获取java程序主函数所在的类的方法,记录一下private Class<?> deduceMainApplicationClass() { try { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement stackTraceElement : stackTrace) { if ("main原创 2021-02-01 13:50:11 · 480 阅读 · 0 评论 -
java动态编译——JavaFileManager详解
前言使用过java内存编译功能的小伙伴应该了解,我们可以通过tools包提供的JavaCompiler模块在内存中对java代码进行编译,而我们经常使用的javac编译工具,底层也是借助javax.tools完成编译的。在java代码里,我们可以通过下面几行代码,就完成源文件到字节码的编译: JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager f原创 2020-11-20 14:30:56 · 5381 阅读 · 19 评论 -
读写锁降级
转载自light_shine的博客锁降级锁降级指的是写锁降级成为读锁。锁降级是指把持住当前拥有的写锁的同时,再获取到读锁,随后释放写锁的过程。以下是oracle官网的对于锁降级的示例代码: class CachedData { Object data; volatile boolean cacheValid; final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedD转载 2020-10-10 20:07:32 · 908 阅读 · 0 评论 -
深入理解JDK中的Reference原理和源码实现
转载自throwable的博客前提这篇文章主要基于JDK11的源码和最近翻看的《深入理解Java虚拟机-2nd》一书的部分内容,对JDK11中的Reference(引用)做一些总结。值得注意的是,通过笔者对比一下JDK11和JDK8对于java.lang.ref包的相关实现,发现代码变化比较大,因此本文的源码分析可能并不适合于JDK11之外的JDK版本。Reference的简介和分类在JDK1.2之前,Java中的引用的定义是十分传统的:如果reference类型的数据中存储的数值代表的是另一块内存转载 2020-07-23 11:11:33 · 419 阅读 · 0 评论 -
aspectj与spring aop的区别
转载自Mythsman的个人博客这篇文章介绍了aspectj的原生使用方式(编译时织入,编译后织入,加载时织入),类增强织入和代理方式的区别,spring aop使用是织入还是代理?spring aop和aspectj的关系,值得一读...转载 2020-05-06 20:03:10 · 329 阅读 · 0 评论 -
sha1withrsa算法
转载自西门打扫雪的博客、别人眼中的过客的博客浅谈加密与签名我们一般的加密主要分2种。对称加密。非对称加密。顾名思义。对称加密就是秘钥是一样的。通过同一个秘钥加密解密。这一类的加密算法有DES,3DES,AES等。而非对称加密即使用公钥和秘钥2个。公钥进行加密,而私钥进行解密。这一类的加密算法主要RSA数字签名并不是加密。他只是将传递的参数进行签名。服务器端可以验签。主要作用有2个:1.保证数...原创 2019-12-13 11:36:09 · 4434 阅读 · 0 评论 -
使用线程安全的原子数组AtomicReferenceArray
转载自易百教程AtomicReferenceArrayjava.util.concurrent.atomic.AtomicReferenceArray类提供了可以原子读取和写入的底层引用数组的操作,并且还包含高级原子操作。 AtomicReferenceArray支持对底层引用数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的任何后续获取相关...转载 2019-10-28 14:24:02 · 827 阅读 · 0 评论 -
linux使用jstat命令查看jvm的gc情况
转载自天朝P民甲的博客命令格式jstat命令命令格式:jstat [Options] vmid [interval] [count]参数说明:Options,选项,我们一般使用 -gcutil 查看gc情况vmid,VM的进程号,即当前运行的java进程号interval,间隔时间,单位为秒或者毫秒count,打印次数,如果缺省则打印无数次示例说明示例通常运行命令如下:j...转载 2019-01-02 14:54:45 · 187 阅读 · 0 评论 -
通过JMX监控JVM
转载自cn-done的博客[https://cn-done.iteye.com/blog/2041971]近日关注性能调优,关注JMX,发现java.lang.management.*之强大。同时查阅了资料,整合一版关于JVM参数获取的note,仅供参考: MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean(); ...转载 2019-01-02 13:59:29 · 1755 阅读 · 0 评论 -
通过java代码获取jvm信息和系统信息
转载自LOC_Thomas的博客前言随着微服务的概念逐渐流行,监控成了必不可少的模块,本篇文章主要介绍一下如何通过java代码获得一些核心的数据,方便从各个方面对应用进行监控获取jvm数据jvm数据是监控应用很重要的一系列参数,一般本地开发的时候可以通过jconsole来连到对应的进程上面,查看相关指标数据,但是在线上环境就不适合通过jconsole来查看了, 所以我们现在使用通过java...转载 2019-01-02 13:43:10 · 3228 阅读 · 0 评论 -
java 利用正则表达式去处字符串中的所有空格
转载自xcmercy的博客目标去除字符串中所有的空白字符,包括空格、制表符、回车符等所有空白字符思路根据字符串长度,利用循环遍历字符串此方法太笨拙。这里利用正则表达式,匹配所有的空白字符,然后将匹配到的空白字符替换为 “” 空串即可。代码private String replaceBlank(String s) { String result= null; if (s ...转载 2018-12-29 14:33:56 · 3705 阅读 · 0 评论 -
java8 stream flatmap操作符使用
作用一句话,把几个小的list转换到一个大的list。示意图示例package test;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;/** * Java Program to demonstrate ...转载 2018-12-11 14:14:31 · 2493 阅读 · 0 评论 -
java 带有泛型声明的对象的比较问题
起因在于使用了一个向ioc容器中注入的带有泛型声明的bean,然后在注入时使用了不同的泛型作为qualifier @Autowired private AggregationUtilBean&lt;Integer, Integer&gt; aggregationUtilBean; @Autowired private AggregationUtilBean&lt;...原创 2019-02-27 12:24:47 · 765 阅读 · 0 评论 -
java按照多个分隔符分割字符串
分隔符中包含需要转义的特殊字符的情况 String str = "3+2-1*5";按+ - *分割因为这三个需要转义加\\ String [] ss = str.split("\\+|\\-|\\*");分隔符中不包含需要转义的特殊字符的情况String [] ss = str.split("[\\+\\-\\*]");若是普通的分割符直接 String [] ss = ...转载 2018-12-17 09:35:10 · 10671 阅读 · 1 评论 -
Java中使用Runtime和Process类运行外部程序
使用场景java与非java程序之间的交互Runtime使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。exec(String command)exec(String command, String envp[], File dir):传递环境变量并标识当前目录exec(String cmd, String envp[]):传递环境变量...原创 2019-01-02 16:17:42 · 2347 阅读 · 0 评论 -
使用jvm监控指令进行性能调优
转载自舒润的博客前言JVM监控命令基本就是jps、jstack、jmap、jhat、jstat几个命令的使用就可以了JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。现实企业级Java开发中,有时...转载 2019-01-02 16:46:29 · 236 阅读 · 0 评论 -
java float和double类型的表示范围和精度
转载自张小琦的博客[https://blog.csdn.net/zq602316498/article/details/41148063]隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数。有时候会产生让人觉得莫名其妙的事情。如在java中,0.99999999f==1f //true 0.9f==1f //false要明白这些,首先要搞清楚float和do...转载 2019-01-14 11:08:32 · 4800 阅读 · 1 评论 -
个人开源项目smart_search_box
recommendsmart_search_box是java领域的一站式搜索引擎解决方案,用户只需要进行简单的配置就可以在项目中引入完整的全文搜索能力,包括数据入库自动索引,搜索词联想,热词提示,高亮等功能。同时提供给用户高度的自定义能力,用户可以替换框架的部分实现,包括替换elastic search客户端,替换分词器,替换redis客户端等,只需要实现对应的接口替换默认注入的相应组件即可。默...原创 2019-05-18 14:39:21 · 334 阅读 · 0 评论 -
java 编译时注解处理
转载自fei20121106的博客一、注解Annotations是一种元数据,其作用在于提供程序本身以外的一些数据信息,也就是说Annotation他不会属于程序代码本身,不参与逻辑运算,故而不会对原程序代码的操作产生直接的影响。一般来说Annotation有如下三种使用情形:Information for the compiler — Annotations can be used b...转载 2019-07-26 17:05:10 · 4264 阅读 · 2 评论 -
Slf4j MDC使用与实现
前言如今,在 Java 开发中,日志的打印输出是必不可少的,Slf4j + LogBack 的组合是最通用的方式。有了日志之后,我们就可以追踪各种线上问题。但是,在分布式系统中,各种无关日志穿行其中,导致我们可能无法直接定位整个操作流程。因此,我们可能需要对一个用户的操作流程进行归类标记,比如使用线程+时间戳,或者用户身份标识等;如此,我们可以从大量日志信息中grep出某个用户的操作流程,或者...转载 2019-08-29 17:23:08 · 3819 阅读 · 0 评论 -
java堆分析工具MAT使用教程
MAT简介MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。什么时候会用到MAT?a) OutOfMemoryError的时候,触发full gc,但空间却回收不了,引发内存泄露b)java服务器系统异常,比如l...转载 2019-09-29 16:19:11 · 7830 阅读 · 0 评论 -
ThreadLocal的作用与实现原理
Why ThreadLocal?无论如何,要编写一个多线程安全(Thread-safe)的程序是困难的,为了让线程共享资源,必须小心地对共享资源进行同步,同步带来一定的效能延迟,而另一方面,在处理同步的时候,又要注意对象的锁定与释放,避免产生死结,种种因素都使得编写多线程程序变得困难。尝试从另一个角度来思考多线程共享资源的问题,既然共享资源这么困难,那么就干脆不要共享,何不为每个线程创造一...转载 2018-08-17 20:30:26 · 694 阅读 · 0 评论 -
Apache Common包介绍
吐槽一下Apache的官网还需要翻墙,学会科学上网真的很重要ORZ一、Commons BeanUtilshttp://jakarta.apache.org/commons/beanutils/index.html说明:针对Bean的一个工具集。由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。使用示例:功能有很多,网站上有详细介绍。一个比较常用的...转载 2018-10-09 21:03:19 · 3390 阅读 · 0 评论 -
ip地址与整形之间的相互转换
整数形式转换成IP地址 思路:将整数值进行右移位操作(&amp;gt;&amp;gt;&amp;gt;),右移24位,右移时高位补0,得到的数字即为第一段IP。ps:&amp;gt;&amp;gt;&amp;gt;是有符号整数右移运算符,&amp;gt;&amp;gt;是无符号整数右移运算符。 通过与操作符(&amp;amp;)将整数值的高8位设为0,再右移转载 2018-08-24 18:51:05 · 1940 阅读 · 0 评论 -
Java中的Type详解
转载自逆水行舟的博客Java中的Type详解本文主要介绍java中Type接口的来历以及相关的几个接口。通过这边文章,我们可以了解到与范型相关的几个接口, 对范型的分类有个了解;还可以了解到Type接口与Class类的关系, 以及Type出现的原因.反射相关接口下面就把Type的来龙去脉彻底弄清楚TypeType是所有类型的父接口, 如原始类型(raw types,对应Class)...转载 2018-12-06 15:01:55 · 1143 阅读 · 0 评论 -
linux下使用Java命令运行jar文件
转载自博客https://www.cnblogs.com/luotaoyeah/p/3819001.html。转载 2018-09-14 08:19:01 · 2287 阅读 · 0 评论 -
java list与array的相互转换问题
###List 转 Array使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size()。反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[] 类,若强转其它类型数组将出现 ClassCastException 错误。反例:public static void main(Stri...转载 2018-09-19 14:04:28 · 187 阅读 · 0 评论 -
如何破坏双亲委派模型
起源来自于网易面试官的一个问题,一个类的静态块是否可能被执行两次。众所周知类加载的初始化阶段会自动收集类中所有类变量的赋值动作与静态语句块中的语句生成一个()方法,这个方法只会被执行一次。因此通常的理解类的静态语句块只会被执行一次。但感觉事情应该不会那么简单,在虚拟机中区分类是由类本身与加载类的类加载器决定的,猜想,同一个类被不同的类加载器加载,会执行两次静态块吗.?失败的尝试 由于...原创 2018-08-21 18:12:23 · 18714 阅读 · 11 评论 -
ConcurrentHashMap JDK1.7与JDK1.8源码区别
前言 以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全的。...转载 2018-08-17 20:38:52 · 121 阅读 · 0 评论 -
synchronize类锁与对象锁的区别
synchronized 加到 static 方法前面是给class 加锁,即类锁;而synchronized 加到非静态方法前面是给对象上锁。这两者的区别我用代码来演示下:对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同锁的方法时,是异步的。 在Task2 中定义三个方法 doLongTimeTaskA和doLongTimeTaskB是类锁,而doLongTimeTaskC是对象锁。...转载 2018-08-17 19:45:18 · 1448 阅读 · 0 评论 -
java中接口与抽象类的区别
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,...转载 2018-08-17 19:14:45 · 115 阅读 · 0 评论 -
java中String类的总结
因为需要在这里把String类涉及的各个方面总结一下,另给出了一下SCJP题目。如有不足的地方,请在评论中指教,谢谢。一、不变模式:一个字符串对象创建后它的值不能改变。 String str1=”hello”;//创建一个对象hello,不会变; System.out.println(str1); str1+=” world!”;//两个字符串对象粘粘,系统其实创建了一个新的对象,把...转载 2018-08-17 19:04:56 · 191 阅读 · 0 评论 -
java Object类中的各个方法及其作用
一、简介Object类 1、Object类是所有类的父类,即每个类都直接或简介继承自该类。所以一个Object类型的变量可以引用任何对象,不论是类实例还是数组。 在不明确给出父类的情况下,Java会自动把Object作为要定义类的父类。 Object类有一个默认构造方法public Object(),在构造子类实例时,都会先调用这个默认构造方法。 二、方法预览 ...转载 2018-08-17 18:57:28 · 960 阅读 · 0 评论 -
java数据类型转换
Java中,经常可以遇到类型转换的场景,从变量的定义到复制、数值变量的计算到方法的参数传递、基类与派生类间的造型等,随处可见类型转换的身影。Java中的类型转换在Java编码中具有重要的作用。 首先,来了解下数据类型的基本理解:数据是用来描述数据的种类,包括其值和基于其值基础上的可进行的操作集合。Java中数据类型主要分为两大类:基本数据类型和引用数据类型。 基本数据类型共有8种,分别是:...转载 2018-08-11 21:52:08 · 162 阅读 · 0 评论 -
eclipse与intellij idea中的classpath分析
初学Spring框架的时候,对eclipse和intellij idea中的classpath的定义不是很理解,每次都是懵懵懂懂地使用,这里将进行一次细致的讨论。1.什么是classpath?classpath相当于Java执行环境,它指定了一些常用的包或jar的位置,方便我们对项目文件的使用,而不必重复多次写所需要文件的位置。在classpath中可能需要使用所有相同名字的资源文件,如果用...转载 2018-10-11 22:11:06 · 2650 阅读 · 0 评论 -
ByteBuffer中两种申请内存方式的区别
在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:public static ByteBuffer allocate(int capacity) public static ByteBuffer allocateDirect(int capacity) 为什么要提...转载 2018-10-12 19:19:15 · 1436 阅读 · 0 评论 -
Java gc日志分析
常用JVM参数分析gc日志后,经常需要调整jvm内存相关参数,常用参数如下参数含义-Xms初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制-Xmx最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减...转载 2018-10-12 20:00:50 · 1969 阅读 · 1 评论 -
Java 8 Stream 完全教程
转载自浮梁翁的博客Java 8 Stream 教程文章目录序言Stream是如何工作的streams分类处理顺序执行效率与steream执行链顺序的关系流复用高级操作Collect(收集)FlatMapReduce(减少)Parallel Streams(并行流)结尾序言本文采用实例驱动的方式,对JAVA8的stream API进行一个深入的介绍。虽然JAVA8中的stream API与JA...转载 2018-12-12 16:39:23 · 3656 阅读 · 1 评论 -
java正则表达式语法
在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达...转载 2018-12-05 16:18:45 · 142 阅读 · 0 评论