<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CurryXu的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/CurryXu</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CurryXu]]></copyright><item><title><![CDATA[Java 对象锁与monitor的区别]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/81672643</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/81672643</guid><author>CurryXu</author><pubDate>Tue, 14 Aug 2018 19:03:57 +0800</pubDate><description><![CDATA[转载自https://blog.youkuaiyun.com/kai_wei_zhang/article/details/8196364

在JVM的规范中，有这么一些话：   

  “在JVM中，每个对象和类在逻辑上都是和一个监视器相关联的”   
    “为了实现监视器的排他性监视能力，JVM为每一个对象和类都关联一个锁”   
  “锁住了一个对象，就是获得对象相关联的监视器”   
  从这些话，...]]></description><category></category></item><item><title><![CDATA[Java类加载机制（一）：类加载器及其对应的加载路径]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/81632065</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/81632065</guid><author>CurryXu</author><pubDate>Mon, 13 Aug 2018 19:55:49 +0800</pubDate><description><![CDATA[在讨论这个问题之前，我们先看看Java的两个重要的环境变量：Path与CLASSPATH

Path与CLASSPATH

Windows环境变量中的Path是用来指明Windows的可执行文件的路径。在安装JDK时，我们通常需要在Path的环境变量中添加java的可执行文件路径%JAVA_HOME%\bin，这样我们就可以在命令行中直接使用java、javac等命令，而无需添加这些可执行文件所在...]]></description><category></category></item><item><title><![CDATA[（面试题 45）把数组排成最小的数]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79820191</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79820191</guid><author>CurryXu</author><pubDate>Wed, 04 Apr 2018 17:22:57 +0800</pubDate><description><![CDATA[题目：输入一个正整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。例如输入数组{3，32，321}，则打印出这三个数字能排成的最小数字为321323。思路一：计算得到数组中所有数字的全排列，然后求全排列中最小的数。 计算数组中所有数字的全排列的方法采用回溯法，通过递归实现。该算法的时间复杂度为O(n!)，因为会求数组中所有数字的全排列。代码实现：import java]]></description><category></category></item><item><title><![CDATA[Executor, ExecutorService 和 Executors 间的不同]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79590316</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79590316</guid><author>CurryXu</author><pubDate>Sat, 17 Mar 2018 11:21:55 +0800</pubDate><description><![CDATA[转载自：https://yemengying.com/2017/03/17/difference-between-executor-executorService/java.util.concurrent.Executor, java.util.concurrent.ExecutorService, java.util.concurrent. Executors 这三者均是 Java Executo]]></description><category></category></item><item><title><![CDATA[面试题（三十六）二叉搜索树与双向链表]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79520607</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79520607</guid><author>CurryXu</author><pubDate>Sun, 11 Mar 2018 21:36:54 +0800</pubDate><description><![CDATA[题目：输入一棵二叉搜索树，将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点，只能调整树中结点指针的指向。思路：二叉搜索树的题目可以想到由递归来解决。由于要转换成排序的双链表，因此需要使用二叉树的前序遍历。先转换左子树，然后将根节点与左子树转换成的链表连接起来，再连接上右子树的转换链表即可。代码实现：// 返回排序双链表的头节点
    public TreeNode Convert(]]></description><category></category></item><item><title><![CDATA[面试题（三十五）复杂链表的复制]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79520384</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79520384</guid><author>CurryXu</author><pubDate>Sun, 11 Mar 2018 21:21:38 +0800</pubDate><description><![CDATA[题目： 输入一个复杂链表（每个节点中有节点值，以及两个指针，一个指向下一个节点，另一个特殊指针指向任意一个节点），返回结果为复制后复杂链表的head。（注意，输出结果中请不要返回参数中的节点引用，否则判题程序会直接返回空）思路： 
解法一：以空间换时间。整个过程分两步：首先遍历原链表，创建复制结点，并完成复制节点的val、next域的赋值，此过程中建立一个Map，存储原节点和其复制节点的映射关系。然]]></description><category></category></item><item><title><![CDATA[面试题（三十四）二叉树中和为某一值的路径]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79520075</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79520075</guid><author>CurryXu</author><pubDate>Sun, 11 Mar 2018 20:57:44 +0800</pubDate><description><![CDATA[题目：输入一棵二叉树和一个整数，打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。思路：首先要注意：必须是从根节点到叶节点的路径才是有效的路径，若是根节点到内部节点的一条路径，则无效。 由于二叉树递归的结构特性，所以可以考虑用递归解题： 
1）首先判断输入整数和当前节点的值是否相同，若相同且该节点为叶节点，则将当前路径放入符合题意的路径集合中，然]]></description><category></category></item><item><title><![CDATA[Java finalize方法]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79500653</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79500653</guid><author>CurryXu</author><pubDate>Fri, 09 Mar 2018 17:39:15 +0800</pubDate><description><![CDATA[转载自：http://blog.youkuaiyun.com/carolzhang8406/article/details/6705831

《JAVA编程思想》：

java提供finalize()方法，垃圾回收器准备释放内存的时候，会先调用finalize()。

(1).对象不一定会被回收。

(2).垃圾回收不是析构函数。

(3).垃圾回收只与内存有关。

(4).垃圾回收和finalize()都是...]]></description><category></category></item><item><title><![CDATA[面试题（三十三）二叉搜索树的后序遍历序列]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79487269</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79487269</guid><author>CurryXu</author><pubDate>Thu, 08 Mar 2018 17:17:57 +0800</pubDate><description><![CDATA[题目：输入一个整数数组，判断该数组是不是某二叉搜索树的后序遍历结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路：二叉搜索树的后序遍历结果的特点：序列的最后为根节点，序列的前半部分为根节点的左子树，所有元素小于根节点，后半部分为右子树，所有元素大于根节点。因此解题步骤如下： 
1）确定根节点 
2)   从左往右遍历序列，直到发现第一个大于根节点的元素x。此元素之前]]></description><category></category></item><item><title><![CDATA[面试题（二十九） 顺时针打印矩阵]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79433952</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79433952</guid><author>CurryXu</author><pubDate>Sat, 03 Mar 2018 23:35:26 +0800</pubDate><description><![CDATA[题目：输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字，例如，如果输入如下矩阵： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。思路：用上、下、左、右四个坐标定位出一次要旋转打印的数据，一次旋转打印结束后，往对角分别前进和后退一个单位。主要是要敢于设置四个位置变量]]></description><category></category></item><item><title><![CDATA[面试题（二十八）对称的二叉树]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79433921</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79433921</guid><author>CurryXu</author><pubDate>Sat, 03 Mar 2018 23:29:14 +0800</pubDate><description><![CDATA[题目：请实现一个函数，用来判断一颗二叉树是不是对称的。注意，如果一个二叉树同此二叉树的镜像是同样的，定义其为对称的。思路：针对二叉树的前序遍历定义一种对称的遍历算法：先遍历父节点，再遍历其右子节点，最后遍历左子节点。如果一个二叉树的前序遍历结果和对称遍历算法结果相同，那么这个二叉树便是对称的。代码（已在牛客网AC）： boolean isSymmetrical(TreeNode pRoot)]]></description><category></category></item><item><title><![CDATA[面试题（二十七） 二叉树的镜像]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79433895</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79433895</guid><author>CurryXu</author><pubDate>Sat, 03 Mar 2018 23:24:56 +0800</pubDate><description><![CDATA[题目：操作给定的二叉树，将其变换为源二叉树的镜像。思路：画图分析可知，在遍历二叉树的过程中将节点的左右子树交换即可。代码（递归实现，已在牛客网AC）：public void Mirror(TreeNode root) {
        if(root == null)
            return;
        if(root.left == null && root.right ==]]></description><category></category></item><item><title><![CDATA[你真的了解volatile关键字吗？]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79417846</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79417846</guid><author>CurryXu</author><pubDate>Thu, 01 Mar 2018 21:57:56 +0800</pubDate><description><![CDATA[转载出处：https://www.jianshu.com/p/7798161d7472一、Java内存模型想要理解volatile为什么能确保可见性，就要先理解Java中的内存模型是什么样的。Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存，线程的工作内存中保存了被该线程所使用到的变量（这些变量是从主内存中拷贝而来）。线程对变量的所有操作（读取，赋值）都必须在工作内存中]]></description><category></category></item><item><title><![CDATA[面试题（二十六） 树的子结构]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79407208</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79407208</guid><author>CurryXu</author><pubDate>Thu, 01 Mar 2018 00:07:16 +0800</pubDate><description><![CDATA[题目：输入两棵二叉树A，B，判断B是不是A的子结构。（ps：我们约定空树不是任意一个树的子结构）思路：要查找树A中是否存在和树B结构一样的子树，可以分为两步：第一步是在树A中找到和树B的根节点的值一样的节点R；第二步是判断以R为根节点的子树是不是包含和树B一样的结构。第一步查找树A中是否存在和树B的根节点值一样的节点可以通过遍历树A实现；第二步判断R为根节点的子树是否包含和树B一样的结构也可以通过递]]></description><category></category></item><item><title><![CDATA[面试题（二十五） 合并两个排序的链表]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79407168</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79407168</guid><author>CurryXu</author><pubDate>Wed, 28 Feb 2018 23:56:54 +0800</pubDate><description><![CDATA[题目：输入两个单调递增的链表，输出两个链表合成后的链表，当然我们需要合成后的链表满足单调不减规则。思路：用递归实现该算法较为简便。、代码（已在牛客网    AC）：public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null)
            return list2;
        if(l]]></description><category></category></item><item><title><![CDATA[面试题（二十四） 反转链表]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79407141</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79407141</guid><author>CurryXu</author><pubDate>Wed, 28 Feb 2018 23:52:16 +0800</pubDate><description><![CDATA[题目：定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。链表节点的定义如下：public class ListNode {
    int val;
    ListNode next = null;    ListNode(int val) {
        this.val = val;
    }
}思路：定义first指针指向原链表中待反转的节点，second指针指向]]></description><category></category></item><item><title><![CDATA[java创建线程的三种方式及其对比]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79377781</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79377781</guid><author>CurryXu</author><pubDate>Mon, 26 Feb 2018 15:30:42 +0800</pubDate><description><![CDATA[转载出处：http://blog.youkuaiyun.com/longshengguoji/article/details/41126119Java中创建线程主要有三种方式：一、继承Thread类创建线程类（1）定义Thread类的子类，并重写该类的run方法，该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。（2）创建Thread子类的实例，即创建了线程对象。（3）调用线程对象的]]></description><category></category></item><item><title><![CDATA[深入理解Java抽象类和接口]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79377433</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79377433</guid><author>CurryXu</author><pubDate>Mon, 26 Feb 2018 15:10:03 +0800</pubDate><description><![CDATA[转载出处：http://www.cnblogs.com/dolphin0520/p/3811437.html



一. 抽象类

　　在了解抽象类之前，先来了解一下抽象方法。抽象方法是一种特殊的方法：它只有声明，而没有具体的实现。抽象方法的声明格式为：



abstract void fun();

　　抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法，则称这个类为抽象类，...]]></description><category></category></item><item><title><![CDATA[AOP的静态代理和动态代理]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79374412</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79374412</guid><author>CurryXu</author><pubDate>Mon, 26 Feb 2018 10:45:13 +0800</pubDate><description><![CDATA[转载出处：http://listenzhangbin.com/post/2016/09/spring-aop-cglib/AOP（Aspect Orient Programming），我们一般称为面向方面（切面）编程，作为面向对象的一种补充，用于处理系统中分布于各个模块的横切关注点，比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理，AOP代理主要分为静态代理和动态代理]]></description><category></category></item><item><title><![CDATA[面试题（二十三） 链表中环的入口节点]]></title><link>https://blog.youkuaiyun.com/CurryXu/article/details/79372194</link><guid>https://blog.youkuaiyun.com/CurryXu/article/details/79372194</guid><author>CurryXu</author><pubDate>Sun, 25 Feb 2018 22:27:52 +0800</pubDate><description><![CDATA[题目：一个链表中包含环，请找出该链表的环的入口结点。思路：关键是要想到：如果链表存在环，则设置一快一慢两个指针同时从链表头出发，那么快的指针必定会追上慢的指针，并且相遇的节点为环中的一个节点。然后再让指向相遇节点的指针绕着环一圈便可以计算出环的长度length。最后再让一个指针从链表头节点出发，另一个指针从链表的第length+1个节点出发，两个指针以相同速度往后移动，相遇的节点便为链表的环的入口节]]></description><category></category></item></channel></rss>