Java 指令重排序相关
Java 指令重排序。
Java 类加载机制
Java 类加载机制探究。
Hexo 的 Template render error 错误
Hexo 的 Template render error 错误探究。
Markdown 引用中嵌套代码块
最近有篇文章在引用中嵌套代码块,在 Typora 编辑器和博客的 NexT 主题中显式效果不一样,所以特地深入探究了一下。
以下测试效果基于 Hexo 3.8.0
、NexT 主题 NexT.Gemini v6.6.0
。
会出问题的写法
错误写法的源代码
错误写法在 Hexo 中的渲染
错误写法在 Typora 中的渲染
问题
显示效果
Hexo | Typora | |
---|---|---|
是否正常 | 不正常,有多余的 >,代码块和下一段文本中间会断开 | 正常 |
是否有代码块效果 | 有 | 有 |
是否有行号 | 有 | 有 |
是否有配色 | 有 | 有 |
正确的写法
正确写法1:使用 Hexo 特定代码块写法
正确写法1的源代码
正确写法1在 Hexo 中的渲染
正确写法1在 Typora 中的渲染
需要注意的一个地方
在 {% endcodeblock %}
这一行后边和下一段文本之间需要空一行,空的这一行开头只有一个 >
,这样才能正常显示。
还需要注意的是,.md
源文件中所有的用花括号和百分号括起来的部分被看作 hexo 的 block 标签,就像这样 {% %}
。如果单独出现是会报 template render error
错误的。所以如果想让其正常显示,需要使用 {% raw %}{% endraw %}
括起来。如下所示:
显示效果
Hexo | Typora | |
---|---|---|
是否正常 | 正常 | 不正常 |
是否有代码块效果 | 有 | 无 |
是否有行号 | 有 | 无 |
是否有配色 | 有 | 无 |
相关代码:
1
2{% codeblock %}
{% endcodeblock %}
正确写法2:多四个空格
在引用的文本中,在某一行的前边比其他行的开头多打 4 个空格,这一行在 Hexo 中会自动变为代码块显示。
正确写法2的源代码
正确写法2在 Hexo 中的渲染
正确写法2在 Typora 中的渲染
显式效果
Hexo | Typora | |
---|---|---|
是否正常 | 正常 | 不正常 |
是否有代码块效果 | 有 | 无 |
是否有行号 | 无 | 无 |
是否有配色 | 无 | 无 |
正确写法3:代码块中不使用 >
正确写法3的源代码
正确写法3在 Hexo 中的渲染
⚠ 如果使用 Typora 编辑器,需要注意
Typora 编辑器中,只能在源代码模式下进行这样的编辑,但是一旦退出源代码模式,Typora 就会自动给很多行前边都加上 >
,还会在每行前边都加上很多空格。所以,除非直接在源代码模式下编辑之后不再退出源代码模式,才能保证显示效果。
显示效果
Hexo | Typora | |
---|---|---|
是否正常 | 正常 | 不正常,且会导致其他部分不正常显示 |
是否有代码块效果 | 有 | 无 |
是否有行号 | 有 | 无 |
是否有配色 | 有 | 无 |
参考文章
Java 计算程序运行时间
使用 System.NanoTime()
1 public static long nanoTime()Returns the current value of the running Java Virtual Machine’s high-resolution time source, in nanoseconds.
This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.
This method provides nanosecond precision, but not necessarily nanosecond resolution (that is, how frequently the value changes) - no guarantees are made except that the resolution is at least as good as that of
currentTimeMillis()
.Differences in successive calls that span greater than approximately 292 years ($2^{63}$ nanoseconds) will not correctly compute elapsed time due to numerical overflow.
The values returned by this method become meaningful only when the difference between two such values, obtained within the same instance of a Java virtual machine, is computed.
For example, to measure how long some code takes to execute:
1
2
3 long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;To compare two nanoTime values
1
2
3 long t0 = System.nanoTime();
...
long t1 = System.nanoTime();one should use
t1 - t0 < 0
, nott1 < t0
, because of the possibility of numerical overflow.
- Returns:
the current value of the running Java Virtual Machine’s high-resolution time source, in nanoseconds
- Since:
1.5
示例
1 | long startTime; |
使用 System.currentTimeMillis()
1 public static long currentTimeMillis()Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond, the granularity of the value depends on the underlying operating system and may be larger. For example, many operating systems measure time in units of tens of milliseconds.
See the description of the class
Date
for a discussion of slight discrepancies that may arise between “computer time” and coordinated universal time (UTC).
Returns:
the difference, measured in milliseconds, between the current time and midnight, January 1, 1970 UTC.
See Also:
示例
1 | long startTime = System.currentTimeMillis(); |
可能的误差
System.currentTimeMillis()
在部分 Windows 系统中可能存在 10ms 的误差。有人说在他的游戏程序中使用 nanoTime()
之后比使用 currentTimeMillis()
的时候游戏画面过渡更平滑。
参考资料
剑指Offer 2. 实现单例模式
单例模式及其应用。
数组循环移位问题
今天面试遇到的一道题。与参考资料的第一篇文章类似。
另外可以参考STL源码中 rotate()
函数的实现思路。
//TODO 有待填坑
测试几种算法的运行效率
1 | public class Solution { |
参考资料
关于 Java 的自增运算符可能产生的 bug
面试的时候被问到的一个问题。
LeetCode 53. Maximum Subarray [Easy]
题目来源:53. Maximum Subarray - LeetCode
题目难度:Easy
题目
Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.
Example:
1 | Input: [-2,1,-3,4,-1,2,1,-5,4], |
解答1[Java]
1 | class Solution { |
思路
动态规划。dp[i]
中存储的是 i
之前的最大的子序列和。
时间复杂度 $O(n)$,空间复杂度为 $O(n)$。
解答2[Java]
1 | class Solution { |
思路
一直加,用 curSum
表示截至目前的最大正子序和。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。