自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rhwayfun专栏

在等待的日子里,刻苦读书,谦卑做人,养得深根,日后才能枝叶茂盛!公众号:技术视点

  • 博客(239)
  • 收藏
  • 关注

原创 设计模式系列之一:简单工厂模式

前言设计模式能够帮助我们设计出健壮,低耦合性的代码,从此和高耦合的代码say goodbye!在所有的的设计模式中,简单工厂算是我们平时接触比较多的吧,多线程中的消费者工厂类与生产者工厂类应该算是接触最早的设计模式,简单工厂模式要解决的首要问题就是降低程序之间的耦合度,通过Java中的封装、继承与多态实现解耦。通过使用简单工厂模式,我们设计的代码更易于维护和复用 问题背景在进入正题之前我们先看一下

2016-03-27 21:50:54 1062

原创 深入理解JVM之一:Java内存区域

前言Java虚拟机运行时数据区分为以下几个部分: 方法区、虚拟机栈、本地方法栈、堆、程序计数器。如下图所示: 程序计数器程序计数器可以理解为当前线程执行的字节码的行号指示器,字节码解释器就是通哟改变这个值来获取需要执行的下一条需要执行的字节码指令。对于多线程来说,每条线程都有自己的程序计数器,这样各线程之间的计数器互不影响,这类内存区域也叫作“私有内存”(可以看到其实并不是私有的),之所以这么设

2016-03-27 21:41:00 1533

原创 深入理解JVM之二:垃圾收集器概述

前言我们知道Java的内存区域分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区,而且其中的程序计数器、虚拟机栈和本地方法栈都是线程独立的,也就是说这三块内存区域的生命周期与线程是同生共死的。栈中帧栈在类结构确定的时候就已经知道该分配多少内存了,所以当线程结束的时候,内存也跟着一起回收了,从这个角度看,这三块的内存区域的内存分配和垃圾收集就比较固定了。反观Java堆和方法区,比如我们定义一个接

2016-03-27 21:40:17 1146

原创 深入理解JVM之四:详解垃圾收集器

前言前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基于JDK1.7之后的Hotspot虚拟机(包括前面对Java虚拟机的介绍也是基于jdk1.7版本的)。在Hotspot中,虚拟机的收集器主要有下:可以看到垃圾收集器是按对象的分代来划分的,可以用线条连接

2016-03-27 21:39:24 4319

原创 深入理解JVM之三:垃圾回收算法

前言垃圾收集算法是JVM中垃圾收集器的方法论,所以了解算法是必要的,在算法领域只做最简单的介绍,力求文章的简单易懂。垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。随着jdk版本的升级,垃圾收集器也在不断的升级,现在最新的垃圾收集器已经能够对Java堆中一部分进行回收,也能够对Java堆中另一部分进行回收,这

2016-03-27 21:38:40 1780

原创 深入理解Tomcat系列之七:详解URL请求

前言这里分析一个实际的请求是如何在Tomcat中被处理的,以及最后是怎么样找到要处理的Servlet的?当我们在浏览器中输入http://hostname:port/contextPath/servletPath,前面的hostname与port用于建立tcp连接,由于Http也是基于Tcp协议的,所以这里涉及TCP连接的三次握手。后面的contextPath与servletPath则是与服务器进行

2016-03-27 21:32:16 8467 2

原创 深入理解Tomcat系列之六:Servlet工作原理

前言Servlet是Web开发中的核心技术,作为一名合格的开发人员,就必须清楚Servlet的工作原理。本章没有对Servlet技术本身进行详细的说明,只是针对开发过程中一次Servlet的请求的处理过程进行分析的。Servlet实际上就是一个java类,只不过可以和浏览器进行一些数据的交换。有Servlet类就有管理Servlet的容器,种类有很多,这里主要针对Tomcat对Servlet的工作原

2016-03-27 21:31:23 10788

原创 深入理解Tomcat系列之五:Context容器和Wrapper容器

前言Context容器是一个Web项目的代表,主要管理Servlet实例,在Tomcat中Servlet实例是以Wrapper出现的,现在问题是如何才能通过Context容器找到具体的Servlet呢?在解决这个问题之前,Context容器需要先启动,启动的过程就是加载个类资源文件以及打开子容器以及Pipeline管道的过程。启动Context容器后,就可以处理具体的请求了,具体是通过Request

2016-03-27 21:30:22 6728

原创 深入理解Tomcat系列之四:Engine和Host容器

前言终于到Container容器了,上面说到Connector把封装了Request对象以及Response对象的Socket传递给了Container容器,那么在Contianer容器中又是怎么样的处理流程呢?在说Container容器之前,有必要对Container容器有一个简单的了解,Container容器是子容器的父接口,所有的子容器都必须实现这个接口,在Tomcat中Container容器

2016-03-27 21:29:23 11684 2

原创 深入理解Tomcat系列之三:Connector

前言Connector是Tomcat的连接器,其主要任务是负责处理浏览器发送过来的请求,并创建一个Request和Response的对象用于和浏览器交换数据,然后产生一个线程用于处理请求,Connector会把Request和Response对象传递给该线程,该线程的具体的处理过程是Container容器的事了。执行过程分为以下几个步骤 实例化Connector,构造一个Connector对象调用

2016-03-27 21:28:25 9339 1

原创 深入理解Tomcat系列之二:源码调试环境搭建

前言最近对Tomcat的源码比较感兴趣,于是折腾了一番。要调试源码首先需要搭建环境,由于参考了几篇帖子发现都不怎么靠谱,最后还是折腾出来了,然而却花了足足一天的时间去搭建这个环境。发现都不是帖子的问题,主要是自己在搭建过程中忽略了一些细节,最后构建工程的时候一直失败,我也是醉了。所以本着共享的原则,把一些关键的步骤以及一些需要注意的细节写在博客中以飨读者。 下载Tomcat7源码下载源码有多种方式

2016-03-27 21:26:50 6183 2

原创 深入理解Tomcat系列之一:系统架构

前言Tomcat是Apache基金组织下的开源项目,性质是一个Web服务器。下面这种情况很普遍:在eclipse床架一个web项目并部署到Tomcat中,启动tomcat,在浏览器中输入一个类似http://localhost:8080/webproject/anyname.jsp的url,然后就可以看到我们写好的jsp页面的内容了。一切都是那么自然和顺理成章,然而这一切都是源于tomcat带给我们

2016-03-27 21:24:57 18189 14

原创 阿里2016实习offer五面经验与总结

前言目前楼主已经拿到阿里实习offer,一共经历了5次面试,其中4轮技术面,1轮HR面试。今天收到阿里的实习录用意向书,在这里分享一下自己的面试经验和学习总结。写这篇面经主要是希望能够帮助更多的小伙伴,最近各大公司已经陆陆续续开始春招了,希望这篇面经能够帮到大家。我本科毕业于中南大学信管专业,真正开始学习Java是在大三下学期,研究生就读北航的移动云计算专业。刚开始也是小白,也是一步步成成起来的。希

2016-03-27 14:23:56 41868 109

转载 HTTPS原理

HTTPS是什么HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,及以安全为目标的HTTP通道,简单说就是HTTP的安全版本。HTTPS其实是由两部分组成的:HTTP+TLS/SSL,即HTTP下加入TLS/SSL层,HTTPS的安全基础就是TLS/SSL。服务端和客户端的信息传输都会通过TLS/SSL进行加密,所以传输的数据都

2016-03-27 13:35:17 1424

原创 SpringMVC与Mybatis框架整合遇到的坑

最近在做springmvc与mybatis的项目,遇到一些比较坑的问题。花了许多时间却发现其实解决的办法很简单。这里主要是讲我自己在整合这两个框架的时候遇到的一些问题做一个整理。希望遇到和我同样问题的小伙伴可以不被坑。坑一:nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (

2016-01-27 22:14:42 1794

转载 浅谈多态机制的意义及实现

标题:浅谈多态机制的意义及实现 作者:舒の随想日记在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP。这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事。多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism, almos

2015-12-29 18:57:15 3602

转载 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

原文链接 作者:Alexia(minmin) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J下面首先给出这四种方法的jar包下载地址DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里SAX:http://sourceforge.net/projects/sax/JDOM:http://jdom.org/download

2015-12-29 18:48:06 974

原创 Hibernate框架学习之四:关联映射那些事

前言Hibernate关联关系与客观世界中具体的映射关系很类似,在进行数据库设计的时候常常需要考虑是一对多、多对一等类似的映射关系,这其中涉及数据库设计方面的知识。映射关系可以分为单向与双向两种,具体又包括一对多、多对一、一对一以及多对多四种。所以总共有八种映射关系。这里只介绍了XML配置文件的版本。下面的配置文件的配置方式都以下面的两个持久化类作为模板:public class Person {

2015-12-27 20:51:38 701

原创 Hibernate框架学习之三:深入映射文件的配置

前言这里主要是对XML版的Hibernate框架的开发进行说明,Annotation版会在另外的文章中在说明。由于Hibernate是一个全方位的ORM框架,那么要实现从Object到Record的完全过渡,实现的桥梁就是这里要讲的映射文件了。映射文件的内容繁多,主要是以开发中会使用到的为主进行说明。大体说来,映射文件主要是对class的映射,还包括属性,属性有分为主键、普通属性与集合属性,甚至还有

2015-12-26 14:42:55 864

原创 Hibernate框架学习之二:深入理解持久化对象

前言由于Hibernate框架是一个完全的ORM框架,所以在Hibernate开发中只涉及具体的对象与属性,所以对象在Hibernate中是很重要的方面。而持久化对象则与数据库中的记录息息相关了,可以简单把持久化类理解为普通的JavaBean,也被称为POJO(Plain Old Java Object),在Hibernate3中,持久化类的定义与普通JavaBean的定义基本一致,而不需要额外

2015-12-25 14:17:33 858

转载 Java工程师成神之路

一、基础篇1.1 JVM1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://ifeve.com/jmm-faq/ 1.1.2. 了解JVM各种参数及调优1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole, jinfo, jhat, ja

2015-12-23 22:48:07 1416 3

原创 Struts2框架学习之七:避免表单重复提交

前言防止表单重复提交在web开发中是一个经常遇到的问题,一般来避免重复提交有两种方式:客户端JavaScript代码实现和服务端代码实现。这里主要介绍服务端的实现方式。在服务端实现表单重复提交的基本原理是:通过创建一个Session对象,并产生一个令牌值,将这个令牌值作为隐藏域随表单一起发送给客户端,同时在Session中保存令牌值。在用户提交表单的时候判断提交参数的令牌值与Session中的是否相

2015-12-23 22:35:13 1151

原创 图的广度优先遍历算法

前言广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问。以迷宫为例,深度优先搜索更像是一个人在走迷宫,遇到没有走过就标记,遇到走过就退一步重新走;而广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方向走,,当相遇的时候则是合二为一(好吧,有点扯了)。广度优先遍历算法的遍历过程仍然以

2015-12-23 17:17:45 3774

原创 图的深度优先遍历算法

前言图的遍历与前面文章中的二叉树遍历还是存在很大区别的。所谓图的遍历指的是从图中的某一个顶点出发访问图中的其余顶点,并且需要保证每个顶点只被访问一次。由于图比二叉树复杂得多,所以前面二叉树的遍历算法在图中是行不通的。因为对于任意一个顶点来讲,都可能与其余的顶点发生连接。如果不对访问的顶点做一些处理,出发重复访问的几率是很高的。因此,一个基本思想是设置一个标记数组,主要用于标记已经被访问过的顶点。图的

2015-12-22 23:34:37 8944 1

原创 Struts2框架学习之六:理解并使用拦截器

前言拦截器是Struts2框架的核心功能,理解并使用拦截器有助于更灵活使用Struts2。拦截器与Servlet中的过滤器有些类似却又不尽相同。因为在Struts2中拦截器更像一个可插拔的组件,围绕Action和Result进行,可以在方法调用之前、之后使用。通过Struts2的工作流程(后面还会看到一个请求在Struts2中详细的执行流程)可以发现调用一个Action之前之后有许多的拦截器,这些拦

2015-12-22 18:28:51 2460

原创 剑指offer系列之六十五:机器人的运动范围

题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?这题实际与上一题“矩阵中的路径”思路是相似的,都是

2015-12-21 14:34:38 745

原创 剑指offer系列之六十四:矩阵中的路径

题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩

2015-12-21 14:29:34 663

原创 剑指offer系列之六十三:滑动窗口的最大值

题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1

2015-12-21 14:23:18 2452

原创 剑指offer系列之六十二:数据流中的中位数

题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。根据题目的意思,就是对数据流中的数据进行排序然后得到其中位数。要解决的关键问题是如何在读入数据的时候就对数据进行排序。实际上可以看成是插入排序算法的应用,可以维持一个List集合,保证每次读入数据集合中的数据

2015-12-21 14:14:40 586

原创 剑指offer系列之六十一:二叉树搜索树的第k个节点

题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。因为二叉搜索树是排序的,所以如果需要找出第k个节点只需要进行中序遍历就可以得到第k节点。不过中序遍历的结果就是排序的,所以实质上就是插入排序。可以利用一个集合,在遍历的过程中利用插入排序的算法就能得到第k个节点。下面是这种实现思路的实现代码(已被牛客

2015-12-20 00:12:33 683

原创 剑指offer系列之六十:序列化二叉树

题目描述请实现两个函数,分别用来序列化和反序列化二叉树首先得理解题目的意思,序列化就是返回一个带有#和逗号的字符串。反序列化就是根据带有#和逗号的字符串返回一棵二叉树。比如对于二叉树 1 / \ 2 3 /\ /\4 5 6 7来讲,序列化的结果是1,2,#,#,3,4,#,7,#,#,5,#,#,。而反序列化的结果则是输出一棵二叉树。下面是具体的实现代码(已被牛

2015-12-20 00:04:31 765

原创 剑指offer系列之五十九:链表中环的入口节点

题目描述一个链表中包含环,请找出该链表的环的入口结点。此题的思路其实 很简单,之所以出现环,是因为在整个链表中出现了重复的节点,而遇到的第一个重复的节点就是环的入口节点。所以可以使用Set来保存遍历到的节点,因为Set集合是不允许出现重复元素的,所以当一个节点被第二次添加的时候,往Set中放元素是失败的。所以可以利用这一点找出第一个重复的元素。基于这种思路的代码比较简洁,代码如下(已被牛客AC):i

2015-12-18 15:52:34 573

原创 剑指offer系列之五十八:删除链表中重复的节点

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5因为需要找到重复的节点,所以对链表进行遍历,而且在遍历的过程中需要对每个当前遍历的节点以及后面的节点进行比较直到遇到下一个节点不与当前节点重复。如果下一个节点与当前遍历的节点不重复,则继续遍历,直到把整个链表遍历结束。下面

2015-12-18 15:45:38 493

原创 剑指offer系列之五十七:二叉树的下一个节点

题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则判断该节

2015-12-18 15:35:55 567

原创 剑指offer系列之五十六:对称二叉树的判断

题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。前面有一题是打印输出某二叉树的镜像,回想其实现的思路是:采用层序遍历的思路对每一个遍历的节点,如果其有孩子节点,那么就交换两者。直到遍历的节点没有孩子节点为止,然而此题是对二叉树木镜像的判断,明显是更简单的,只需要进行两个判断:对节点的左孩子与其兄弟节点右孩子的判断以及对节点右孩子与

2015-12-18 15:26:52 669

原创 剑指offer系列之五十五:把二叉树打印成多行

题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。此题实际上与上面一题是重复了,总体还是层序遍历的思路,只不过现在不需要在打印每一行之前对打印顺序进行判断了,所以可以在前面一题的代码进行简单的修改就可以实现题目的要求了。不多说,直接看代码(已被牛客AC):package com.rhwayfun.offer;import java.util.ArrayList;import

2015-12-18 14:57:32 883

原创 剑指offer系列之五十四:按之字形顺序打印二叉树

题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。此题明显是层序遍历的思路。由于需要按照之字形打印每一层,相当于在打印每一行之前需要判断上一行打印的顺序。比如,如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左。实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印。还可直接设

2015-12-18 14:54:13 432

原创 剑指offer系列之五十三:字符流中第一个不重复的字符

题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。这题与前面的第一个不重复的字符有些重复了,所以直接看代码(已被牛客AC):package com.rhway

2015-12-16 15:03:51 457

原创 剑指offer系列之五十二:表示数值的字符串

题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。这题与前面吧字符串转为数值有些类似,但是这里是判断是否一个字符串可以转为数值。从测试用例来看,表示的字符串有三类:整数、浮点数和科学计数法表示的数

2015-12-16 15:01:05 507

原创 剑指offer系列之五十一:正则表达式匹配

题目描述请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配由于只涉及两种正则表达式的匹配,所以关键是需要分清除匹配的所有情况,对于模式串来讲,出现了’.’和

2015-12-16 14:52:15 1741

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除