- 博客(18)
- 收藏
- 关注

原创 Leakcanary检测泄漏流程原理分析
内存泄漏指的是程序在向系统申请分配内存空间,使用完毕后未释放,结果导致一直占据该内存单元,程序无法再使用该内存单元
2021-12-30 20:16:24
1233
原创 Java 浅拷贝和深拷贝
但这个方法有个弊端,就是如果引用对象的链路比较深,例如 A 引用 B,B 引用 C,C 引用 D,甚至更深,就需要重写很多。浅拷贝会创建一个新的对象,复制该对象的基本类型引用,但不复制该对象内的其他对象引用。一个对象要支持浅拷贝,需要实现。两个完全不同的对象,也即是要实现深拷贝,有两个办法,下文介绍两种方法。是不可变的,修改String类型都会返回一个新对象,参考文档。类型的对象引用,但是却可以不用实现。需要注意的是引用对象的类型也要实现。接着使用IO实现序列化和反序列化。指向不同的对象,但是里面的。
2025-03-13 18:04:47
183
原创 Android SharedPreference 详解
SharedPreference 是 Android 提供的轻量级的,线程安全的数据存储机制,使用 key-value 键值对的方式将数据存储在 xml 文件中,存储路径为
2025-03-12 17:31:10
1059
原创 Java volatile 关键字
同一个成员变量在不同线程中处于各自独立的虚拟机栈帧中,A 线程修改了该变量,B 线程中读的值可能仍然是其内存缓存的值。不管是 cpu 还是虚拟机,都会对操作指令进行重新排序以到达最佳的执行效果,volatile 针对 JVM 指令禁止重排序,达到避免因指令重排在某些边界条件下出现的不符合预期的问题。这是一个典型的双重校验的懒汉式模的单例模式,但这里隐藏着一个重大风险,就是在多线程访问下,在创建之初,某个线程会获取到一个没有执行。在禁止指令重排上的使用场景,接下来再看看确保变量的内存可见性的场景,在。
2025-03-10 01:21:00
654
原创 Java 原码,反码,补码和位移操作
由于int类型占32位,则最终结果则为 00000000,00000000,00000000,00000000,即是0。java 中正数的原码,反码和补码一致。负数的反码为除最高位,其余位去反。负数的补码为负数的反码 + 1。cpu 是有加法,没有减法,减法通过加一个负数,最后溢出一位的原理实现,以 5 - 5 为例。java 中正数和负数都是通过补码的形式存储。注意:java 没有无符号左移运算符 <<<位移运算符,还是分别以 5 和 -5 举例。
2025-02-12 16:04:15
285
原创 String的基础知识
中可以看到 从 android 5.0 后就需要使用 jdk 7 以上的版本,这里讨论的默认字符串常量池放置在虚拟机的堆内存中,不再过多讨论永久代(Permanent Generation, PermGen) 的方法区,事实上从 java 8 后,JVM 就已经没有永久代了,取而代之的是元空间(MetaSpace)
2025-01-21 10:58:01
685
原创 java.lang.IllegalArgumentException: No view found for id 崩溃总结
java.lang.IllegalArgumentException: No view found for id
2022-03-08 15:28:53
9052
4
原创 Kotlin contract 用法及原理
contract(契约)是一种 Kotlin 面向编译器约定的一种规则,它帮助编译器更加智能地识别某些需要特定的代码条件,为代码创建更加友好的上下文关联环境
2022-01-24 22:44:36
4544
原创 Kotlin sealed class 的使用
sealed class用来表示受限的类继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类可以有可包含状态的多个实例
2022-01-14 18:56:55
2130
原创 Android Handler 源码以及原理分析
Handler 源码分析Handler 简介Handler 是 Android 重要的通信工具,一个 Handler 关联有且仅有一个 Thread 、Looper 和 MessageQueue,它依赖于 Looper 和 MessageQueue 分发 Message 和 Runnable 对象在 Handler 绑定的线程中执行一些操作。创建 Handler 时默认绑定当前所在的 Thread,也可以通过手动绑定 Looper 对象设置 Handler 运行所在的 Thread。Handler 的消
2020-10-04 15:36:47
219
原创 Activity findViewById 原理分析
在日常Android开发当中,实例化View的对象都通过findViewById方法传入对应的View的Id得到View的实例。但是在View较为庞大的界面当中,则会出现相当一部分的代码块去做View初始化,显得代码比较“冗余”(对于这个冗余我不太认可,毕竟肥而不腻的写法无伤大雅,也方便代码阅读)。对此,有开源的框架ButterKnife解决了这个问题,它通过APT,在编译代码时动态生成...
2018-05-22 23:23:08
1479
原创 HashMap实现原理分析
HashMap 介绍 HashMap在我们的日常开发中非常常见,其本质就是基于数组和链表组合实现。它提供了很方便的key-value的存取接口,通过对key进行Hash计算散列存储位置和快速查找,HashMap允许key和value为null。HashMap并不是线程安全的,如果存在多线程存取操作容易出现注明的ConcurrentModificationException异常。其存储方式可以...
2018-04-06 18:16:46
371
1
原创 java实现合并排序算法
前言 合并排序是分治法当中一个经典的排序算法,它通过将规模为n的原始问题分解为n/2,然后得到各自的解后,在合并两个子问题的解,最终得到原始问题的解。合并排序属于稳定排序,在排序过程中,如果遇到Ai==Aj,假设i < j,在完成排序后不会影响Ai和Aj的相对位置,即Ai仍然在Aj前面。 合并排序的时间复杂度是O(nlogn),但是在排序当中需要递归拆分元问题,空间复杂度是O(...
2018-04-06 17:43:39
8282
原创 Android ListView 动态设置ItemView高度为0隐藏Item
前言 在使用Adapter加载ItemView时应该使用:inflater.inflate(R.layout.my_layout, parent, false); 不然会导致ItemView的高度仅仅是wrap_content,除非在my_layout中再嵌套一层Layout并指定高度。 隐藏ItemView 设置某一项Item的高度主要是设置该ItemView的高度,我们可以在get
2016-08-28 18:41:26
4343
1
原创 Android 跨进程接口回调
简介同进程接口回调在开发中经常可以用的到。方法就是A实现一个interface,并且向B传入一个interface实例引用C,然后B在必要的时候调用C的方法,以此实现接口回调。其实是可以将interface的方法直接声明并实现在A中,并且通过向B直接传入A的对象引用也可以实现相同的效果,但是基于java多态和抽象的特性,通过传入一个interface的引用可以让调用者B并不用关心传入的具体是谁的引用
2016-08-14 15:02:04
4958
1
原创 用java实现欧几里得算法求两个数字的最大公约数
最大公约数最大公约数的定义是两个不全为0的非负整数m和n的最大公约数记为gcd(m , n),代表能够整除(即余数为0)的最大整数。欧几里得算法原理:1.如果n == 0,则m就是最大公约数2.如果n != 0,用m去除以n得到模k,将n赋值给m,将k赋值给n,直到n == 0实现代码如下import jav
2015-10-26 00:27:56
3691
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人