0%

一则奇怪的现象

集成Matrix这个性能工具已经很久了,自认为对Matrix检测主线程卡顿的trace-canary模块已经熟悉了,但是最近一个同学的一次“抬杠”让我不知所措。
我们知道matrix官方介绍说trace-canary是利用Android主线程执行MessageQueue中的每一个Message时会在执行前打印一个日志,执行完成后再打印一个日志,记录这两个日志的时间差就可以判断我们这个Message是否执行超时,如果是,那么再进一步利用我们在每个方法中的首尾插桩计算方法的耗时,最终查找出到底是应用的哪个方法导致超时的。

阅读全文 »

Matrix检测主线程耗时方法

Matrix是一个开源的全方面监控应用性能的工具,它的一个功能是能检测Android应用的主线程的耗时方法,比如我们设置耗时阈值为700ms,那么基于Looper机制运行的主线程中如果存在一个Message的执行时间超过700ms,它可以直接统计出这个Message调用的方法栈,并且可以大致统计出每个被调用方法的执行时间,这样我们就可以愉快地发现导致主线程耗时的方法了。

阅读全文 »

ArraySet的实现原理

android.util.ArraySet 是 framework.jar 提供的一个容器类,它的功能和Java的HashSet一样,用来存放对象集合,但它的实现方式却和HashSet不一样。
ArraySet主要维护两个数组,一个是Object[]用来保存对象集合,一个是int[]用来保存对象对应的hashCode集合,对应关系如图:

阅读全文 »

15. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

1
2
3
示例 1
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
//二叉树结点定义
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
阅读全文 »

1
2
3
4
5
6
7
//链表结点定义
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

阅读全文 »