Java
惟是致良知
这个作者很懒,什么都没留下…
展开
-
Java的ConcurrentHashMap 底层了解
最近有人问Java8 中ConcurrentHashMap 底层实现,这里简单列下。大家都知道 Java8 对HashMap 、ConcurrentHashMap 进行了改进,前者非线程安全,后者线程安全。HashMap在Java 7 中,采用哈希表结构在Java 8 中,采用哈希表 + 红黑树ConcurrentHashMap在Java 7 中,采用分段的哈希表在Java 8 中,采用数组 + 链表+ 红黑树两者类似,下边主要讲下ConcurrentHashMap...原创 2020-06-30 23:59:11 · 311 阅读 · 0 评论 -
布隆过滤器Bloom filter基本原理
最近有碰到布隆过滤器,发现redis本身没有实现它。如果使用需要再安装这个模。有兴趣的可以自己学习下先看下介绍The RedisBloom module provides four data structures: a scalable Bloom filter, a cuckoo filter, a count-min sketch, and a top-k. These data structures trade perfect accuracy for extreme memory effi原创 2020-06-17 01:28:08 · 650 阅读 · 0 评论 -
IntelliJ IDEA jprofiler安装及性能分析
Eclicpse 中可以集成MAT,即 Memory Analyzer Tool。进行性能分析。而IntelliJ 里面可以用jprofiler 进行vm 性能分析。jprofiler功能JProfile是一款性能瓶颈分析工具,监控粒度可以细化到某一个类包。主要功能有:1.内存剖析 Memory profiler2.堆遍历 Heap walker3.CPU 剖析 CPU profiler4.线程剖析 Thread profiler5.VM 遥感勘测技术 VM telemetry原创 2020-06-16 00:02:14 · 3688 阅读 · 2 评论 -
Java多线程之CountDownLatch、CyclicBarrier、Semaphore与Exchanger
Java多线程有Runnable、Thread、Callable、线程池、synchronized、volatile、Lock等可以直接使用。也有线程的直接实现可用。下边主要讲下CountDownLatch、CyclicBarrier与Semaphore。CountDownLatch从名字可以知道,是个倒计数锁。通过一个计数器,每个线程完成则减一,并在原地等待。直至减到0,开始后续工作...原创 2020-04-03 21:43:21 · 267 阅读 · 0 评论 -
Java的SPI
什么是SPISPI全称Service Provider Interface。没有翻译,我的理解是服务提供者的接口。先看下图,一般服务提供方提供服务(实现),并暴露接口。这样调用方只需要调用暴露出的接口即可获取服务。也就是说,接口与服务提供方在一起。这是一般的调用模式。下边换个思路,接口与调用方在一起。此时,服务提供方只是实现。不同的服务方可以有不同的实现,通过配置即可切换。有...原创 2020-02-25 23:33:00 · 118 阅读 · 0 评论 -
Java中慎用yyyy与YYYY
开始之前,先看一个单元测试跑出的结果: @Test public void should_get_string_when_given_date() { Long timeFor20191230 = 1577635200000L; Date date = new Date(timeFor20191230); String time...原创 2020-01-18 02:06:39 · 368 阅读 · 0 评论 -
Assertj了解
单元测试一个单元测试分三步:1. 准备数据2. 执行测试方法3. 断言测试结果Java里面写单元测试都会以来JUnit,而且该包夜提供了一些的Assert的API。但不得不说确实不好用,可读性差。所以不推荐使用。很多人也喜欢用Hamcrest,非常好用(我现在还是用它)。遗憾的是从2012年开始就没有后续更新了。之后了FEST,只是它也不更新了。前段时间去ThoughtWorks 面试...原创 2018-07-28 20:18:11 · 6500 阅读 · 1 评论 -
Jersey入门
RestREST全称是Representational State Transfer,中文:表述性状态转移。啥意思?不解释。简单来说:REST使用Web地址(URI)访问资源,使用动词(HTTP请求)操作资源。动词所谓动词,其实就是HTTP请求。可以将REST理解成一种Web服务协议。REST是直接依赖底层HTTP协议功能的:请求方法、URI地址和响应代码。我们知道HTTP协议是无...原创 2018-07-28 16:51:06 · 13487 阅读 · 3 评论 -
数据源与连接池
背景十一之后需要apply VPD到我们的项目中,在每一次数据库查询前,进行一次存储过程调用修改上下文。这样,VPD利用上下文中的变量值对查询结果遍历。因此需要对所有用到的JPA实现做一下整理,包括数据源。我们知道JDBC查询的时候都是需要四个步骤:1. 加载数据库驱动2. 获取数据库连接3. 查询4. 释放连接,遍历查询结果。我们要做的就是在第3步查询前,先call 一次存储过程。这个就显得修改...原创 2018-06-27 21:31:06 · 5200 阅读 · 2 评论 -
Java IO与装饰者模式整理
Java的I/O是实现输入和输出的基础。Java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。这样就可以做到设备、平台无关的。分类Java中I/O类分两两类:字节流和字符流。每种又分输入流和输出流。字符流类图...原创 2018-06-25 11:52:20 · 923 阅读 · 0 评论 -
Java8之函数接口
函数接口Java8新特性提供了函数式接口,用于更好的支持函数式编程。定义所谓函数式接口就是只有一个抽象方法的接口。Java8中可以通过注解(@FunctionalInterface)来限定它(即便不加注解,只有一个抽象方法默认也是函数式接口)。比如:public interface MyInterface { void myFunction();}加上注解@FunctionalInter...原创 2018-06-24 17:45:47 · 1649 阅读 · 0 评论 -
Java线程池的使用
我们知道创建线程有三种方式:Thread、Runnable和线程池。前两者使用起来相对简单,而线程池在一个系统内部使用时就需要加倍小心了。代码规范先看下线程池中最核心的一个类:java.uitl.concurrent.ThreadPoolExecutor。该类是深入了解Java中的线程池的关键。下边是它提供的四个可用构造函数。...原创 2018-07-01 22:22:55 · 232 阅读 · 0 评论 -
Java集合的交集、并集、差集
集合运算retainAll最近写代码时,遇到对集合进行操作:交集、并集、差集。对于并集,最开始写法如下: @Test public void should_get_union_with_removeAll_and_addAll() { List<Long> result = Lists.newArrayList(); List&l...原创 2018-08-25 18:04:17 · 3109 阅读 · 0 评论 -
IntelliJ Save Action
在Team开发项目中,都是多人维护一个项目。因此,保持良好的代码规范与风格很重要。IntelliJ 默认是自动保存的,因此很多时候修改后就出现:代码没有格式化、存在无用的import。其实IntelliJ 中有很多实用的插件可以帮我们提高效率。Save Action就是一个。安装简单:File -> Settings -> Plugins,搜索“Save actions...原创 2018-09-23 20:42:51 · 17881 阅读 · 0 评论 -
Java Stream Map和flatmap及集合处理
编程中多数要对集合进行各种操作,获取Map、Set、List等。Map比如一个对象List,获取所有人的名字集合 @Test public void should_can_get_name_map() { PersonInfo kaka = new PersonInfo("Kaka", 22); PersonInfo hustzw = ne...原创 2019-02-16 19:47:43 · 3031 阅读 · 0 评论 -
ParameterizedType使用简单了解
之前项目中有一段逻辑:接收消息、解析、校验、业务处理。一开始代码显得冗余,然后改成模板方法。发现不同消息体解析成不同的类。public abstract class Tests { public void handler(String message) { InfoA infoA = parse(message); try { ...原创 2019-04-13 13:59:30 · 4404 阅读 · 0 评论 -
慎用Java Collection的contains函数
背景最近碰到一个坑,看代码: @Test public void should_can_get_true_when_given_matched_type() { List<Integer> numberList = Lists.newArrayList(1, 2, 34, 4); Boolean contain = number...原创 2019-05-11 15:54:08 · 4230 阅读 · 0 评论 -
Mockito和PowerMock使用总结
Mockito和PowerMock编写单元测试时,最常用就是利用mockito、PowerMock进行mock对象。可以帮我们mock private方法、static方法、静态类等。一个常见的单元测试如下:这里也mock了static方法。被测试代码:@Componentpublic class SelfService { @Autowired privat...原创 2019-06-05 00:19:14 · 4558 阅读 · 0 评论 -
动态代理记录日志
代理代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你请来做事的人就是代理.代理模式代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy)。最大特点是代理类和被代理的类必须实现同样的接口,这就失去了原创 2016-05-04 19:43:33 · 659 阅读 · 0 评论 -
Java虚拟机内存-二
最近对Weblogic上Server的内存使用情况进行了下monitor。在这里整理下。首先看下Weblogic上内存的设置,我的机子设置如下:-Xms4096m-Xmx4096m-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.managem...原创 2018-05-29 20:31:50 · 1233 阅读 · 0 评论 -
Java 8之Stream入门
StreamJava8新特性增加了一个新的抽象称为流Stream。目的在于弥补Java函数式编程的缺陷。将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。同时它提供串行和并行两种模式进行汇聚...原创 2018-06-03 17:54:45 · 561 阅读 · 0 评论 -
LinkedList,ArrayList和Vector
Collection我们知道Java中集合分有序和无序两种,其中List有三个实现。Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetList实现ArrayList、Vector和LinkedList虽然都实现了List接口,还是有一些区别的。存储从集合的存储上,Array原创 2017-05-11 20:03:04 · 221 阅读 · 0 评论 -
Exception和RuntimeException
之前不小心弄出来一个空指针异常(NullPointException),然后程序直接崩溃了。简单学习了下RuntimeException和Exception的区别。先看下类继承图,显而易见NullPointException是RuntimeException子类。这里补充下,java中定义了两类异常:1、检查型异常(CheckedException):这类异常都是Excepti原创 2017-05-03 14:46:01 · 3237 阅读 · 0 评论 -
Java的getCanonicalName和getName
Java中获取类名主要有三个方法供我们使用:getName(), getCanonicalName() 和getSimpleName().举个例子看下它们的区别。比如如下类:package my;public class ExternalClassConfig { private String desc; // ... public static cla原创 2017-05-03 11:50:45 · 17814 阅读 · 1 评论 -
Junit 详解
测试使用要求 我用的是Junit4,定义一个测试方法非常简单,只需要在方法前加上@Test就行了。据说在junit3中,是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类。有兴趣的可以自己尝试下。注意:创建-个测试方法的要求是, 这个方法必须使用@Test注释,是公共的, 不带任何参数, 并且返回void类型。 比如: @Tes原创 2017-02-15 17:13:53 · 412 阅读 · 0 评论 -
Java多线程
实现方式JAVA中,实现多线程主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。前两种方式线程执行完后都没有返回值,最后一种是带返回值的。继承Thread类这种方式是很常见的多线程实现方式。通过Thread子类实例的start()方法来启动线程。start()方法是一个native方法原创 2016-04-10 23:00:15 · 484 阅读 · 0 评论 -
设计模式之单例模式
定义单例模式确保一个类只有一个实例,并提供一个全局访问点。从定义上看,这一模式的目的就是使类的一个对象成为系统中的唯一实例。写法单例模式有不同的实现。饿汉法。在第一次引用该类时就创建实例,而不管实际是否需要创建。public class Singleton { private static Singleton uniqueInstance = new Singleto原创 2016-04-06 20:07:20 · 344 阅读 · 0 评论 -
Android中使用FontAwesome
实现了在 Android 上集成 FontAwesome 图标字体:Iconify。原创 2016-03-10 11:51:04 · 687 阅读 · 0 评论 -
android开源框架android-async-http使用
开发android app 需要进行获取网络数据或者向服务器发送数据操作,这些数据传送可以通过android-async-http开源框架来帮我实现。android-async-http使用起来也很简单。android-async-http 项目主页:https://github.com/loopj/android-async-http 可供下载源代码和jar包。在Android项目中原创 2016-01-18 11:02:21 · 595 阅读 · 0 评论 -
String和StringBuffe区别
JAVA提供了两个可以储存和操作字符串的类:String和StringBuffer。我们知道String类提供了数值不可改变字符串,而StringBuffer类提供的字符串进行修改,该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三个改造方法。初始化的容量:扩容:当使用append()方法在字原创 2017-05-08 15:33:20 · 375 阅读 · 0 评论 -
Java中创建对象的几种方式
创建对象方式Java开发中,我们每天会创建很多对象,也会使用依赖注入的方式管理系统,比如:Spring去创建对象。然后究竟有多少种创建对象的方法呢?这里列举一下:使用New关键字、使用Class类的newInstance方法、使用Constructor类的newInstance方法、使用Clone方法、使用反序列化。new关键字这是最简单最常用的创建对象方式,包括无参的和有参的构造原创 2017-05-19 10:10:00 · 10581 阅读 · 1 评论 -
HashMap Hashtable和ConcurrentHashMap
简介HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable,HashMap允许将Null作为一个entryde key 或者value,而Hashtable不允许 HashMap把Hashtable的contains思路方法去掉了,改成contain原创 2017-06-10 12:50:42 · 688 阅读 · 0 评论 -
Java虚拟机内存
StackOverflowError前段时间一个同事给了个错误。看完整个log信息,感觉很懵。相信很多人更熟悉的是另一个错误,即OutOfMemoryError。Caused by: java.lang.StackOverflowError at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.Socket...原创 2018-04-03 23:59:33 · 176 阅读 · 0 评论 -
Timestamp的equals不对称性
Timestamp最近写代码的时候用了java.sql.Timestamp 类(容易存DB),遇到一个bug,查了很久才发现原因。 Date date = new Date(); Timestamp t1 = new Timestamp(date.getTime()); System.out.println("Date equals Timestam...原创 2018-04-15 19:30:29 · 1054 阅读 · 1 评论 -
Moco入门
接口测试前段时间对系统中所有的接口Web Service添加了测试用例。这些用例在执行的的过程中多少也会受依赖环境的影响。比如RestAssured:public class RestInterfaceIT { @Before public void setUp() throws Exception { RestAssured.baseURI = "http://h...原创 2018-03-18 12:54:51 · 11566 阅读 · 0 评论 -
JMS学习整理
面向消息的中间件随着系统变大变复杂,一个大的系统,开始向着领域模型和微服务架构演进。而各个子系统之间的通信开始变得复杂、重要。不过总的来说还是分两类:同步通信和异步通信。对于同步通信,现在通俗的做法有REST、RPC、SOAP等。对于异步,现在用的最多就是面向消息的中间件(Message Oriented Middleware,MOM)。我们知道异步通信一般有两个问题,一是发送方进程与消息服务端进...原创 2018-03-16 10:52:37 · 1065 阅读 · 0 评论 -
Hamcrest 总结
JunitJUnit框架用一组assert方法封装了一些常用的断言。这些assert方法可以帮我们简化单元测试的编写。这样的话,Junit就可以根据这些断言是否抛出 AssertionFailedError 错误来判断测试用例的执行结果。 Hamcrest使用过Junit 的应该有过体验:在实际开发中,一些基本的断言,如eqaul,null,true它们的可读性并不是很好。而且很多时...原创 2018-01-23 22:49:09 · 17356 阅读 · 0 评论 -
Maven打包war和ear
在软件开发过程中,我们需要经常对项目进行打包并部署。这里的打包即-构建项目软件包。说白了,其实就是对项目中的各种文件,比如编译生成的字节码、配置文件、文档等,根据maven规范的格式或者配置的要求生成归档。最常见的就是对JAR包和WAR包打包。后者是一般都是web 项目。通常情况下,我们的项目可能很大,也会划分成web 项目模块和一些后台模块。这个时候一般都是将web 项目打包成 wa原创 2017-10-19 22:24:28 · 2988 阅读 · 1 评论 -
Maven profile实现多环境配置
实际开发项目是需要配置多套环境配置的,如开发、测试、生产等。 在Maven中,有种多环境配置的方法,可以做到在开发、测试、运营的时候,使用各自对应的环境配置,可以大大的提高开发效率。用个例子说明下。为了对比方便,这里创建了一个聚合项目,然后其中一个Project根据构建参数不同,加载不同配置。另一个Project不加载配置。目录如下:这里有三个project,各自的pom如下:原创 2017-10-18 11:34:29 · 532 阅读 · 0 评论 -
Maven命令及生命周期
最近查项目中有个模块build 失败的原因。了解下对maven 的一些分析依赖的命令和周期。这里简单列下。命令编译mvn compile构建打包mvn clean install查看 pom这里包括系统的一些默认设置和用户的自定义设置。即比我们编写的pom.xml 更完整。mvn help:effective-pom生成报告mvn sit原创 2017-09-18 14:12:42 · 498 阅读 · 0 评论