- 博客(90)
- 收藏
- 关注
转载 二叉树的深度优先遍历和广度优先遍历
深度优先遍历,也就深入的遍历,沿着每一个分支直到走到最后,然后才返回来遍历剩余的节点。二叉树不同于图,图需要标记节点是否已经访问过,因为可能会存在环,而二叉树不会出现环,所以不需要标记。那么,我们只需要一个栈空间,来压栈就好了。因为深度优先遍历,遍历了根节点后,就开始遍历左子树,所以右子树肯定最后遍历。我们利用栈的性质,先将右子树压栈,然后在对左子树压栈。此时,左子树节点是在top上的,所
2017-09-13 10:06:11 393
转载 动态规划-最长公共子序列
最长公共子序列和最长公共子串区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序一致,并不要求连续。例如X = {a, Q, 1, 1}; Y = {a, 1, 1, d, f}那么,{a, 1, 1}是X和Y的最长
2017-08-15 22:16:20 502
转载 Git代码合并Merge还是Rebase
git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之。但如果使用得当的话,它能给你的团队开发省去太多烦恼。在这篇文章中,我们会比较 git rebase 和类似的 git merge 命令,找到Git工作流中rebase的所有用法。概述你要知道的第一件事是, git rebase 和 git merge 做的事其实是一样的。它们都被设计来将一个分支
2017-07-30 16:58:47 1366
转载 Spring——全局异常处理
@Restcontroller登场spring从4.0开始引入了@Restcontroller,这是对REST的支持,他可以帮我们去掉@ResponseBody这个 所以原本这样的代码,@Controllerpublic class SpitteController{ @RequestMapping(value="/{id}", method=RequestMethod.
2017-07-09 17:42:24 409
转载 EL表达式 (详解)
EL表达式 1、EL简介1)语法结构 ${expression}2)[]与.运算符 EL 提供.和[]两种运算符来存取数据。 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如: ${user.My-Name}应当改为${user["My-
2017-07-02 12:17:19 932
转载 Servlet线程安全解析
摘 要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模型说明引起Servlet线程不安全的原因,给出了保证Servlet线程安全的三种解决方案,并说明三种方案在实际开发中的取舍。 Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所 以,在编写代码时需要非常细致地考
2017-05-30 11:27:54 510
原创 理解排序算法中的稳定性
排序算法中的稳定它只表示两个值相同的元素在排序前后是否有位置变化。如果前后位置变化,则排序算法是不稳定的,否则是稳定的。稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功。比如快排中,待排序数组为5,7,7,1,1。那么若以数组中第一元素做为换分依据,第一次划结果为1,1,5,7,7。但是(从左往右)第一个7和第二个1交换,第二个7和第一个1交换,所以交换后1和1
2017-05-28 16:47:51 837
原创 堆排序 思考
将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在整个排序过程中,元素3的数组下标发生过____次改变。按整数数组的最大堆定义,每次调整完后根结点的元素与最后个元素交换,继续下次调整,直到所有的结点调整完毕。 原数组为 7 6 3 5 4 1 2 满足最大堆定义,直接交换根节点元素 2 6 3 5 4 1 7,交换完毕
2017-05-25 10:39:20 1380
转载 Java并发之AQS
AQS(AbstractQueuedSynchronized)就是ReentrantLock ,semaphore,countDownLatch的底层实现。在ReentrantLock 源码中,有个个内部类,同步器(sync) 集成AQS abstract static class Sync extends AbstractQueuedSynchronizer 。AQS中实现了维护一个它
2017-05-23 17:31:19 355
原创 JAVA中的Fork/Join框架
什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务。 fork/join框架与其它ExecutorService的实现类相似,会给线程池中的线程分发任务,不同之处在于它使用了工作窃取算法,所谓工作窃取,
2017-05-17 17:51:38 299
转载 LinkHashMap实现LRU
LinkedHashMap有一个removeEldestEntry(Map.Entry eldest)方法,通过覆盖这个方法,加入一定的条件,满足条件返回true。当put进新的值方法返回true时,便移除该map中最老的键和值。 package scorpio.jh.maptest;import Java.util.LinkedHashMap;import jav
2017-05-17 10:29:52 508
原创 java 锁优化
Java对象的内存布局分为:对象头、实例数据和对其填充。对象头又可以分为”Mark Word”和类型指针klass。”Mark Word”是关键,默认情况下,其存储对象的HashCode、分代年龄和锁标记位。首先简单说下先偏向锁、轻量级锁、重量级锁三者各自的应用场景:偏向锁:只有一个线程进入临界区;轻量级锁:多个线程交替进入临界区;重量级锁:多个线程同时进入临界区。
2017-05-16 21:37:37 327
转载 深入浅出UML类图
. 类类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。在系统中,每个类都具有一定的职责,职责指的是类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责。在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。类的属性即类的数据职责,类的操作即类的行为职责。设计类是面向对象设计中最重要的组成
2017-05-14 14:46:31 651
转载 缓存调度算法计算缺页
:在一个采用页式虚拟存储管理的系统中,有一用户作业,它依次要访问的页面序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配给该作业的页数为3且作业初始时未装载页面,那么采用FIFO调度算法产生的缺页中断数为多少,采用LRU调度算法产生的缺页中断数为多少? FIFO算法:(First In First Out),先进先出,一般看到这类思想,首先想到的数据结构应当是队列,但是我们这里最好
2017-05-12 22:56:15 899
转载 java 线程池
本篇主要涉及到的是java.util.concurrent包中的ExecutorService。ExecutorService就是Java中对线程池的实现。一、ExecutorService介绍ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对E
2017-05-10 17:33:47 303
转载 java读写锁设计缓存系统
package test; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrit
2017-05-09 22:17:02 438
转载 ConcurrentHashMap补充
并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volati
2017-05-08 20:33:26 207
转载 JAVA NIO解析
现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty。学习和掌握NIO技术已经不是一个JAVA攻城狮的加分技能,而是一个必备技能。再者,现在互联网的面试中上点level的都会涉及一下NIO或者AIO的问题(AIO下次再讲述,本篇主要讲述NIO),掌握好NIO也能帮助你获得一份较好的offer。 驱使博主写这篇文章的关键是网上关于NIO的文章
2017-05-08 10:54:56 698
转载 Mysql批量插入
如何高效向数据库插入10万条记录,总结出三种方法:测试数据库为MySQL!!!方法一: [java] view plain copy 批量插入" alt="在CODE上查看代码片" src="https://code.csdn.net/assets/CODE_ico.png" style="list-style:none; margin:0px; p
2017-05-08 10:49:09 508
原创 哈夫曼树的构造
例:5 9 2 4第一步:排序 2 4 5 9第二步:挑出2个最小的 2 4 为叶子构造出 62 4第三步:判断 6 不大于 5或9(剩余叶子中最小的2个)=》 同方向生长,得出: 11 6 52 4第四步:继续生长 20 11 9 6 5
2017-05-02 23:29:38 1264
转载 哈希表——线性探测法、链地址法、查找成功、查找不成功的平均长度
四、哈希表的装填因子装填因子 = (哈希表中的记录数) / (哈希表的长度)装填因子是哈希表装满程度的标记因子。值越大,填入表中的数据元素越多,产生冲突的可能性越大。五、不同处理冲突的平均查找长度 例:假设散列表的长度是13,三列函数为H(K) = k % 13,给定的关键字序列为{32, 14, 23, 01, 42, 20, 45, 27, 55, 24,
2017-04-27 23:14:00 23836 6
转载 java--强引用、弱引用、软引用、虚引用
1、强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o=new Object(); // 强引用 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引用,如下:o=nul
2017-04-27 18:08:32 213
转载 session、cookie实现免登录
Cookie的机制Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能。Cookie的Domain和Path属性标识了这个Cookie是哪一个网站发送给浏览器的;Cookie的Expires属性标识了Cookie的有 效时间,当Cookie的有效时间过了之后,这些数据就被自动删除了。如果不设置过期时
2017-04-27 15:04:10 9887
转载 JAVA线程与线程、进程与进程间通信
I.线程与线程间通信一、基本概念以及线程与进程之间的区别联系:关于进程和线程,首先从定义上理解就有所不同1、进程是什么?是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行的一段程序。2、线程又是什么?线程进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本
2017-04-24 14:59:44 217
原创 ReentrantReadWriteLock读写锁的使用
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一
2017-04-23 16:00:26 229
原创 经典递归问题--汉诺塔
描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱。 当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子时,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。 当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B
2017-04-22 22:27:47 334
转载 JUC--CyclicBarrier的用法
CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。用法略有不同,测试代码如下: 1 public class TestCyclicBarrier { 2 3 private static final int THREAD_NUM = 5; 4 5 public static class WorkerT
2017-04-22 21:00:48 214
原创 JUC--CountDownLatch
简介CountDownLatch 允许一个或多个线程等待其他线程完成操作。主要方法: public CountDownLatch(int count); public void countDown(); latch.countDown(); 建议放在 finally里执行 public void await() throws InterruptedExceptio
2017-04-22 19:43:35 181
原创 Java多线程:Semaphore信号量
Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。 Semaphore为并发包中提供用于
2017-04-22 12:45:59 259
转载 Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable、Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.
2017-04-22 10:40:24 170
转载 Java线程面试题 Top 50
50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试。1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提
2017-04-21 19:05:51 286
转载 java synchronized类锁,对象锁详解
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法。因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识。 java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就
2017-04-21 16:21:56 359
转载 字符串的全排列和组合算法
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列用C++写一个函数, 如 Foo(const ch
2017-04-20 15:20:43 339
转载 Java面试中经常遇到的类执行顺序
单类执行顺序:下面是我写的一个demo:package com.bw;/** * @author brickworker * 关于类Color的描述:测试单个类的执行顺序问题 */public classColor { //构造函数 public Color() { System.out.println("构造函数执行");
2017-04-18 20:06:12 1917
转载 LinkedHashMap源码解析
引言关于java中的不常见模块,让我一下子想我也想不出来,所以我希望以后每次遇到的时候我就加一篇。上次有人建议我写全所有常用的Map,所以我研究了一晚上LinkedHashMap,把自己感悟到的解释给大家。在本篇博文中,我会用一个例子展现LinkedHashMap的运行和初始化情况,展示LinkedHashMap的数据存储情况,同时用JDK1.8中它的源代码解释给大家。其实,在以前的博
2017-04-18 17:25:41 266
转载 try语句的finally到底是否执行
class Test { public int aaa() { int x = 1; try { return ++x; } catch (Exception e) { } finally { ++x; } return x;
2017-04-17 17:46:55 939 1
转载 ConcurrentHashMap源码分析
先简单看下ConcurrentHashMap类在jdk1.7中的设计,其基本结构如图所示: 每一个segment都是一个HashEntrypublic class ConcurrentHashMapK, V> extends AbstractMapK, V> implements ConcurrentMapK, V>, Serializable { /
2017-04-16 16:47:49 645
转载 JAVA高并发 无锁(CAS)
Java当中提供了一些有关无锁类的使用,在底部使用比较交换指令来实现。一般来说有锁的方式,会导致线程可能会阻塞、挂起,在进入临界区之前由系统对它进行阻塞和挂起,相对来讲无锁的性能会更好些,除非是人为的挂起线程,否则通过无锁的方式线程是不可能被挂起的只会不断的重试。如果线程被挂起,做一次线程的上下文切换可能需要8万个时钟周期,但是如果做重试的操作(比如循环体),除非重试的操作过多,否
2017-04-15 22:08:34 833
转载 JVM性能调优监控工具
摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。 现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存
2017-04-11 17:47:21 203
转载 linux下java高内存故障排查
搞Java开发的,经常会碰到下面两种异常:1、java.lang.OutOfMemoryError: PermGen space2、java.lang.OutOfMemoryError: Java heap space要详细解释这两种异常,需要简单重提下Java内存模型。(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava
2017-04-08 21:10:42 522
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人