JAVA
文章平均质量分 72
奔跑吧小蜗牛
志存高远,脚踏实地。
展开
-
Java Logging之JUL系列——Logger Hierarchy
本文介绍JUL中日志记录器Logger的层级结构,JUL中Logger是按照树状结构进行组织的,日志记录器之间的父子关系是根据点号(.)进行区分的,比如有两个日志记录器,名字分别是cn.codecrazy和cn.codecrazy.logging,那么前者就是后者的父日志记录器。通过后者的getParent()得到的Logger就是名字为cn.codecrazy的Logger。根日志记录器(Ro...原创 2019-11-14 10:10:50 · 8227 阅读 · 0 评论 -
Java Logging之JUL系列——Handler
前面的文章我们提到过,Handler是真正执行日志输出操作的地方,JUL中的Handler由java.util.logging.Handler抽象类来表示。有两个实现类直接继承自Handler,分别是StreamHandler和MemoryHandler,而StreamHandler又有三个直接子类分别是ConsoleHandler,FileHandler以及SocketHandler。Hand...原创 2019-11-14 10:09:31 · 6366 阅读 · 1 评论 -
Java Logging之JUL系列——LogRecord
上文提到过,LogRecord可以理解为是一个DTO,那么LogRecord里面到底存储了哪些数据呢?我们可以看一下LogRecord类中含有哪些get/set方法,get方法如下所示:Level getLevel()String getLoggerName()String getMessage()long getMillis()Object[] ...原创 2019-11-14 10:08:06 · 5038 阅读 · 0 评论 -
Java Logging之JUL系列——Filter
本文介绍日志过滤器(Filter),顾名思义,Filter就是用来对输出的日志信息进行过滤作用的,我们可以根据很多维度来对日志信息进行过滤,比如只输出message中包含某段文本信息的日志,或者只输出某个方法中记录的日志等等。具体能根据哪些维度来过滤我们后面介绍LogRecord的时候再回顾一下。本文我只举两个例子,一个是根据具体文本信息进行过滤,另一个是根据方法名来过滤。先简单地说一下java...原创 2019-11-14 10:05:41 · 9649 阅读 · 0 评论 -
Java Logging之JUL系列——Log Levels
JDK自带的日志组件在java.util.logging包中,该组件将日志级别分为如下九种,级别从上到下依次降低,每种级别都对应一个整数值,如下所示:OFF(Integer.MAX_VALUE)SEVERE(1000)WARNING(900)INFO(800)CONFIG(700)FINE(500)FINER(400)FINEST(300)ALL(Integer.MIN_VAL...原创 2019-11-14 10:03:59 · 4896 阅读 · 0 评论 -
finally块中包含return语句对返回值的影响
要想弄清楚这个问题,最好是从字节码指令的层次进行分析,我们以如下代码段进行举例:public int test() { int i=0; try { i = 1; return i; } finally { i = 2; return i;原创 2016-08-19 19:42:06 · 4983 阅读 · 1 评论 -
非静态内部类和静态内部类的区别
public class OuterClass { private String outerName = "outerName"; private static String outerStaticName = "outerStaticName"; private void outerDisplay() { System.out.println(outerNam原创 2016-08-11 16:12:20 · 428 阅读 · 0 评论 -
java线程同步举例
代码功能:子线程每次循环5次,主线程每次循环10次,子线程先执行,如此交替执行50次。 分析:子线程执行过程中不能被主线程打断,主线程执行过程中不能被子线程打断,因此需要进行互斥,需要交替执行,因此需要进行同步。互斥可以利用synchronized,同步可以采用wait和notify代码如下:public class SynchronousTest { public static v原创 2016-08-15 11:46:11 · 447 阅读 · 0 评论 -
Guava Cache 本地缓存组件浅析
cache组件中核心的类和接口列举如下: 接口:Cache 本地缓存的顶级接口,提供一些对缓存进行get,put的方法,以及获取缓存统计数据的方法等。LoadingCache 继承了Cache接口,并另外提供了一些当get数据不存在时自动去load相关key(s)所对应的value(s)的契约(即接口中的抽象方法),具体实现见LoadingCache的具体实现类。RemovalListene原创 2017-03-02 12:08:46 · 4831 阅读 · 1 评论 -
Java注解浅析
注解(Annotation)是JDK1.5引入的机制,我们平时经常会遇到一些注解,比如@Override,@Test等,也知道这些注解是在哪些情况下使用的,但是却很少去关注注解这一机制本身,比如注解是如何定义的,注解的实现机制是什么样的等等。本文将介绍注解的一些相关概念,并在文章最后实现一个自定义注解来强化我们对注解这一机制的认识。常见注解举例如何定义一个注解元注解Tar...原创 2018-08-31 10:58:20 · 290 阅读 · 0 评论 -
Java重复类问题探究
集成开发环境(IDE)是一把双刃剑,为我们提供莫大便利的同时也隐藏了很多的问题。一旦出现问题,如果不了解内部的一些机制会让我们手足无措。本文抛开IDE,用最原始的方式还原重复类引发的一个问题,希望能给大家一点启发。重复类的定义重复类可能引起的问题重复类举例重复类报错原因分析重复类的定义重复类是指程序中存在两个或者多个包名以及类名都一致的类。如果只是类...原创 2018-09-01 23:58:37 · 18066 阅读 · 1 评论 -
HashMap如何根据Value排序?
去某公司面试时候的一道题目,卡在这个关键的地方,关键还是要熟悉集合的那些操作。public class Main { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("aaa", 4); map.put("原创 2016-07-15 11:36:59 · 1226 阅读 · 0 评论 -
java RMI远程方法调用编程模型初探
RMI是实现分布式编程的方法之一,java RMI的实现比较复杂,涉及到Socket编程,序列化等等,但是我们用起来却相当简单。下面举一个简单的例子来阐述一下RMI编程的大体框架。大方向分为2个部分,客户端程序和服务器端程序,这二者之间的桥梁是公共的接口,接口定义了一系列服务,也就是一系列方法。如某个接口文件IHelloWorld.java内容如下:import java.rmi.Remo原创 2016-06-19 15:02:39 · 487 阅读 · 0 评论 -
JDK源码解析之List和Set接口
List和Set是两个接口,从继承层次上讲,它们都继承自Collection接口。从这2个接口所拥有的方法来分析的话,Set接口基本上和Collection接口拥有一样的方法,与List接口相比,Set接口少了的方法几乎都是和下标操作相关的,二者区别简述如下:第一,List中的元素可以重复,Set中的元素不能重复第二,List中的元素维持了一个顺序,可以通过下标去操作元素,Set中的元原创 2016-05-14 22:02:07 · 529 阅读 · 0 评论 -
自定义类如何重写hashCode方法
要重写自己的hashCode方法并没有什么绝对正确的答案,但是我们的目标是:不相等的对象尽可能有不同的hashCode,而且必须满足的一个通用约定是:相等的对象应该具有相同的hashCode。下面介绍一种hashCode的实现方式,这种实现方式对一般的程序来说足够了,至于如何实现更完美的hashCode方法就留给数学家或者理论家去讨论吧。第一步:定义一个初始值,一般来说取17int res...原创 2016-05-17 17:23:50 · 8277 阅读 · 1 评论 -
java泛型实现链式栈
public class LinkedStack { private Node top; public LinkedStack() { this.top = new Node(); } public void push(T element) { top = new Node(element, top); } public T pop() { T result =原创 2016-05-19 21:48:51 · 1716 阅读 · 0 评论 -
用Condition条件变量实现生产者消费者模式
import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class ProducerConsumerPattern{ public static final int MAX_CAP = 20;原创 2016-04-01 17:40:09 · 2357 阅读 · 0 评论 -
用wait和notify/notifyAll实现生产者消费者模式
生产者消费者模式的实现方式有很多种,比如采用Condition条件变量或者利用阻塞队列来进行实现。本文将采用Object中自带的wait和notify/notifyAll方法来实现这个模式。实现代码如下:import java.util.LinkedList;public class ProducerConsumerPattern{ public static final int MA原创 2016-03-31 18:42:43 · 1650 阅读 · 3 评论 -
ArrayBlockingQueue源码浅析
ArrayBlockingQueue位于java.util.concurrent并发包中,是从JDK1.5之后添加的。以下解析均基于目前最新的JDK1.8版本。public class ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable从这里我们可以看出,原创 2016-03-30 16:27:47 · 366 阅读 · 0 评论 -
Ubuntu下jmap以及jinfo出现Can't attach to the process问题的解决办法
cd /etc/sysctl.d该目录下有一个名为“10-ptrace.conf”的文件,sudo vim 10-ptrace.conf以超级用户权限打开该文件,并将里面的一行kernel.yama.ptrace_scope = 1修改为kernel.yama.ptrace_scope = 0保存并退出,重启系统。(如果你纳闷为什么要这么改的话,可以好好看下那个文件里面的注释)原创 2016-05-03 15:41:01 · 5753 阅读 · 0 评论 -
JDK源码解析之HashMap类
以下解析基于JDK8.0HashMap的继承关系如下所示:public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {Map是一个顶级接口,跟Collection接口并没有什么关系。HashMap的默认容量是16(1final int hash; //存储key的has原创 2016-05-04 20:49:41 · 373 阅读 · 0 评论 -
JDK源码解析之StringBuilder和StringBuffer
以下解析基于JDK8.0二者的继承层次是一样的:public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{ public final class StringBuffer extends AbstractS原创 2016-05-01 21:29:34 · 1308 阅读 · 0 评论 -
JDK源码浅析之ArrayList类
以下解析基于JDK8.0ArrayList的继承关系如下:public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable{ArrayList的底层是用数组实现的:transient Object[] elementD原创 2016-05-01 14:36:52 · 347 阅读 · 0 评论 -
JDK源码浅析之String类
以下解析基于JDK7.0版本如源码所示,String类是一个final类,因此不能从String类派生出任何子类public final class String implements java.io.Serializable, Comparable, CharSequence {String类的底层是基于字符数组char[]实现的,作为String类的一个成员变量原创 2016-04-30 23:03:11 · 405 阅读 · 0 评论 -
重写equals方法一般需要重写hashCode方法的原因
equals方法和hashCode方法都是Object类中的方法,其中equals方法在Object中有一个简单的实现: public boolean equals(Object obj) { return (this == obj); }也就是说默认情况下,只有两个对象的引用相同,则equals返回true,这是很严格的条件,但是我们的需求中,判断对象相等有原创 2016-05-04 21:39:46 · 727 阅读 · 0 评论