
Core Java
文章平均质量分 79
kimy
近5年的Java架构开发经验。喜欢专研技术,熟悉Python,PHP,Perl语言。希望能够为社区贡献一份力。
展开
-
Log4j之高级配置
绝大多数的Java项目记录日志都是使用Log4j,简单的配置网上有很详细的教程。当项目变得复杂,比如分很多模块,很多层次,很多通信方式时,需要把不同模块或者不同层次或者不同通信方式的日志记录到不同的文件输出。本文就介绍如何配置Log4j以满足以上需求。 Log4j日记记录过程可以拆解为日志来源以及日志的输出地之间的关系。日志的来源与日志输出完全独立,可以是多对多的关系。说得简单一点就原创 2012-06-17 09:11:55 · 8858 阅读 · 0 评论 -
4种Java引用浅解
最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档、代码以及几篇文章。做个小结,如有错误,欢迎指正。之所以想学习一下Java的几种引用类型,原因有两个:理解Java Cache实现、学习Java引用与Java垃圾回收机制的关系内存资源是有限的,需要合理的利用。Cache不是仅仅HashMap那么简单,Java引用与Java原创 2014-04-28 12:56:08 · 14068 阅读 · 0 评论 -
Java SSL Socket通讯示例
上一篇《OpenSSL与KeyStore指令小集》里面说到,最近研究SSL加密,会给出一个Java的小示例。复制一份可以运行的代码到生产上是非常不负责任的行为,不过小示例可以带我们入门,快速看清事物的本质。罗马不是一天建成的。本文将给出一个Java SSL Socket的小例子,包括了Server和Client。希望大家上手之后,要多去研究相关的资料,理解基础概念。Java的优点是封装得比较彻原创 2015-02-07 15:37:32 · 16084 阅读 · 0 评论 -
Java 8之方法引用(Method References)
Java 8中方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能通过方法引用来或者诸如方法签名的相关信息。方法引用的分类方法引用分为4类,常用的是前两种。方法引用也受到访问控制权限的限制,可以通过在引用位置是否能够调用被引用方法来判断。具体分类信息如下:引用静态方法 ContainingClass::staticMethod原创 2015-08-03 13:48:41 · 26899 阅读 · 0 评论 -
Java 8之Stream适用场景
Stream是Java 8中的一个大的改进。Stream的功能是,支持集合的各种操作,比如filter, sum, max, min, average, map, reduce等等。所以我个人认为Stream的出现是基于以下原因:增强集合操作拥抱函数式编程充分利用Lambda执行效率的提高 - 透明支持多线程集合操作笔者尝试测试一下Stream并发处理的威力,发现面对特别简单的任务,Str原创 2015-08-14 17:53:18 · 23221 阅读 · 3 评论 -
Java 8之Lambda
公司内部的一些新项目相继采用了Java 8,这才有了动力好好的研究一下Java 8这个传说中的大杀器。Java 8文档里面提到的第一个改进就是Lambda,就从它入手好了。社区好多大神都已经研究几年了,拜一下。有不准确的地方,望指正。为什么要Lambda把Java代码写得更简洁一点,更直白来说,就是写出来的代码篇幅更短。那么简单?核心来说,是的,不过可能额外带来一些好处。理论上来说,Lambda不是原创 2015-07-30 19:34:33 · 2042 阅读 · 1 评论 -
Java 8 之默认方法(Default Methods)
Oracle官网是这样介绍默认方法的,使用默认方法,可以达到往接口里面增加新的功能,而且保持与老版本代码兼容,也就是原来的实现类可以不需要被动修改。所以,默认方法位置是在接口里面;默认方法具有实现,不会强制具体类来现。Java 8要充分利用Lambda,需要增强大量的类库,但是又希望做到兼容性,只能用默认方法这个大招。默认方法默认方法与普通的接口方法相比,最前面增加default关键字,参数列表之后原创 2015-08-04 15:29:53 · 8706 阅读 · 1 评论 -
Frege-基于JVM的类Haskell纯函数式编程语言
Frege是一门受Haskell语言启发而设计的纯函数式编程语言。Frege程序会被编译为Java,并运行于JVM上。它与Haskell是如此的相似,以至于有人称它为JVM上的Haskell。取Frege这个名字是为了纪念德国数学家、逻辑学家、哲学家Gottlob Frege。语言的主要特色纯函数式编程语言 继承了函数式编程语言Haskell的精神,默认就具有不变性(immutability)。原创 2015-08-17 16:47:44 · 2184 阅读 · 0 评论 -
JUnit与Mockito单元测试典型示例
单元测试的重要性无需赘述,但单元测试也会遇到困难,其中之一就是如何 创建依赖。试想我们常见的server端分层架构,数据访问层Dao,业务层, 以及Web层,想要单元测试业务层,我们需要依赖Dao层提供数据支持,Dao 层又依赖数据库,数据库需要shema以及data。为了测试业务逻辑,竟然 需要准备那么多东西,想想就麻烦,单元测试的热情也减去大半。**这个问题的 解法就是mock技术,模原创 2016-03-31 14:50:35 · 12210 阅读 · 3 评论 -
JDK自带内存及线程分析工具小记
查询、监控、分析Java应用程序的时候,我们关注的点主要集中在资源利用,比如CPU,内存,IO,线程等。其中内存以及线程的分析尤为常见。内存,是否有内存泄漏,各个区块内存分配是否大小合适。线程,数目是否合理,有没有死锁,运行状态如何。jps -vljps是JDK提供的一个小工具,上面的命令会把操作系统里面的java应用都展示出来,显示PID,启动类或者JAR,VM参数。可以通过jps -help进一原创 2016-03-24 11:50:16 · 12373 阅读 · 0 评论 -
Spring Transaction配置简介
可以从以下多个维度配置Spring事务。propagation表示当前事务与父事务(同一个线程中之前申明事务)的关系。父子事务体现为,方法调用栈的调用先后顺序。 说得更直白点,就是一个方法Method1调用另外一个申明Transaction的Method2,Method1可能申明Transaction,也可能没有,Method2如何处理Transaction的问题。PROPAGATION_REQU原创 2016-04-22 17:16:38 · 4396 阅读 · 1 评论 -
Docker环境下Java应用的堆内存控制
在boom里面部署docker应用, 应用编排时都需要指定一个内存的最大使用上限。如果应用使用的内存超过了配额,镜像会被kill掉。所以java微服务应用,有必要设置应用自己的最大内存。参数说明设置java最大内存的方式在Dockerfile里面, 加上”-Xmx800m”类似的参数,表示Heap上限800兆。例如: CMD [“java”, “-Xmx800m”, “-jar”, “icare原创 2016-09-06 11:45:55 · 8968 阅读 · 0 评论 -
URL encoding科普
什么是URL encodingURL encoding是Uniform Resource Identifier(URI)规范文档中对特殊字符编码制定的规则。本质是把一个字符转为 %加上UTF-8编码对应的16进制数字。故又称之为Percent-encoding。RFC 3986把字符分为以下三类: 1. 18个保留字符。: / ? # [ ] @ ! $ & ' ( )原创 2016-12-07 20:59:46 · 5151 阅读 · 1 评论 -
LinkedList的一种错误用法
最近在做图像处理的时候,发现某一段代码非常的慢,慢得让人无法接受。主要的代码是顺序访问一个LinkedList的元素,效果是随着index的变大,速度越来越慢,list的元素个数在百万以上。找到原因,分享出来,也希望大家不要跳入同一个陷阱。还是那一句话,可运行的代码和高质量的代码之间还是有比较远的距离。LinkedList错误用法示例代码里面加入了一些打印时间相关的代码,主要是为了直观的显原创 2014-05-09 11:37:21 · 12096 阅读 · 2 评论 -
二叉搜索树之Java实现
h2 id="_1">什么是二叉搜索树二叉搜索树(Binary Search Tree),是最基础,且相对简单的一种数据结构,支持Insert,Delete,Search,Min,Max,Successor,Predecessor等操作。最大的特点是每一个节点有不超过两个子节点,并且左子节点小于或者等于父节点,而右节点大于或者等于父节点。说它基础,是因为很多其它树形数据结构以它为原型而扩展,比原创 2014-03-23 15:33:03 · 4638 阅读 · 2 评论 -
HashMap之Java实现
HashMap是使用最频繁、最重要的数据结构之一,提供了字典操作功能,Insert、Search、Delete操作的效率都很高。本文将尝试用Java实现一个最简单的HashMap。因为简单,才容易看到HashMap的本真设计思想。什么是Hash依我的理解,Hash就是把一个对象转化为一个正整数的过程。相同的对象产生相同的Hash Code,但不同的对象的Hash Code具有随机的特点,不原创 2014-03-20 23:00:38 · 10682 阅读 · 0 评论 -
JAVA反射与AOP双剑合璧详细记录操作日志
运用AOP来记录用户的操作日志在项目中比较常见,优点是只需在一个地方编写Advice,通过AOP声明(织入)然后就可以记录很多不同的操作(API)。但是也有其缺点,因为Advice服务于不同的API,而各个API的参数,返回值不同,甚至服务的对象都不一样,那么能做到的也只能是判断是否有异常,异常的具体信息等简单的内容。如果想要个性化的为每一个API都记录执行参数,返回值,甚至Target的属性时就原创 2012-06-06 19:33:34 · 14567 阅读 · 0 评论 -
运用Command设计模式释放Server资源
Server可能与多个系统建立连接,当Shutdown的时候需要释放资源。比如数据库连接,Socket连接等等。当然也可能需要释放本地资源。本文主要展示如何运用Command设计模式来实现服务器资源的释放。得到的效果是不同的资源释放过程具有独立性,新增释放过程不会影响到原来的架构设计。 首先定义一个释放资源的统一接口Releaser,为Command模式中的Command。原创 2012-06-05 13:39:25 · 2884 阅读 · 0 评论 -
Java多线程程序非阻塞式锁定实现
Java对多线程程序的锁定已经有良好的支持,通常使用synchronized修饰一个方法或者一段代码。但是有一个问题,多个线程同时调用同一个方法的时候,所有线程都被排队处理了。该被调用的方法越耗时,线程越多的时候,等待的线程等待的时间也就越长,甚至于几分钟或者几十分钟。对于Web等对反应时间要求很高的系统来说,这是不可以接受的。本文就介绍一种自己实现的锁定方法,可以在没有拿到锁之后马上返回,告诉客原创 2012-06-19 14:22:59 · 6335 阅读 · 0 评论 -
运用ThreadLocal工具实现线程专有变量
普通对象的变量,当有多个线程访问时,虽然每个线程都有一份拷贝,但这是由于虚拟机优化而发生的,原则上来看都是同一份。可以通过加volatitle关键字阻止虚拟机优化。本文讨论的相反,希望实现每一个线程都有自己专有的变量对象。您自己当然可以通过threadId+Map的方式实现,但Java类库已经提供了ThreadLocal,可以直接使用,本文将介绍其用法。 ThreadLocal是一原创 2012-06-27 00:02:34 · 2050 阅读 · 0 评论 -
Huffman编码算法之Java实现
Huffman编码介绍Huffman编码处理的是字符以及字符对应的二进制的编码配对问题,分为编码和解码,目的是压缩字符对应的二进制数据长度。我们知道字符存贮和传输的时候都是二进制的(计算机只认识0/1),那么就有字符与二进制之间的mapping关系。字符属于字符集(Charset), 字符需要通过编码(encode)为二进制进行存贮和传输,显示的时候需要解码(decode)回字符,字符集与编码原创 2013-11-29 11:55:15 · 34468 阅读 · 8 评论 -
Java多线程总结
Java多线程是什么Java提供的并发(同时、独立)处理多个任务的机制。多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级。依我的理解,Java多线程完全就是为了提高CPU的利用率。Java的线程有4种状态,新建(New)、运行(Runnable)、阻塞(Blocked)、结束(Dead),关键就在于阻塞(Blocked),阻塞意味着等待,阻塞的的线原创 2013-12-31 15:47:55 · 8777 阅读 · 1 评论 -
生产者消费者Java多线程实现
生产者和消费者问题是最经典的模拟多线程合作的问题之一,本文将提供一个具有多个生产者和多个消费者的Java实现。主要涉及到资源的锁定,多线程的合作,以及任务的抽象。产品的抽象每个产品都有一个唯一编号no,在构造函数里面初始化。static class Product { private static int index = 0; private int no; public原创 2013-12-31 17:41:12 · 2768 阅读 · 0 评论 -
Java启动命令大观
Java启动命令是所有java应用程序的入口,通过它来启动Java运行时环境,并加载相关的class。不过由于IDE的盛行,我们Java程序员中的大多数的并不是非常的了解Java启动命令。本文希望做一个Java启动命令的汇总,和各位同道分享,也便于日后作为自己的参考。Java启动命令语法Java启动命令有两个,java以及javaw,它们的唯一区别是javaw不会启动一个控制台窗口(启动失原创 2013-12-15 22:03:02 · 18689 阅读 · 0 评论 -
JAR规格和使用清单
得益于Ant、Maven等构建工具的强大功能,日常软件的打包部署通常都交给它们了。不过最近遇到点构建的问题,查了JAR相关的一些文章。在此做一个总结,对JAR有兴趣的朋友可以一看。什么是JARJAR全称为Java Archive,zip格式的Java打包文件。目的是用来把class文件,资源文件打包成一个文件,利于部署,发布,以及传输。除了打包功能,它被用来构建应用组件(Applicati原创 2013-12-23 10:51:22 · 3634 阅读 · 0 评论 -
Java垃圾回收器总结
什么是Java垃圾回收器Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存快)。某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡原创 2014-01-14 16:25:31 · 32483 阅读 · 4 评论 -
Java NIO小结
Java NIO是什么J2SE 1.4引进的Java IO新特性,实现JSR 51,是Java原IO系统的增强和补充,故取New IO之名。相关的类都放在java.nio包下。为什么需要Java nio两个字,效率,NIO能够处理的所有场景,原IO基本都能做到,NIO因效率而生,效率包括处理速度和吞吐量(Througthout, Scalability)。Java原IO都是流式的(Stream O原创 2014-03-12 15:56:25 · 5637 阅读 · 2 评论 -
Java编码规范
先借编码规范之名,行吐槽之实,抱歉。写干净整洁的代码阅读代码,眼缘很重要。代码是程序员的脸,保持干净整洁。记得格式化代码。建议使用eclipse默认的就行,Ctrl+Shift+F。项目内部格式化风格一定要统一,否则svn很难track。鉴于Java开发库以及流行的开源框架都用Block起始大括号不换行风格,Google也如此规范,统一为这种风格。去除没有用到的类引用纯粹是原创 2014-03-13 18:05:16 · 5993 阅读 · 2 评论 -
如何精简maven项目的依赖jar包
如何精简maven项目的依赖jar包maven依赖管理,真的是一把双刃剑,规范和简化了依赖配置,但是也像个黑盒子,隐藏了太多的东西,依赖了很多没有用到的jar包。 今天我们就聊一聊如何用maven的dependency插件,分析依赖关系,从而精简依赖jar包。查看当前的依赖情况mvn dependency:tree > tree.txt分析依赖情况, 请把结果存入tree.txt文件分析一下那些j原创 2017-09-27 15:57:30 · 2955 阅读 · 0 评论