Java相关
文章平均质量分 88
爆米花9958
这个作者很懒,什么都没留下…
展开
-
日期格式化类
DateFormat格式化日期getDateInstance:返回一个日期格式器,它格式化的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale等参数。如果不指定这些参数,则使用默认参数。 getTimeInstance:返回一个时间格式器,它格式化的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale等参数。如果不指定这些参数,则使用...原创 2019-11-24 23:58:19 · 402 阅读 · 0 评论 -
Java 日期相关类
Java 日期时间java.util包提供了Date类来封装当前的日期和时间。 Date对象创建以后,可以调用下面的方法。 序号 方法和描述 1 boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。 2 ...原创 2019-11-24 23:35:19 · 246 阅读 · 0 评论 -
Integer学习
曾经遇见过一道关于Integer的面试题:Integer a = 180, b = 180;Integer c=1,d=1;System.out.println(a==b);System.out.println(c==d);输出为:falsetrue一开始也不明白,后来看了下Integer的源码,才知道Integer默认将-128~127之间的整数存储到了一个数组...原创 2019-10-30 11:48:33 · 177 阅读 · 0 评论 -
6.Spring之DI高级
前面已经说了DI的相关知识,本节再做一些补充延迟初始化Bean延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值为“true”即可延迟初始化Bean。Spring容器会在创建容器时提前初始化作用域为“singleton”的Bean(默认方式),“singl...原创 2019-06-25 15:28:11 · 158 阅读 · 0 评论 -
BIO编程学习
BIO网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求, 通过三 次握手建立连接, 如果连接建立成功, 双方就可以通过网络套接字 ( Socket) 进行通信。在基于传统同步阻塞模型开发中, ServerSocket负责绑定 IP 地址, 启动监听端口;Soc...原创 2019-01-02 22:13:09 · 284 阅读 · 0 评论 -
java IO初识与Linux网络I/O模型简介
Java的 I/O发展简史从 JDK1.0到 JDK1.3, Java的 I/O类库都非常原始,很多 UNIX网络编程中的概念或接口在l/O类库中都没有体现,例如 Pipe、 Channel、 Buffler和 Selector等。在 JDKl.4推出 Java NlO之前, 基于 Java的所有 socket通信都采用了同步阻塞模式( BIO) , 这种一请求一应答的通信模型简化了上层的应用...原创 2018-12-31 22:36:21 · 1662 阅读 · 0 评论 -
Java容器类详解
Java的容器在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。Java容器的基本概念Java容器类库是用来保存对象的,他有两种不同的概念:Collection,独立元素的序列,这些元素都服从一条或多条规则。Lis...原创 2018-04-18 21:26:36 · 17507 阅读 · 0 评论 -
HashMap源码解析
HashMap简介HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键,但最多只允许一条记录的键为null。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包...原创 2018-09-14 22:11:35 · 5492 阅读 · 0 评论 -
Map类初识
我们在前面的文章中已经简短的介绍了下Map,作为开始,我们再更深的了解一下,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确...原创 2018-09-14 20:29:08 · 6496 阅读 · 0 评论 -
Java类加载的过程
JVM和类当我们调用 Java 命令运行某个 Java 程序时,该命令将会启动一条 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程里。同一个 JVM 的所有线程、所有变量都处于同一个进程里,它们都使用该 JVM 进程的内存区。当系统出现以下几种情况时, JVM 进程将被终止:程序运行到最后正常接收; 程序运行到使用Sys...原创 2018-09-14 19:09:22 · 51587 阅读 · 10 评论 -
Java类加载器
在Java虚拟机中,负责査找并加载类的那部分被称为类加载器子系统。从Java虚拟机的角度来讲,只存在两种不同的类加载器: 一种是启动类加载器(Eootstrap ClassLoader), 这个类加载器使用 C++语言实现,是虚拟机自身的一部分;另外一种就是所有其他的类加载器, 这些类加载器都由Java语言实现, 独立于虚拟机外部, 并且全都继承自抽象装 java.lang.ClassLoader...原创 2018-09-14 19:10:56 · 6991 阅读 · 0 评论 -
运行时数据区——程序计数器
概念 程序计数器是一块较小的内存空间,他可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式...翻译 2018-09-14 18:34:26 · 256 阅读 · 0 评论 -
Future和Callable
CallableCallable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常FutureFuture接口代表了线程池的异步计算结果。接口中的方法用来检查计算是否完成、等待完成和得到计算的结果。当计算完成后,只能通过get()方法得到结果,get方法会阻塞直到结果准备好了。如果想取消,那么调用cancel()方法。其他方法用于确定任务是正常完成还是取...原创 2018-09-06 11:10:28 · 3157 阅读 · 0 评论 -
深入理解ThreadPoolExecutor
在上节介绍ThreadPoolExecutor时,大部分参数中都很简单, 只有 workQueue和 handler需要进行详细说明。队列参数 workQueue指被提交但未执行的任务队列, 它是一个 BlockingQueue接口的对象,仅用于存放 Runnable对象。 根据队列功能分类, 在ThreadPoolExecutor的构造函数中可使用以下几种 BlockingQueue。...原创 2018-09-06 11:02:21 · 1865 阅读 · 0 评论 -
从源码理解线程池
Executor接口源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { void execute(Runnable command);}执行已提交的 Runnable 任务对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用 Exe...原创 2018-09-06 10:15:24 · 3556 阅读 · 0 评论 -
Java内存模型——基础
JMM因何产生由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲——将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中没这样处理器就无需等待缓慢的内存读写了。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是引入...原创 2018-08-26 20:42:57 · 855 阅读 · 0 评论 -
sofa rpc入门
SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点远程服务调用方案。为了用户和开发者方便的进行功能扩展,SOFARPC 提供了丰富的模型抽象和可扩展接口,包括过滤器、路由、负载均衡等等。同时围绕 SOFARPC 框架及其周边组件提供丰富的微服务治理方案。功能特性透明化、高性能的...原创 2019-01-28 13:23:39 · 2707 阅读 · 3 评论 -
选择你的消息协议 AMQP, MQTT,STOMP
原文:https://blogs.vmware.com/vfabric/2013/02/choosing-your-messaging-protocol-amqp-mqtt-or-stomp.html当我讨论软件架构主题时,我被问的最常多的一个问题就是是当前存在的各种应用程序消息传递协议之间的区别 - 诸如协议如何和为什么出现,以及在特定应用程序中应该使用哪一个的问题。他们的问题是...翻译 2019-01-28 15:46:34 · 7078 阅读 · 1 评论 -
AIO编程
AIO是异步IO的缩写,虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好时得到通知,接着就由这个线程自行进行IO操作,IO操作本身还是同步的。NIO 2.0引入了新的异步通道的概念, 并提供了异步文件通道和异步套接字通道的实现。异步通道提供以下两种方式获取获取操作结果:通过 java.util.concurrent.F...原创 2019-09-29 16:12:38 · 306 阅读 · 0 评论 -
伪异步IO编程
为了改进一线程一连接模型, 后来又演进出了一种通过线程池或者消息队列实现一个或者多个线程处理N个客户端的模型, 通过线程池的方式可以灵活地调配线程资源, 设置线程的最大值,防止由于海量并发接入导致线程耗尽的问题,但它的底层通信机制依然使用同步阻塞I/O,所以被称为 “ 伪异步''。伪异步I/O模型图伪异步采用线程池和任务队列实现,模型图如下:当有新的客户端接入时,将客户端...原创 2019-09-21 23:17:33 · 201 阅读 · 1 评论 -
BIO编程参考
网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接请求, 通过三 次握手建立连接, 如果连接建立成功, 双方就可以通过网络套接字 ( Socket) 进行通信。在基于传统同步阻塞模型开发中, ServerSocket负责绑定 IP 地址, 启动监听端口;Socket...原创 2019-09-21 22:41:15 · 174 阅读 · 0 评论 -
BIO,NIO,AIO的理解
前面我们已经简单了解了IO的一些概念,接下来我们再详细学习下相关概念在高性能的IO体系设计中,我们首先要清楚如下几个名词概念:同步:执行一个操作之后,进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看IO操作(也就是我们说的非阻塞)是否完成,等待结果,然后才继续执行后续的操作。异步:执行一个操作后,可以去执行其他的操作,然后等待通知再回来执行刚才没执行完的操作。阻塞:进程给C...原创 2019-09-21 22:27:21 · 240 阅读 · 0 评论 -
使用Java配置MyBatis
我们已经讨论了各种 MyBatis 配置元素,如 envronments,typeAlias,和 typeHandlers,以及如何使用XML 配置它们。即使你想使用基于 Java API 的 MyBatis 配置,经历前面的学习是大有好处的,它可以帮你对这些配置元素有更好的理解。配置SqlSessionFactoryMyBatis 的 SqlSessionFactory 接口除了使用...原创 2019-08-31 22:19:42 · 4063 阅读 · 1 评论 -
并发容器概述
同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作。复合类操作如:迭代(反复访问元素,遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时...原创 2019-07-22 14:39:50 · 221 阅读 · 0 评论 -
Mybatis作用域和生命周期
理解作用域和生命周期类非常重要,如果使用不当,会造成各种各样的问题SqlSessionFactoryBuilder这个类可以被初始、使用和丢弃,如果你已经创建好了一个 SqlSessionFactory 后就不用再保留它。因此,SqlSessionFactoryBuilder 的最好作用域是方法体内,比如说定义一个方法变量。你可以重复使用SqlSessionFactoryBuilder 生...翻译 2019-07-17 14:16:35 · 367 阅读 · 0 评论 -
10.Spring集成JDBC
相信大家都很熟悉jdbc的开发过程了,jdbc的开发繁琐,易错,虽然我们可以重构自己的一套JDBC模板,从而能简化日常开发,但自己开发的JDBC模板不够通用,而且对于每一套JDBC模板实现都差不多,从而导致开发人员必须掌握每一套模板。Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发,而且如果各个公司都使用该抽象框架,开发人员首先减少了学习成本,直接上手开发。Spr...翻译 2019-07-06 16:46:14 · 267 阅读 · 1 评论 -
9.Spring之Resource(2)
ResourceLoader接口ResourceLoader接口用于返回Resource对象;其实现可以看作是一个生产Resource的工厂类。public interface ResourceLoader { Resource getResource(String location); ClassLoader getClassLoader();}getResour...翻译 2019-06-26 16:52:26 · 446 阅读 · 0 评论 -
8.Spring之Resource(1)
概述在日常程序开发中,处理外部资源是很繁琐的事情,我们可能需要处理URL资源、File资源资源、ClassPath相关资源、服务器相关资源(JBoss AS 5.x上的VFS资源)等等很多资源。因此处理这些资源需要使用不同的接口,这就增加了我们系统的复杂性;而且处理这些资源步骤都是类似的(打开资源、读取资源、关闭资源),因此如果能抽象出一个统一的接口来对这些底层资源进行统一访问,是不是很方便,...翻译 2019-06-26 13:53:19 · 1105 阅读 · 0 评论 -
7.Spring之基于Schema的AOP
概述AOP, 即面向方面编程(Aspect Oriented Programming),是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP),其存在目的是为了解耦,在进行OOP开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP最大问题就是无法解耦组件进行开发,而AOP就是为了克服这个问题而出现的,AOP可以让一组类共享相同的行为。在OOP中只能通过继承...翻译 2019-06-26 13:21:21 · 204 阅读 · 0 评论 -
浅谈Java 多线程同步
最近在研究多线程同步的一些问题,整理了网上很多文档,在这里给大家分享下Java并发机制的底层实现原理Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数...原创 2019-02-24 20:35:34 · 3251 阅读 · 0 评论 -
运行时数据区——Java虚拟机栈
与程序计数器一样, Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。Java栈以帧为单位保存线程的运行状态。每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、 方法出口等信息。虚拟机只会直接对Java栈执行两种操作: 以帧为单位的压栈或出栈。 Java方法可以以两种方式完成。一种通过return...原创 2018-08-26 20:26:38 · 293 阅读 · 0 评论 -
运行时数据区——Java堆
Java程序在运行时创建的所有类实例或数组都放在同一个堆中。一个Java虚拟机实例中只存在一个堆空间, 因此所有线程都将共享这个堆,它在虚拟机启动时创建。 又由于一个Java程序独占一个Java虚拟机实例, 因而每个Java程序都有它自己的堆空间——它们不会彼此干预 。但是同一个Java程序的多个线程却共享着同一个堆空间,在这种情况下,就得考虑多线程访问对象(堆数据)的同步问题了。堆在JVM启...原创 2018-08-26 20:21:31 · 382 阅读 · 0 评论 -
ArrayList源码解析
ArrayList是基于List 接口,大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。下面我们来分析ArrayList的源代码,ArrayList继承体系结构如下:public class ArrayList<E> extends AbstractList<E...原创 2018-08-02 18:48:23 · 4355 阅读 · 0 评论 -
在java中使用log4j
简单使用log4j要在java项目中使用log4j,需要下载log4j-x.x.x.jar。如果是使用的mvn或gradle构建项目,则添加依赖就可以了,我的pom.xml如下: log4j log4j 1.2.17 配置log4j.propertieslog=D:/log4jlog4j.rootCatego原创 2017-10-18 15:33:57 · 5314 阅读 · 2 评论 -
Java线程池Executors的使用
简单的创建多线程方式,创建一个线程(和后续的销毁)开销是非常昂贵的,因为JVM和操作系统都需要分配资源。而且创建的线程数也是不可控的,这将可能导致系统资源被迅速耗尽。为了能更好的控制多线程,JDK提供了一套Executor框架,其本质就是一个线程池,它的核心成员如下:Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Run...原创 2017-11-15 18:18:58 · 13108 阅读 · 3 评论 -
利用java实现发送邮件
电子邮件的应用非常广泛,常见的如在某网站注册了一个账户,自动发送一封激活邮件,通过邮件找回密码,自动批量发送活动信息等。很显然这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。电子邮件协议电子邮件在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMA...原创 2017-11-14 15:01:31 · 95739 阅读 · 30 评论 -
Java获得指定时区时间
在Java语言中,您可以通过java.util.Calendar类取得一个本地时间或者指定时区的时间实例,如下:// 取得本地时间:Calendar cal = Calendar.getInstance();//取得指定时区的时间: TimeZone zone = TimeZone.getTimeZone(“GMT-8:00″);Calendar cal = Calendar原创 2017-10-12 18:19:29 · 31579 阅读 · 0 评论 -
Log4j 的配置
上一章介绍log4j的核心组件。本章介绍如何使用配置文件来配置这些核心组件。配置log4j涉及分配级别,定义追加程序,并在配置文件中指定布局的对象。Appenders:Apache的log4j提供Appender对象主要负责打印日志消息到不同的目的地,如控制台,文件,sockets,NT事件日志等等。每个Appender对象具有与之相关联的不同的属性,并且这些属性表明对象的行为,常用属性如原创 2017-10-18 14:53:27 · 412 阅读 · 0 评论 -
JAVA中使用FTPClient上传下载
在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件,我创建的是mvn项目,所以在pom.xml文件中添加依赖: commons-net commons-net 3.6 oro oro 2.0原创 2017-10-09 15:36:03 · 1424 阅读 · 0 评论 -
Log4j初学
Log4j入门简介Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应原创 2017-10-18 11:25:16 · 254 阅读 · 0 评论