自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 资源 (7)
  • 收藏
  • 关注

原创 三级范式

一、简单的说1NF:字段不可再分。2NF:每个表只表示一个事物3NF:每列都与主键有直接关系二、举例1NF不满足的示例:namehobbyjack football,basketball修改后(这个应该是多对多的关系了)2NF不满足的示例(可以说一张表多个主键,记录多种数据):

2015-08-26 17:41:48 1156

原创 ConcurrentHashMap源码(二)--initTable

在ConcurrentHashMap的put方法中,第一次添加元素的时候table是空的(使用空的构造函数),就会执行initTable方法。下面就来看一下jdk8是怎么初始化这个table的,如何保证并发不出问题。关于unsafe.compareAndSwap的用法,可以参见我以前的博客 AtomicInteger分析--自实现无锁并发。private

2015-08-26 15:44:46 1660

原创 HashMap,Hashtable以及ConcurrentHashMap的比较(源码)

一、概述以前学习的时候应该都知道HashMap以及Hashtable:HashMap是线程不安全的,Hashtable是线程安全的。这里就一源代码的角度看看为什么Hashtable是线程安全的,以及另外一个线程安全的ConcurrentHashMap与Hashtable的比较。小提示:在Ecilpse中可以用ctrl+shitf+T查找类,这样就容易查看源代码了。

2015-08-25 23:36:59 2247 2

转载 Java并发编程:Lock

在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。  也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronize

2015-08-25 20:20:50 530

转载 java_NIO入门教程

在开始之前关于本教程新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的。在本教程中,我们将讨论 NIO 库的几乎所有方面,从高级的概念性

2015-08-25 19:45:26 898

原创 剑指offer面试题28-字符串的排列

题目:/*** 输入一个字符串,打印出该字符串中字符的所有排列。* 例如输入字符串abc,则打印出由字符串abc所能排列出来的所有字符串abc,acb,bca,cab和cba。* */这里用递归比较好:第一个是a,那么剩下的就问bc的排列有多少种第一个是b,剩下的问ac第一个是c,剩下的问ab那么方法就有了:当前这个数分别与他后面的数交换位置,然

2015-08-25 17:59:34 917

原创 剑指offer面试题27-二叉搜索树转双向链表

题目:/*** 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。* 要求不能创建任何新的节点,只能调整树中节点指针的指向。* * */然后基本要实现的功能就是这样子的:怎么实现呢?看着像递归,就拿根节点来看:我要做两件事情:1.拿到左边树的最大的,让root.left=max,max.right=root2.拿到右

2015-08-25 17:53:25 723

原创 剑指offer面试题26-复杂链表的复制

题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每一个节点除了一个m_pNext指针指向下一个节点外,还有一个m_pSibling指向链表中的任意节点或者NULL,节点的定义如下:package com.aii.algorithm;public class Node { int

2015-08-24 23:03:59 943

原创 剑指offer面试题25-二叉树中和为某一值的路径

题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。其实就是树的遍历。在遍历的同时记录下来轨迹。打印的时候需要查看轨迹:从头到尾往下走的时候需要往轨迹的末尾加:往上反的时候需要往轨迹的末尾减:所以这里使用LinkedList把。。树的定义如下:pack

2015-08-24 22:27:24 773

原创 剑指offer面试题24-二叉搜索树的后序遍历序列

题目:/* * 输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。 * 如果是则返回true,否则返回false。 * 假设输入的数组的任意两个数组都互不相同 * */既然是后序遍历,那么根元素肯定是在最后一个。又应该为二叉搜索树,所以左边一半的肯定比根要小,右边一半的比根要大。现在有了根,就可以把剩下的数组根据比根小与比根大的分割线分成两

2015-08-24 17:00:30 801

原创 剑指offer面试题23-从上往下打印二叉树

题目: 从上往下打印出二叉树的每个节点,每一层的节点展昭从左到右的顺序打印。就是树的广度遍历。用队列,把树的子节点放到队列中。public class BinaryTreeNode { Integer value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNod

2015-08-24 16:36:16 923

原创 剑指offer面试题21-包含min函数的栈

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push,pop的时间复杂度都是O(1)public class StackWithMin { private Stack stack = null; private Stack minStack = null; public StackWithMin() { st

2015-08-24 16:31:12 732

原创 剑指offer面试题20-顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。如:1-2-3-45-6-7-89-10-11-1213-14-15-16的矩阵,打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.一个二维数组,打印的第一轮的起点肯定是(0,0),第二轮(如果有的话)起点为(1,1)。那第n轮肯定就是(n

2015-08-24 16:25:58 1016

原创 剑指offer面试题18-树的子结构

题目:输入两颗二叉树A和B,判断B是不是A的子结构。树的结构如下:package com.aii.algorithm;public class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; }}全

2015-08-23 20:15:05 1087

原创 剑指offer面试题17-合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。这个和归并排序差不多,只要记录好指针,不要让链表断掉就行了。以及一些特殊情况的判断。package com.aii.algorithm;/** * 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。 * */public class MergeL

2015-08-23 19:32:59 923

原创 剑指offer面试题16-反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。保证链表不断是关键,用临时变量记录一些值。package com.aii.algorithm;public class ReverseLinkedList { /** * @return 返回倒转以后的链表的头 * */ public Node reverse(Node hea

2015-08-23 19:32:40 837

原创 剑指offer面试题15-链表中倒数第k个节点

题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如一个链表有6个节点,从头结点开始他们的值依次是1、2、3、4、5、6,这个链表的倒数第3个节点的是值为4的节点。比较好的方法就是用2个指针:一前以后,前后相差n-1,当前面的指针到了最后一个,后面的那个指针刚好指向我们要的那个对象。packa

2015-08-22 21:17:33 737

原创 剑指offer面试题14-调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。前后分的这个,,让我想起来快速排序,好吧,就用这个做。考虑到了排序的可扩展性,这里的判断条件设置为接口。package com.aii.algorithm;public class ArrayAdjuster { public void

2015-08-22 19:29:07 857

原创 剑指offer面试题12-打印1到最大的n位数

题目:输入一个数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3最大的三位数即999这道题的主要陷阱就在大数的处理,只要将这个考虑进去,用字符串来表示,就好说了。那差不多代码是这样子的:public void print1(int n) { if (n < 0) { throw new RuntimeException();

2015-08-22 15:51:41 1234

原创 剑指offer面试题13-在O(1)时间删除链表的节点

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。要想在O(1)时间搞定,绝对不能用遍历。这里采用将后面的一个节点复制到当前节点的方法。不过有特殊情况要考虑:1.如果要删除的节点没有下一个节点:则要找到上一个节点,并且将next设置为空,这个时候只能用遍历2.如果当前链表就一个节点由于java中没有指向指针的指针,所以用

2015-08-22 14:52:30 1131

原创 Singleton的三种形式+怎么实现真正的单例

以前用singleton的时候就接触过饿汉懒汉两种最近书上看到一个对于我来说是新的方法,感觉还是很不错的这里将三种方法放一起,比较总结一下一、饿汉式package com.aii.algorithm;public class HungrySingleton { private HungrySingleton() { } private static Hungr

2015-08-19 19:57:06 1112

原创 剑指offer面试题5-从尾到头打印链表/6-重建二叉树

题目5:对于一个单链表,已知他的头结点,要求从尾到头打印里面的内容。思路:手上有头,要从尾到头打印,首先想到的是栈。想到了栈,真要去实现,发现有一个更巧的方法,同样是栈--递归。public static void printLinkedListFromTail(Node node) { if (node != null) { printLinkedLis

2015-08-19 00:18:55 746

原创 二叉树的先序-中序-后序遍历(一)-循环----绝对白痴好记的方法

接着上一篇 二叉树的先序-中序-后序遍历(一)-递归 的讲,这篇该循环遍历了。之前一直没有找到好的方法来循环遍历树,以前我老认为有些递归的能做的东西很难换成循环实现。后来看了一些别人写的代码,然后又问了朋友,才发现。。。哦,原来这样的啊,我可以自己弄个栈来维护一下。想到了可以弄个栈以后,至少在我认为,把递归转成循环已经是可行的了,至于怎么实现,这几天在想(因为太笨,看人家的代码

2015-08-18 23:02:48 6594 2

原创 二叉树的先序-中序-后序遍历(一)-递归

这几天在复习算法,又遇到树的遍历。树的遍历递归比较简单;循环就比较麻烦了,看了别人的写法老是想不通是怎么做到的。今天静下心来想想,得出了自己的一套“白痴”的方案。--本篇先讲简单的---递归遍历。一、预备知识树的遍历方式:1.先序遍历:对于一个节点,1读本身,2读左子,3读右子。2.中序遍历:对于一个节点,1读左子,2读本身,3读右子。3.后序遍历:

2015-08-18 21:00:47 1097

原创 OgnlContext、OgnlValueStack、CompoundRoot的数据结构

在上一篇从struts2的action中看ActionContext的存储结构中已经看到ActionContext.getActionContext.getContextMap()得到的map的大体结构类型。这篇将从源代码层面进行分析。一、回顾在上一篇中看到ActionContext中存放的是OgnlContext这个类,这个类的源代码,在OgnlContext源码分析中已经将

2015-08-05 23:54:49 5282 3

原创 从struts2的action中看ActionContext的存储结构

本篇将建立测试用例,在action中以打断点的形式查看ActionContext中的数据结构。不管多线程的情况,就以当前线程来说一、预先了解在ActionConext中,每一个线程都有一些数据存放在其中,那么是怎么存放的呢?在ActionContext类中有这么几行代码:Map context;public Map getContextMap() { return

2015-08-05 21:05:06 2375 1

原创 OgnlContext源码分析

1,首先明确OgnlContext是大概一个什么样的数据结构:public class OgnlContext extends Object implements Map能够看到他实现了Map接口,那么我们就用map的眼光去看待他。2,分析put方法刚开始就可以看到: if (RESERVED_KEYS.containsKey(key)) 2.1.RESER

2015-08-05 19:46:10 2801 1

原创 SSH整合样例

ssh整合,问题多多困难多多。。各种包的问题、版本问题、配置文件问题。最终弄出一个能够用的了。这里贴4个配置文件,样例工程可以在此处下载web.xml register.jsp contextConfigLocation classpath:applicationContext.xml org.spr

2015-08-02 17:37:31 624

原创 慎用Finalize方法以及Finalize方法的妙用

首先,要知道finalize方法跟c++的析构函数不一样,jvm并不保证会执行。一、慎用finalize方法finalize方法在什么时候被调用:在垃圾回收的时候,某个对象要被回收的时候,会先进行一次标记,并且将该对象的finalize放到一个低优先级的线程中去执行。等到下一次垃圾回收的时候再把这个对象回收。jvm并不保证在垃圾回收之前能够执行他的finalize方法,

2015-07-29 20:14:18 5576

原创 自定义struts(三)--ImitateStruts实现可插拔的拦截器

前面写了简单的,自己理解的struts。最近学习了struts的拦截器,也稍微看了一下struts的源代码,感觉自己的结构和apache的是完全不一样。不仅如此,连最终的action都不是一样的:这个是我写的struts的action执行时的对象class com.aii.struts.action.UpdateAndDeleteAction$$EnhancerByCGLIB$$d

2015-07-25 15:09:42 700

原创 自定义struts(扩展)--将注解从action上移到service中

以前做的一个项目,没用用框架,最近在学习框架,所以练手的时候就把以前的项目用框架写了一次。这里用的是mybatis与struts2框架。没用到spring(因为不会)。在处理事务的时候出现了一些问题:actionpublic class PendingDocAction { private List checkedAccounts = new ArrayList();

2015-07-23 20:13:35 826

原创 AtomicInteger分析--自实现无锁并发

前两天面试被问到“不用锁实现一个多线程并发访问不会造成资源共享问题的方法”当时我就傻眼了,不用锁怎么做。想到android中有一个looper就说了用队列,不过这答案并不是面试官满意的,也对,用队列不也要用到锁吗?这几天看了编程思想上的共享资源那节,以及好多博客上对volatile与Atomic*类的描述,算是懂了一些了,感觉收获很大。关于原子性,可视性,有序性这里就不说了

2015-07-23 11:26:07 2741

转载 Java并发编程:volatile关键字解析

一个原子操作(atomic operation)是个不能分割的整体,没有其它线程(thread)能够中断或检查正在原子操作中的变量。一个原子(atomic)类型就是一个原子操作可用的类型,它可以在基本上没有锁(lock)的情况下做到线程安全(thread-safe)。java.util.concurrent.atomic包就是提供原子操作的类的小工具包,支持在单个变量上解除锁定的线程安全编程。

2015-07-22 23:52:23 1120

原创 自定义struts(二)--FakeStruts实现@Transaction 注解事务控制

接着前两篇的:现在结合之前写的简单struts以及transactionManager,完成一个能够通过@Transaction完成事务控制的功能。我的想法是这样的:随便写个action类,里面的方法只要加上了@Transaction注解,在里面调用dao的方法,执行的就是事务的处理。如果没加,那就正常处理。实现原理:1.将action中的方法进行代理,查看注解

2015-07-22 18:55:37 2941

原创 LocalThread分析

LocalThread源码分析:一、首先看看LocalThread是干嘛的外面能够看到的方法就以下四个:get()  protected  T initialValue() 。 void remove()  void set(T value)  可以猜测这是一个管理集合的类。二、再看看里面的一些方法1.构造方法:空的,那就不管2.getpubli

2015-07-22 11:19:20 6197 1

原创 自定义struts(一)--咱家自己写的struts--我对struts的理解

学习了几天struts2,拦截器什么的还没接触过,简要谈谈我对struts2的理解:用了struts2,都不用写servlet了,完全被action替代了。web.xml文件干净多了,有用的东西全搬到了struts.xml这个配置文件中。对于我来说,目前为止struts2最大的好处就是1.struts.xml文件比web.xml可读性强多了2.不用再写复杂的代码了,

2015-07-21 21:45:58 564

原创 快速排序-java

1.快速排序采用分治的方法,将一个数组按一定的值划分比比他大的,比他小的两段,然后以这样的方式一直划分,直到每段的数量都小于2,这样就形成了一个有序的数组。2.具体排序时的操作可以想象成是一个“挖坑填数的操作”这里一升序排序为例,给定一个数组,我们的目标是将数组分为两组,一组比x大,一组比x小。1.挖出第一个数,用x记录当前这个数,这样第一个坑就被挖出来了,

2015-07-18 18:31:59 609

原创 堆排序-java

堆的定义:对于所有的节点,均满足其子节点元素小于(大于)改节点元素的值根据根节点元素的大小,可以分为:小顶堆:节点的子元素比该节点元素要大。大顶堆:节点的子元素比该节点元素要小。堆排序的原理(以小顶堆为例):对于满足堆结构的数组,其最小的元素为根元素,即数组的第一个。在操作的时候,先从一个堆结构中取出最小的一个,与堆中最末尾的元素交换位置,将堆的容量减一,然后重构堆。

2015-07-18 18:03:04 620

转载 sql优化

近期因工作需要,希望比较全面的总结下SQL SERVER数据库性能优化相关的注意事项,在网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以前的经验和测试结果进行总结了。我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶

2015-07-15 19:53:28 577

转载 JVM原理和优化

JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.1.创建JVM装载环境和配置2.装载JVM.dll3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4.调用JNIEnv实例装载并处理class类。在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是J

2015-07-10 20:24:13 1013 1

《Spring Boot参考指南》

Spring Boot Reference Guide中文翻译 -《Spring Boot参考指南》

2015-09-26

权限控制Demo

权限控制Demo

2015-08-28

SSH整合样例

SSH整合样例

2015-08-02

ImitateStruts2

实现可插拔的拦截器。 实现ActionServletContext,ActionContext

2015-07-25

StrutsSupport

struts的service实现transaction处理,测试用例

2015-07-23

FakeStruts

简单的struts实现(目前所学的见解) 使用cglib,proxy代理实现transaction注解事务处理。 使用了mybatis持久框架

2015-07-22

Andorid AIDL模拟实现

Andorid AIDL模拟实现

2015-04-18

空空如也

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

TA关注的人

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