diff --git a/blogs/Algorithm/剑指 Offer/字符串相关.md b/blogs/Algorithm/剑指 Offer/字符串相关.md index d080a5a..a531da4 100644 --- a/blogs/Algorithm/剑指 Offer/字符串相关.md +++ b/blogs/Algorithm/剑指 Offer/字符串相关.md @@ -93,3 +93,39 @@ class Solution { } ``` +[67. 把字符串转换成整数](https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/) + +```java +class Solution { + + public int strToInt(String str) { + str = str.trim(); + if (str.length() == 0) { + return 0; + } + boolean isMinus = false; + char[] ch = str.toCharArray(); + if (ch[0] == '+' || ch[0] == '-' || Character.isDigit(ch[0])) { + if (ch[0] == '+' || ch[0] == '-') { + if (ch[0] == '-') { + isMinus = true; + } + ch = Arrays.copyOfRange(ch, 1, ch.length); + } + int index = 0; + long res = 0; + while (index < ch.length && Character.isDigit(ch[index])) { + res *= 10; + res += ch[index] - '0'; + if (res > Integer.MAX_VALUE) { + return isMinus ? Integer.MIN_VALUE : Integer.MAX_VALUE; + } + index++; + } + return isMinus ? -(int) res : (int) res; + } + return 0; + } +} +``` + diff --git a/blogs/Java/口水话/JVM 相关口水话.md b/blogs/Java/口水话/JVM 相关口水话.md index 2fd16ce..9c185e0 100644 --- a/blogs/Java/口水话/JVM 相关口水话.md +++ b/blogs/Java/口水话/JVM 相关口水话.md @@ -168,3 +168,8 @@ HotSpot 内置了多个 JIT 即时编译器,C1 和 C2,之所以引入多个 在官方文档上,已经没有 Dalvik 相关的信息了,Android 5 后,ART 全面取代了 Dalvik。Dalvik 使用 JIT 而 ART 使用 AOT。AOT 和 JIT 的不同之处在于,JIT 是在运行时进行编译,是动态编译,并且每次运行程序的时候都需要对 odex 重新进行编译;而 AOT 是静态编译,应用在安装的时候会启动 dex2oat 过程把 dex 预编译成 oat 文件,每次运行程序的时候不用重新编译。另外,相比于 Dalvik,ART 对 GC 过程也进行了改进,只有一次 GC 暂停,而 Dalvik 需要两次,而且在 GC 保持暂停状态期间并行处理。AOT 解决了应用启动和运行速度问题的同时也带来了另外两个问题,一个是应用安装和系统升级之后的应用安装时间比较长,二是优化后的文件会占用额外的存储空间。在 Android 7 之后,JIT 回归,形成了 AOT/JIT 混合编译模式,这种混合编译模式的特点是:应用在安装的时候 dex 不会被编译,应用在运行时 dex 文件先通过解释器执行,热点代码会被识别并被 JIT 编译后存储在 Code cache 中生成 profile 文件,再手机进入 IDLE(空闲)或者 Charging(充电)状态的时候,系统会扫描 App 目录下的 profile 文件并执行 AOT 过程进行编译。这样一说,其实是和 HotSpot 有点内味。 +#### JVM 是如何执行方法调用的? + +其实呢就是了解 Java 编译器和 JVM 是如何区分方法的。方法重载在编译阶段就能确定下来,而方法重写则需要运行时才能确定。 + +Java 编译器会根据所传入的参数的声明类型来选取重载方法,而 JVM 识别方法 \ No newline at end of file