摘要:
对于一颗给定的二叉树,对任意两个节点,求它们的最低的公共祖先。 下面就是这样一道题,给定一棵树的前序和中序遍历(我们知道这颗树就是确定的了),对于任两个节点,求它们的最低公共主祖先。 PAT题目: "1151 LCA in a Binary Tree (30 分)" 方法2: 该方法对于这题会有一个 阅读全文
摘要:
ThreadLocal的基本含义 ThreadLocal代表线程局部变量,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程副本冲突。 它可以看做是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说 阅读全文
摘要:
快速排序 快速排序是一种基于分治的算法,其基本思想是将一个大数组按照一个【基准数】分为左右两份,左边的部分都不大于基准数,右边的部分都不小于基准数。然后,对这两份在分别应用快速排序,直到剩下一个元素为止。快速排序的平均时间复杂度为nlog(n)。 下面是选取数组最左边的元素为基准元素的快排算法: C 阅读全文
摘要:
完全二叉树适合用数组存储,而且从第二个位置及a[1]开始存储,这样对于一个节点 ,它的左子树和右子树就分别为 和`i 2+1`。 对于一个完全二叉树存储的树结构,可以用如下方法来它是不是一个堆。 方法1: 调用时直接直接将树根1传入就行了。 上面是考试时想到的方法,有点麻烦,下面是别人更简洁的方法。 阅读全文
摘要:
有这么一类问题:枚举从N个整数中选择K个来满足某种条件。我们可以在使用深度优先时,对每一个元素都可以有选与不选两种方案(有的问题还可以多次选)。 学到这招后,我会解了许多题,下面两个题我一开始就是用这种方法解得。但可惜都不是最优解。 这种方法因为每个元素都有两个选择,时间复杂度很高,下面举例进行说明 阅读全文
摘要:
DFS遍历图时的小技巧 我们通常使用DFS遍历图时,用vis[i]=true;来标记访问过的节点,但是如果要让我们统计图中所有边的长度的话,如果我们还这样做的话,对于非环形图来说,没问题,但是对于环形图来说,就可能访问不到最后一条边,如A B C A,A标记之后就不能统计到C A了。 这时我们的办法 阅读全文
摘要:
最长连续子序列和 最长不下降子序列 最长回文串 若[i,j]之间的字符串回文,则dp[i][j]=1,否则dp[i][j]=0; 先令 [i,j] 的长度L为1,即i=j,然后逐渐增大,当L大于3,如果dp[i 1][j 1]=1&&s[i]==s[j],则dp[i][j]=1; 相关问题: "10 阅读全文
摘要:
Lock接口 Lock是并发包中的基础接口。 Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的。比如常见的ReentrantLock。 队列同步器 AbstractQueuedSynchronizer(简称AQS),是用来构建锁或者其它同步组件的基础框架。它使用了一个int成 阅读全文
摘要:
Java内存模型 Java虚拟机规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 Java 阅读全文
摘要:
合理使用线程池能够带来3个好处: 1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行 阅读全文
摘要:
一、等待多线程完成的CountDownLatch 需求场景:当我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,等到sheet都解析完之后,程序需要提示解析完成。 当然我们可以使用join方法,join用于让当前线程等待join线程执行结束 阅读全文
摘要:
JSP 3个编译指令 1、page:该指令是针对当前页面的指令。 2、include:用于指定包含另一个页面。 3、taglib:用于定义和访问自定义标签。 7个动作指令 1、jsp:forward: 2、jsp:param: 3、jsp:include: 4、jsp:plugin: 5、jsp:u 阅读全文
摘要:
1. 批量修改文本 Ctrl+W可选中光标所在的单词,然后Alt+J可以进行多次选择。 2. 使用Alt+V快捷键,选择Enter Presentation Mode进入演出模式 3. Alt+V选择去掉Navigation Bar,需要时可使用Alt+home。 4. Alt+1鼠标定位到proj 阅读全文
摘要:
向ArrayList中插入一个元素的过程。 首先检查index是不是超限,然后确保容量,然后复制将元素后移,然后插入。 Error和Exception的区别 首先,他们都是继承自Throwable类。 Error是系统中的错误,程序员是不能改变和处理的,只能通过修改程序才能修正。一般是指与虚拟机相关 阅读全文
摘要:
这两天使用IDEA开发web项目遇到了一些问题,习惯了在Eclipse直接new一个Dynamic web project,在IDAE下有些摸不清。 记得在Github上有一个仓库专门写了一个IDEA教程,获得了很多星,在Github上搜了以下,果然找到。看了将Eclipse下的web项目导入IDE 阅读全文
摘要:
在学习Spring事务时,我参考的书的源码不是maven项目,整本书依赖的100多个jar包都在一个文件夹里,我本来对spring每个模块的学习源码都放在一个Github仓库里,每一个项目都是maven项目,这样想要将项目转化为maven项目,就要做很大的工作量来写项目的依赖。不过经过查找,在网上找 阅读全文
摘要:
这个资源汇总来自github上一位朋友,内容是由许多朋友贡献的,可以看到已经有将近15k个星了。因为知识点太多,目录又在页首,我读着不太方便,所以我就把它放在这里了,可以从 目录导航 里找自己感兴趣的内容。 "仓库地址" ) 《后端架构师技术图谱》 " " " " " " " " 数据结构 队列 " 阅读全文
摘要:
垃圾回收 当程序创建对象、数组等引用类型实体时,系统就会在对内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。 垃圾回收机制具有如下特点: 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源。 程序无法精确控 阅读全文
摘要:
File类 File是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成。不管是文件还是目录都是使用File来操作的,File能新建、删除、重命名文件和目录,File不能访问文件本身。如果需要访问文件本身,需要使用输入输出流。 文件过滤 阅读全文
摘要:
对象序列化的目标是将对象保存到磁盘中,或允许网络中直接传输对象。对象序列化机制允许把内存中的对象转换成平台无关的二进制流,从而允许这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点,其它程序一旦获得这种二进制流,都可以将这种二进制流恢复为原来的Java对象。 对象的序列化指将 阅读全文
摘要:
volatile关键字 在java2以前,Java的内存模型总是从主存(共享内存)读取变量,而在当前的Java内存模型下,每个线程把变量保存到本地内存中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另一个线程还在继续使用它在本地内存中的值。这个问题就是变量在多线程中 阅读全文
摘要:
从JDK5开始,Java增加了对元数据的支持,也就是注解(Annotation),注解就是在代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过注解,程序开发人员可以在不改变原有逻辑的情况下,在源代码中嵌入一些补充信息。 5个基本注解 @Override @Depric 阅读全文
摘要:
JDK动态代理 JDK动态代理主要用到 类和 接口,通过使用他们就可以生成JDK动态代理类和动态代理对象。 Proxy提供如下两个方法创建动态代理类和动态代理实例。 :创建一个动态代理类对应的Clas对象,该代理类将实现了interfaces接口。第一个Classloader参数指生成被代理类或接口 阅读全文
摘要:
在多线程编程中synchronized一直是元老级的角色,很多人称呼它为重量级锁。Java6之后为了减少获得锁和释放锁带来的性能消耗引入了偏向锁和轻量级锁,对synchronized进行了各种优化,它变得不那么重了。 synchronized实现同步的基础是:Java中的每一个对象都可以作为锁。 具 阅读全文
摘要:
类加载、连接和初始化 当程序主动使用某个类时,如果给类还未被加载到内存中,则系统会通过加载、连接、初始化三个步骤对该类进行初始化。 类加载 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。类加载由类加载器完成,类加载器由JVM提供。通过不同的类加载器,可以 阅读全文
摘要:
创建线程 继承Thread类创建线程 步骤: 1. 继承Thread类,重写run()方法,run()方法体为线程执行体。 2. 创建Thread类的实例,即创建了线程对象。 3. 调用线程对象的start()方法启动线程。 运行结果如下: 实现Runnable、Callable接口创建线程的优缺点 阅读全文
摘要:
所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定。 集合中的泛型 泛型最常见在使用集合时,如: 可以简写为: 泛型集合与泛型数组的不同 如果B是A的子类,对于数组而言, 是`A[] G`不是 的子类型,下面第二行就会编译出错。 下面我们来 阅读全文
摘要:
Java集合主要有两个接口派生而出:Collection和Map,他们都是集合框架的子接口,下面两天分别是Collection和Map的继承树。 集合的两大父接口 Collection Collection集合体系下又主要包含Queue、List、Set三个接口。 可以看到Iterable是Coll 阅读全文