左耳听风 第四十一周

左耳听风 第四十一周

每周完成一个ARTS: 每周至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称ARTS)

Algorithm

继续按顺序来完成「LeetCode」前 200 题,以下为个人题解:

LeetCode45. 跳跃游戏 II

LeetCode46. 全排列

LeetCode48. 旋转图像

review

Finally understanding how references work in Android and Java 「彻底弄懂引用时如何在 安卓 和 Java 中工作的」

首先要知道 Java 中默认的 4 类引用:强引用(Strong reference)、软引用(SoftReference)、弱引用(WeakReference)、幻象引用(PhantomReference)

强引用,是我们日常编程中最常见的引用,当我们创建一个新的对象时,默认就是强引用。例如:

Object object = new Object();

这里要衍生到 Java 垃圾回收的机制,当有对象处于 强引用 状态时,Java 的垃圾收集器是不会帮我们回收这部分内存的。

于是这就有可能引发「内存泄漏」问题。当一个对象,我们不再需要使用时,却有其他对象持有其 强引用,该对象内存就无法被垃圾收集器回收。

于是,基于内存正确回收的需要,弱引用 承担了这部分责任。被弱引用所引用对象的内存,随时可能被垃圾收集器回收。但是能够在对象还存在时继续或者该对象的使用。

好了, 强引用弱引用 各有优势,但是编程的要求总是多变的。即不想一直保持对象的引用、又不想对象在内存足够的被垃圾收集器清零怎么办?软引用 出现了,二者综合,在内存足够的时候保持对对象的引用,在内存不够的时候,把相应的引用清理,然后再被垃圾收集器释放内存。—— 综合通常是计算机的具体实践,不做最极端,但做最适用。

幻象引用,当一个对象在垃圾收集器收集时,它可以被 幻象引用 引用。(很少见,作者所在正式的生产环境中掰手指也能数出遇见的次数)

总结,通过这篇文章,我们能够对于 Java 中的四种引用有一定的认识,当我们的程序出现「内存泄漏」时,我们可以从错误的引用来排查一些问题,了解这些是为了让我们写出更健壮的代码以及如何改善,希望对你有所帮助。

Tip

从 Java HashMap 中学习的技巧,putVal() 函数中用位运算 & 代替求余数 (n - 1) & hash

这里 hash 是经过哈希函数计算出的哈希值(Int),n 代表的是哈希表的容量 n-1 代表哈希表下标的取值范围(底层结构为 数组,索引从 0 开始)。

根据与运算的特性,只有当前运算的两个数二进制位都为 1 时,结果为 1,其余都为 0。则 (n - 1) & hash 的取值范围为 [ 0,n-1 ],相同 hash 计算的结果一致。相比 % 运算(底层还是转换为二进制操作),& 运算直接操作二进制位效率更高,在 HashMap 想要达到的效果一致。

同样,当我们在相同场景中也可以使用 & 运算帮我们提高效率。

附上异或运算交换值的技巧。(原理:二进制数,A^A=0,任意数 ^ 0=它本身)

交换 A、B 的值,不借助辅助空间。

    A=A^B;
    B=A^B;
    A=A^B;

share

《剑指offer》攻略

把《剑指 offer》的题目用 Java 语言(书中是 C++)实现了一遍,希望能给大家一些参考。

GitHub 地址:https://github.com/hackhu2019/offer

附上我整理的思维导图,有一些做题技巧。剑指 offer 攻略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值