
Java
文章平均质量分 58
Joepis
一入编程深似海,从此。。。(你懂的)
展开
-
logback的配置和使用
logback推出后,可以用来完美替代原来的log4j了,这2个日志框架是同一个作者,而新出的logback,在性能上要优于log4j 关于log日志,首先说说日志级别的5个 LEVEL:从高到低分别是FATAL、ERROR、WARN、INFO、DEBUG低级别的会输出高级别信息,高级别不会输出低级别信息。例如:等级设为ERROR的话,WARN、INFO、DEBUG的信息是不会输出...原创 2016-07-10 16:22:26 · 2379 阅读 · 0 评论 -
理解JVM(四):JVM类加载机制
Class文件我们写的Java代码,经过编译器编译之后,就成为了.class文件,从本地机器码变成了字节码。Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。Class文件中只有2种数据结构:无符号数和表。每个Class文件的头4...原创 2018-08-01 11:36:57 · 211 阅读 · 0 评论 -
理解JVM(三):JVM命令工具
jps(JVM Process Status Tool)虚拟机进程状况工具,可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(MainClass,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。命令格式:jps[options][hostid]参数: -q:只输出LVMID,省略主类名称...原创 2018-08-01 11:36:24 · 165 阅读 · 0 评论 -
理解JVM(二):垃圾收集算法
判断哪些对象需要被回收引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。 但是JVM没有使用此方法,因为此方法无法解决2个对象相互循环引用的问题。可达性分析算法: 这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路...原创 2018-08-01 11:35:51 · 179 阅读 · 0 评论 -
Spring的事件机制
当把一个事件发布到Spring提供的ApplicationContext中,被监听器侦测到,就会执行对应的处理方法。事件本身事件是一个自定义的类,需要继承Spring提供的ApplicationEvent。@Datapublic class MyEvent extends ApplicationEvent { private String msg; publ...原创 2018-08-01 11:35:00 · 250 阅读 · 0 评论 -
Java8学习笔记之Stream API
摘要: 原创出处 http://peijie2016.oschina.io 欢迎转载,保留摘要,谢谢!Stream是Java8引入的一个重度使用lambda表达式的API。 Stream可以用流的方式处理数据集合,在Java8之前,我们处理这些集合,是需要迭代器的,比如iterator,这是外部迭代;而Stream是内部迭代,我们不用关心集合内部元素是如何迭代的,计算机会自动帮我们选择最适合的实原创 2017-04-26 13:28:21 · 1212 阅读 · 0 评论 -
Java8学习笔记之新日期API
摘要: 原创出处 http://peijie2016.oschina.io 欢迎转载,保留摘要,谢谢!Java8对日期API做了改进,提供了许多好用的方法和接口。 首先,最基本也最重要的3个对象: - LocalDate:日期对象 - LocalTime:时间对象 - LocalDateTime:日期时间对象,是LocalDate和LocalTime的合集对象的创建以上这3个对象,都各自有原创 2017-05-08 17:23:37 · 479 阅读 · 0 评论 -
Java8学习笔记之Lambda表达式
摘要: 原创出处 http://peijie2016.oschina.io 欢迎转载,保留摘要,谢谢! 使用Lambda表达式,我们可以很简洁地传递代码(通常是匿名函数)。结构Lambda表达式主要分为三部分:参数列表,箭头,Lambda 主体语法(parameters) -> expression(parameters) -> { statements; }如果表达式只有一行,用第一种,原创 2017-04-19 16:48:01 · 545 阅读 · 0 评论 -
Java8学习笔记之行为参数化
摘要: 原创出处 http://peijie2016.oschina.io 欢迎转载,保留摘要,谢谢!用一个例子说明行为参数化带来的变化 - 从苹果仓库中筛选苹果版本1从一个苹果集合中选出绿的苹果public static List<Apple> filterGreenApples(List<Apple> inventory) { List<Apple> result = new原创 2017-04-19 14:11:59 · 550 阅读 · 0 评论 -
理解JVM(五):Java内存模型与线程
Java内存模型JMM(Java Memory Model)是JVM定义的内存模型,用来屏蔽各种硬件和操作系统的内存访问差异。 * 主内存:所有的变量都存储在主内存(Main Memory,类比物理内存)中。 * 工作内存:每条线程有自己的工作内存(Working Memory,类比处理器高速缓存),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋...原创 2018-08-01 11:37:33 · 434 阅读 · 0 评论 -
理解JVM(六):线程安全和锁优化
线程安全的实现方法互斥同步互斥是因,同步是果;互斥是方法,同步是目的。synchronized关键字synchronized关键字是基本的互斥同步手段。它在编译后会在同步代码块前后加入2条字节码指令:monitorenter和monitorexit这两个字节码都需要一个reference类型的参数来指明要锁定和解锁的对象。如果Java程序中的synchronized指定...原创 2018-08-01 11:38:54 · 222 阅读 · 0 评论 -
JDK默认使用的垃圾回收器
查看方法 java -XX:+PrintCommandLineFlags -version 引用《深入理解Java虚拟机:JVM高级特性与最佳实践》的介绍: 所以,jdk8环境下,默认使用 Parallel Scavenge(新生代)+ Serial Old(老年代)-XX:+PrintCommandLineFlagsjvm参数可查看默认设置收集器类型-XX:+Pr...原创 2018-09-10 16:01:09 · 11820 阅读 · 5 评论 -
Java中的异常
Java异常分类所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:ErrorExceptionErrorError表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了。例如,内存溢出和线程死锁等系统问题。ExceptionException表示程序还能够克服和恢复的问题,其中又分为2类系统异常:是软件本身缺...原创 2018-09-12 19:53:21 · 315 阅读 · 0 评论 -
java并发编程--Executor框架
摘要: Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。Exexctor简介E...转载 2018-08-25 20:47:44 · 274 阅读 · 0 评论 -
Java IO 总结
IO的分类BIO(Blocking I/O):同步阻塞IO以电脑为中心,InputStream(Reader)就是将外部数据以流的形式加载到电脑的内存中,OutputStream(Writer)就是把内存中的数据以流的形式向外输出。字节流:以xxStream命名,一般成对出现,如InputStream,OutputStream常见的字节流: * 文件流:FileInput...原创 2018-08-10 22:51:19 · 198 阅读 · 0 评论 -
JDK8和JDK9双版本共存
摘要: 原创出处 https://peijie-sh.github.io 欢迎转载,保留摘要,谢谢!以前安装JDK,需要手动配置环境变量。JDK8多了自动配置环境变量,所以可以不用手动配置。 如果我已经装了JDK8,还想再装一个JDK9,安装完,自动配置的环境变量会指向JDK9版本。解决方法删除自动配置的环境变量 自动配置的环境变量是一个隐藏目录:C:\Program...原创 2018-08-10 22:38:13 · 5579 阅读 · 1 评论 -
Java NIO系列教程(一) Java NIO 概述
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO 由以下几个核心部分组成:Channels Buffers Selectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Selector 构成了核心的API。其它组件,如Pipe和FileLock,只不过是与三个核心组件共同...转载 2016-08-18 15:51:51 · 294 阅读 · 0 评论 -
集合迭代时对集合进行修改抛ConcurrentModificationException原因的深究以及解决方案
大家应该都知道, 在java中, 在对一些集合迭代的过程中对集合进行一些修改的操作, 比如说add,remove之类的操作, 搞不好就会抛ConcurrentModificationException, 这一点在API文档上也有说的! 在迭代时只可以用迭代器进行删除! 但是文档上只是说了删除, 其他操作也会引起ConcurrentModificationException, 这是为何呢...转载 2018-08-10 22:09:48 · 327 阅读 · 0 评论 -
理解JVM(七):垃圾回收器
一些概念并行(Parallel)指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concurrent)指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。吞吐量CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时...原创 2018-08-01 11:39:22 · 164 阅读 · 0 评论 -
理解JVM(一):内存结构
在JVM中,内存主要被分为5类堆Heap存放关键字new创建的对象和数组。堆内存被所有线程共享。这块内存区由JVM(Java虚拟机)自己管理。当使用new创建对象时,不必指定分配空间的大小,JVM会动态自动分配一块区域;当程序执行过程中,指向此对象的引用消失,此对象就被标记为可被回收状态,将由GC(垃圾回收器)在一个不确定的时间自动回收,释放所占的内存空间。虚拟机栈VM Stack存放8种原创 2017-02-16 15:27:20 · 398 阅读 · 0 评论 -
谈谈Java中的代理
代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,实现对相关方法增强。比如加入事务、日志、报警发邮件等操作。静态代理静态代理,就是由程序员手动编写代理类或者用工具生成代理类的代码,再进行编译生成class文件,实现代理。比如简单工厂模式。用法:代理类和目标类都实现相同接口。代理类持有目标类的引用。缺点: 静态代理要为每个目标类创建一个代理类,当需要代理的对象太多,那么代理类也变原创 2017-02-17 15:38:28 · 437 阅读 · 0 评论 -
Java NIO系列教程(五) 通道之间的数据传输
原文地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html作者:Jakob Jenkov 译者:郭蕾 校对:周泰在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。transf转载 2016-08-18 15:58:58 · 323 阅读 · 0 评论 -
Java NIO系列教程(四) Scatter/Gather
原文地址:http://tutorials.jenkov.com/java-nio/scatter-gather.html作者:Jakob Jenkov 译者:郭蕾 Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。分散(sca转载 2016-08-18 15:58:14 · 274 阅读 · 0 评论 -
Java NIO系列教程(二) Channel
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:转载 2016-08-18 15:54:55 · 334 阅读 · 0 评论 -
SpringBoot日志管理
Spring Boot在所有内部日志中使用 Commons Logging ,但是默认配置也提供了对常用日志的支持,如: Java Util Logging , Log4J , Log4J2 和 Logback 。每种Logger都可以通过配置使用控制台或者文件输出日志内容。 格式化日志 默认的日志输出如下:2016-04-13 08:23:50.120 INFO 37397...转载 2016-06-10 21:17:57 · 513 阅读 · 0 评论 -
Hibernate Validator学习笔记
Hibernate Validator 是 Bean Validation 的参考实现 。Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。1. Bean Validation原创 2016-07-06 20:37:35 · 26436 阅读 · 2 评论 -
OkHttp的基本使用——替代Apache HttpClient
http是现在主流应用使用的网络请求方式, 用来交换数据和内容, 有效的使用HTTP可以使你的APP 变的更快和减少流量的使用OkHttp 是一个很棒HTTP客户端:支持SPDY, 可以合并多个到同一个主机的请求 使用连接池技术减少请求的延迟(如果SPDY是可用的话) 使用GZIP压缩减少传输的数据量 缓存响应避免重复的网络请求OkHttp可以替换Apache的HttpCli...原创 2016-07-05 17:27:45 · 14215 阅读 · 1 评论 -
springBoot简单入门
今天学学springboot,springboot是spring4新出的,目的在于减少配置,加快开发速度,springboot中内嵌了tomcat等。来看一个简单的hello world 的小demo1.新建一个maven项目pom.xml 4.0.0 com.lpj springboot 0.0.1-SNAPSHOT org.spring原创 2016-06-10 20:43:02 · 556 阅读 · 0 评论 -
SpringMVC重定向传参数的实现
在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到。但是,这样使用的是forward方式,浏览器的地址栏是不变的,如果这时候浏览器F5刷新,就会造成表单重复提交的情况。所以,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交。jsp文件:<%@ page language="ja原创 2016-07-10 19:48:14 · 34451 阅读 · 7 评论 -
Java NIO系列教程(六) Selector
原文链接 作者:Jakob Jenkov 译者:浪迹v 校对:丁一Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。下面是本文所涉及到的主题列表:为什么使用Selector?Selector的创建向Selector注册通道Select转载 2016-08-18 16:00:36 · 252 阅读 · 0 评论 -
Java NIO系列教程(七) FileChannel
原文链接 作者:Jakob Jenkov 译者:周泰 校对:丁一Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。打开FileChannel在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileC转载 2016-08-18 16:01:37 · 238 阅读 · 0 评论 -
Apache POI 操作Excel
原文地址:http://www.journaldev.com/2562/java-readwrite-excel-file-using-apache-poi-api.有时候我们需要从Excel文件中读取数据,或者我们为了商务或者财政的目的生成Excel格式的报表.Java没有对操作Excel文件提供内在的支持,所以我们需要寻找开源的APIs.当我开始寻找操作Excel的APIs时候,大部分人建议使转载 2016-08-23 17:25:34 · 721 阅读 · 0 评论 -
lombok的使用和原理
项目背景在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法。即它最终能够达到的效果是:在源码中没有getter和setter方法,但是在转载 2016-08-11 15:00:39 · 19316 阅读 · 4 评论 -
Java NIO系列教程(三) Buffer
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。下面是NIO Buffe转载 2016-08-18 15:56:56 · 254 阅读 · 0 评论 -
Java NIO系列教程(十二) Java NIO与IO
原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html作者:Jakob Jenkov 译者:郭蕾 校对:方腾飞当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代转载 2016-08-18 16:05:27 · 261 阅读 · 0 评论 -
Java NIO系列教程(十一) Pipe
原文链接 作者:Jakob Jenkov 译者:黄忠 校对:丁一Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。这里是Pipe原理的图示:创建管道通过Pipe.open()方法打开管道。例如:Pipe pipe =转载 2016-08-18 16:04:32 · 262 阅读 · 0 评论 -
Java NIO系列教程(十) Java NIO DatagramChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。打开 DatagramChannel下面是 DatagramChannel 的打开方式:DatagramChan转载 2016-08-18 16:03:44 · 297 阅读 · 0 评论 -
Java NIO系列教程(九) ServerSocketChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。这里有个例子:01转载 2016-08-18 16:02:54 · 228 阅读 · 0 评论 -
Java NIO系列教程(八) SocketChannel
原文链接 作者:Jakob Jenkov 译者:郑玉婷 校对:丁一Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:打开一个SocketChannel并连接到互联网上的某台服务器。一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。转载 2016-08-18 16:02:17 · 339 阅读 · 0 评论 -
Maven学习笔记(4) --- 聚合和继承
最近重新读了一下《Maven实战》,记录一下一直被我忽略的聚合和继承的关系。聚合首先,一个模块有一个pom(Project object Model)文件。当一个项目比较大的时候,按一定规则划分成不同的模块是一个比较好的方式。这时候管理一个项目,如果每个模块座位一个项目,那么打包编译的时候需要到每一个模块下去执行mvn命令,太麻烦了。于是,有个继承模块。继承模块是一个空模块,只有pom文件,...原创 2018-11-27 11:42:01 · 281 阅读 · 0 评论