- 博客(74)
- 问答 (1)
- 收藏
- 关注
原创 记录c++函数忘记返回值导致的难以排查bug
错误信息:libc: Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x7c9de68bfc in tid 27058 (.xx.xx), pid 27058 (.xx.xx)错误的信息为:在进程id27058中的线程id27058,错误的地址 0x7c9de68bfc错误的原因是:有返回值的函数没有写返回值。例如:bool func() { std::cout << "hhh" << std::endl
2022-02-21 17:01:06
1398
1
原创 c++实现类java反射:从类名字符串创建对象
前言最近在项目中,需要用到从类名来创建C++类对象,类似于Java中的反射。C++没有反射的概念,所以是没办法和Java一样通过类名来创建对象。思考了几种方式之后,我得到了一种性能和代码上都比较不错的方式。如果急着寻求方案,可以直接滑到总结处。核心思路众多方式,其实本质的核心思路是一样的:使用一个Map来保存字符串和创建对象的函数 。写个伪代码大概就是这样std::map<std::string,std::function<...>> registerMap;void
2022-02-18 15:16:09
959
原创 【Android实习】20场面试斩获大厂offer,我学会了什么
前言很高兴遇见你~先说一下笔者春招实习的情况:从三月初到四月半,经历了近20场面试,一共面试了五家企业,通过了腾讯、字节、蚂蚁、美团的面试,虎牙在一面之后拒了二面邀请。金三银四,笔者不是在面试中,就是在面试的路上,踩了很多坑,吃了很多亏,也学了很多的东西。这篇文章,就想要把笔者的这些收获分享给你们,希望对你们有帮助。文章的内容总体上可以分为两个部分:吹水、干货。吹水部分主要是分析笔者的面试过程,有兴趣的读者可以看一下;干货部分主要是分享笔者的面试经验,从技术到非技术到面试表现,可以根据标题按需阅读。
2021-04-20 17:58:22
1263
4
原创 通俗易懂,android是如何管理内存的
前言很高兴遇见你~内存优化一直是 Android 开发中的一个非常重要的话题,他直接影响着我们 app 的性能表现。但这个话题涉及到的内容很广且都偏向底层,让很多开发者望而却步。同时,内存优化更加偏向于“经验知识”,需要在实际项目中去应用来学习。因而本文并不想深入到底层去讲内存优化的原理,而是着眼于宏观,聊聊 android 是如何分配和管理内存、在内存不足的时候系统会如何处理以及会对用户造成什么样的影响。Android 应用基于 JVM 语言进行开发,虽然 google 根据移动设备特点开发了自家
2021-03-30 11:36:29
716
原创 写给android工程师的cookie分析
前言很高兴遇见你~cookie在HTTP1.1版本中被添加,目的是为了解决HTTP的无状态特性,使HTTP变得“有状态”。我们在做android开发,很多时候并不能很好理解cookie的存在价值、优化。这其实正常。Http中文翻译为超文本传输协议,是为web开发的传输协议。而cookie作为其中的一个功能,他的设计自然也是服务于web。为了更好地理解cookie他的本质,需要站在web开发的角度来理解他,具体而言就是使用浏览器网页具体化客户端。android的发展要比web晚的多。虽然都使用cook
2021-03-23 21:38:44
245
原创 关于Handler同步屏障你可能不知道的问题
前言很高兴遇见你 ~关于handler的内容,基本每个android开发者都掌握了,网络中的优秀博客也非常多,我之前也写过一篇文章,读者感兴趣可以去看看:传送门。这篇文章主要讲Handler中的同步屏障问题,这也是面试的热门问题。很多读者觉得这一块的知识很偏,实战中并没有什么用处,仅仅用来面试,包括笔者。我在Handler机制一文中写到:其实同步屏障对于我们的日常使用的话其实是没有多大用处。因为设置同步屏障和创建异步Handler的方法都是标志为hide,说明谷歌不想要我们去使用他。笔者在前段时间面
2021-03-17 20:58:20
466
3
原创 清晰图解深度分析HTTPS原理
前言很高兴遇见你~Https现在基本已经覆盖所有的http请求了,作为一个伟大的发明,保障了我们的通信安全。在Android中对于HTTPS其实感知不多,因为这些内容都有成熟的框架帮我们完成了,例如okHttp。我们发起一个http或https的请求几乎感受不到区别。但最近在研究okHttp的源码的时候,发现很多的内容没看懂,最后发现是http相关的网络知识不扎实,再一次回过头来,把https学了一遍。正如前面所说,得益于框架,我们几乎不需要学习https背后到底发生了什么,但是发生了相关的bug也就
2021-03-01 21:35:23
499
2
原创 这一篇TCP总结请收下
前言很高兴遇见你~TCP这些东西,基本每个程序猿都或多或少是掌握的了。虽然感觉在实际开发中没有什么用武之处,但,面试他要问啊而最近大家伙过完年,也都在准备春招,我也一样。阅读了一些okHttp源码之后,又屁颠屁颠地跑回来重新把tcp、http这些东西给重新学了一遍。okHttp基本都是这些协议的实现,而理解源码的基础是,理解tcp、http。重新看了一遍tcp之后,我把这些东西给总结了下来,也就有了这篇文章。计算机网络的知识特点就是:琐碎。靠背诵“面试八股文”估计没多久就忘了。TCP是计算机网络
2021-02-24 22:53:32
510
原创 深入浅出Java线程池:源码篇
前言在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用。(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适)。本文则深入线程池的源码,主要是介绍ThreadPoolExecutor内部的源码是如何实现的,对ThreadPoolExecutor有一个更加清晰的认识。ThreadPoolExecutor的源码相对而言比较好理解,没有特别难以读懂的地方。相信没有阅读源码习惯的读者,跟着本文,也可以很轻松地读懂ThreadPoolExecutor的核心源码逻辑。
2021-02-06 01:59:46
327
原创 深入浅出Java线程池:使用篇
前言很高兴遇见你~借助于很多强大的框架,现在我们已经很少直接去管理线程,框架的内部都会为我们自动维护一个线程池。例如我们使用最多的okHttp以及他的封装框架Retrofit,线程封装框架RxJava和kotlin协程等等。为了更好地使用这些框架,则必须了解他的实现原理,而了解他的原理,线程池是永远绕不开的话题。线程的创建与切换的成本是比较昂贵的。JVM的线程实现使用的是轻量级进程,也就是一个线程对应一个cpu核心。因此在创建与切换线程时,则会涉及到系统调用,是开销比较大的过程。为了解决这个问题,线程
2021-01-31 17:43:48
235
原创 Android事件分发机制五:面试官你坐啊
前言很高兴遇见你~事件分发系列文章已经到最后一篇了,先来回顾一下前面四篇,也当个目录:Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的整体流程,以及事件分发的真正起点Android事件分发机制二:viewGroup与view对事件的处理 : 源码分析了viewGroup和view是如何分发事件的Android事件分发机制三:事件分发工作流程 : 分析了触摸事件在控件树中的分发流程模型Android事件分发机制四:学了事件分发有什么用?
2021-01-26 19:43:01
2894
6
原创 Android事件分发机制四:学了事件分发有什么用?
“ 学了事件分发,影响我CV大法吗?”“ 影响我陪女朋友的时间”“ … ”前言Android事件分发机制已经来到第四篇了,在前三篇中:Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的整体流程,以及事件分发的真正起点Android事件分发机制二:viewGroup与view对事件的处理 : 源码分析了viewGroup和view是如何分发事件的Android事件分发机制三:事件分发工作流程 : 分析了触摸事件在控件树中的分发流程模.
2021-01-26 19:17:27
427
3
原创 Android事件分发机制三:事件分发工作流程
前言很高兴遇见你~本文是事件分发系列的第三篇。在前两篇文章中,Android事件分发机制一:事件是如何到达activity的? 分析了事件分发的真正起点:viewRootImpl,Activity只是其中的一个环节;Android事件分发机制二:viewGroup与view对事件的处理 源码解析了viewGroup和view是如何分发事件的。事件分发的核心内容,则为viewGroup和view对事件的分发,也就是第二篇文章。第二篇文章对源码的分析较为深入,缺乏一个更高的角度来审视事件分发流程。本文在
2021-01-24 16:24:51
475
原创 Android事件分发机制二:viewGroup与view对事件的处理
前言很高兴遇见你~在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下:触摸信息从手机触摸屏幕时产生,通过IMS和WMS发送到viewRootImplviewRootImpl把触摸信息传递给他所管理的viewview根据自身的逻辑对事件进行分发常见的如Activity布局的顶层viewGroup为DecorView,他对事件分发方法进行了重新,会优先回调windowCall
2021-01-22 22:37:44
834
1
原创 Android事件分发机制一:事件是如何到达activity的?
事件分发,真的一定从Activity开始吗?前言很高兴遇见你~事件分发,android中一个老生常谈的话题了。基本的流程我们也都知道是从Activity开始分发,但有一个关键问题是:事件是如何到达Activity的 ?你以为我接下来要开始讲源码、系统底层了?不不不,本文不讲这些,而是着重于android框架层对于触摸机制的设计,更好地理解整一个android在框架层的事件分发,理解整体的流程是怎么回事。android的view管理是以window为单位的,每个window对应一个view树。W.
2021-01-16 16:34:10
1047
原创 Java之String重点解析
String s = new String("abc")这段代码创建了几个对象呢?s=="abc"这个判断的结果是什么?s.substring(0,2).intern()=="ab"这个的结果是什么呢?s.charAt(index) 真的能表示出所有对应的字符吗?"abc"+"gbn"+s直接的字符串拼接是否真的比使用StringBuilder的性能低?前言很高兴遇见你~Java中的String对象特性,与c/c++语言是很不同的,重点在于其不可变性。那么为了服务字符串不可变性的设计,则衍..
2020-12-19 16:33:42
245
2
原创 HashMap相关类:Hashtable、LinkHashMap、TreeMap
前言很高兴遇见你~在 深入剖析HashMap 文章中我从散列表的角度解析了HashMap,在 深入解析ConcurrentHashMap:感受并发编程智慧 解析了ConcurrentHashMap的底层实现原理。本文是HashMap系列文章的第三篇,主要内容是讲解与HashMap相关的集合类。HashMap本身功能已经相对完善,但在某些特殊的情景下,他就显得无能为力,如高并发、需要记住key插入顺序、给key排序等。实现这些功能往往需要付出一定的代价,在没有必然的需求情景下,增添这些功能是没必要的。因
2020-12-10 12:16:39
278
原创 深入解析ConcurrentHashMap:感受并发编程智慧
如果有一个整型变量count,多个线程并发让count自增1,你会怎么设计?你知道如何让多个线程协作完成一件事件吗?前言很高兴遇见你~ConcurrentHashMap是个老生常谈的集合类了,我们都知道多线程环境下不能直接使用HashMap,而需要使用ConcurrentHashMap,但有没有了解过ConcurrentHashMap到底是如何实现线程安全的呢?他到底跟传统的Hashtable和SynchronizeMap(没听过SynchronizeMap?他就是Collections.s..
2020-12-08 17:32:45
778
2
原创 深入剖析HashMap
前言很高兴遇见你~HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点。本文并不打算讲解基础的使用api,而是深入HashMap的底层,讲解关于HashMap的重点知识。需要读者对散列表和HashMap有一定的认识。HashMap本质上是一个散列表,那么就离不开散列表的三大问题:散列函数、哈希冲突、扩容方案;同时作为一个数据结构,必须考虑多线程并发访问的问题,也就是线程安全。这四大重点则为学习HashMap的重点,也是HashMap设计的重点。HashMap属于Map集合体系的
2020-12-05 23:21:49
213
原创 一文搞懂 | Java中volatile关键字
前言很高兴遇见你~volatile关键字在Java多线程编程编程中起的作用是很大的,合理使用可以减少很多的线程安全问题。但其实可以发现使用这个关键字的开发者其实很少,包括我自己。遇到同步问题,首先想到的一定是加锁,也就是synchronize关键字,暴力锁解决一切多线程疑难杂症。但,锁的代价是很高的。线程阻塞、系统线程调度这些问题,都会造成很严重的性能影响。如果在一些合适的场景,使用volatile,既保证了线程安全,又极大地提高了性能。那为啥放着好用的volatile不用,偏偏要加锁呢?一个很重要的
2020-11-13 20:14:32
290
原创 Android全面解析之Activity生命周期
前言很高兴遇见你~ 欢迎阅读我的文章。关于Activity生命周期的文章,网络上真的很多,有很多的博客也都讲得相当不错,可见Activity的重要性是非常高的。事实上,我猜测每个android开发者接触的第一个android组件都是Activity。我们从新建第一个Activity开始,运行了代码,看到模拟机上显示了一个MainActivity标题和一行HolleWorld,从此打开Android世界的大门。本篇文章讲解的重点是Activity的生命周期,在文章的最后也会涉及Activity的设计。不
2020-11-08 21:32:50
2977
1
原创 JVM基础(三):垃圾回收机制
前言很高兴遇见你~ 欢迎阅读我的文章。Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来垃圾收集(Garbage Collection ,也称为GC),是虚拟机中一个永恒不变的话题。上述那句话堪称经典,同时也点出了垃圾回收这个问题的重要性。在c/c++中,开发者对内存有至高无上的权利,同时也需要自己对对象负责到底:创建和释放,每一块内存使用完之后都需要调用free方法来释放内存。而JVM采用自动化技术,开发者无需关心内存的分配以及释放,当一个对
2020-10-25 12:20:09
593
原创 JVM基础(二):运行时数据区
前言很高兴遇见你~ 欢迎阅读我的文章。在上一篇文章JVM基础(一):认识虚拟机中,介绍了什么是虚拟机,以及字节码class文件。这一篇文章主要讲关于JVM的运行时数据区结构。我们知道,c/c++在内存上划分为了栈和堆区,栈区存放函数的局部变量等,堆区为用户自主开辟的空间。当开发者需要新建一个对象时,首先需要在堆区中开辟一个空间,再初始化,使用。最后需要自己手动去释放该内存区域。而JVM把这些工作都做好了,当我们需要新建一个对象的时候,只需要一个关键字new即可创建一个对象,当我们不再使用这个对象的时候
2020-10-21 19:41:48
304
原创 JVM基础(一):认识虚拟机
前言很高兴遇见你~ 欢迎阅读我的文章。JVM是每个Java程序员必须迈过去的一个坎,因为它实在是太重要了。Java的底层知识,归根结底,都是JVM相关知识。很多读者看到jvm就感觉:哦这是底层知识,算了先学好应用层再说。或者到了面试需要不得不背诵几道题。在我看来,了解JVM是理解整个Java生态的必经之路。编程语言的发展,从机器码01串到现在的高级Java语言,这里面凝结了无数先驱的智慧。了解JVM,不只是为了面试,更是为了感受前人的智慧,学习JVM也可以让我们的Java程序更加地健壮。而关于非JVM
2020-10-21 13:55:59
430
1
原创 Android之window机制token验证
前言很高兴遇见你~ 欢迎阅读我的文章这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充。如果你对Android的Window机制和Context机制目前位了解过,强烈建议你先阅读前面两篇文章,可以帮助理解整个源码的解析过程以及对token的理解。同时文章涉及到Activty启动流程源码,读者可先阅读Activity启动流程这篇文章。文章涉及到这些方面的内容默认读者已经阅读且了解,不会对这方面的内容过多阐述,如果遇到一些内容不理解,可以找到对应
2020-10-13 20:46:55
7734
14
原创 静态工厂代替多参构造器
静态工厂代替多参构造器背景假如现在你要想一个汉堡,有一个汉堡类:Hamburg。那么一般情况下你会:Hamburg hamburg = new Hamburg();情景一:不同参数数目的构造器制作汉堡可以选择自定义,加肉,加菜,或者不添加,直接默认配方即可,那么会有以下几个构造器:Hamburg();Hamburg(Meat meat);Hamburg(Meat meat,Vegetable vegetable);当你要制作汉堡的时候,看到这么多的构造器,但是却不知道他们是什么意思,返
2020-10-12 19:01:50
179
2
原创 Android全面解析之Context机制
前言很高兴遇见你~ 欢迎阅读我的文章。在文章Android全面解析之由浅及深Handler消息机制中讨论到,Handler可以:避免我们自己去手动写 死循环和输入阻塞 来不断获取用户的输入以及避免线程直接结束,而是采用事务驱动型设计,使用Handler消息机制,让AMS可以控制整个程序的运行逻辑。这是关于android程序在设计上更加重要的一部分,不太了解的读者可以前往阅读了解一下。而当我们知道android程序的程序是通过main方法跑起来的,然后通过handler机制来控制程序的运行,那么四
2020-10-11 21:10:55
7914
20
原创 Android全面解析之由浅及深Handler消息机制
前言很高兴遇见你~ 欢迎阅读我的文章。关于Handler的博客可谓是俯拾皆是,而这也是一个老生常谈的话题,可见的他非常基础,也非常重要。但很多的博客,却很少有从入门开始介绍,这在我一开始学习的时候就直接给我讲Looper讲阻塞,非常难以理解。同时,也很少有系统地讲解关于Handler的一切,知识比较零散。我希望写一篇从入门到深入,系统地全面地讲解Handler的文章,帮助大家认识Handler。这篇文章的讲解深度循序渐进,不同程序的读者可选择对应的部分查看:第一部分是对于Handler的入门概述。
2020-10-08 21:17:45
10747
9
原创 关于Java受检异常的思考
受检异常是否真的有必要?这是一个争论了很久的问题,至今仍然没有一个确定的答案。Java的受检异常,被很多人吐槽,也被很多人喜爱,当然他们都可以拿出很多的理由来证明自己的观点。看过《洞穴奇案》这本书的读者,可以了解到,从不同的角度、不同的利益诉求来看同一个问题可以得到不同的答案。没有谁对谁错,只有理解的不同。对于这个问题,我也就我自己的个人感受来简单谈一谈个人观点,而答案,相信读者心中早就有了。什么是异常?要了解受检异常,首先要了解什么是异常。在Java中,异常是一套能够一致地处理错误和恢复代码运行正
2020-10-02 23:23:49
434
原创 快速排序算法详细图解
前言排序算法非常多,几乎每个人学的第一个排序算法都是冒泡算法,但是冒泡算法的时间复杂度是很高的,是一种效率很低的算法。而目前来说,快速排序是相对比较好的一种算法:实现难度低,时间复杂度低。但快速排序在一些情况下也可能出现退化到和冒泡算法一样的时间复杂度,所以需要读者注意一下,下面我会讲到。那么接下来就来看看这个算法。笔者才疏学浅,有不同观点欢迎评论区或私信讨论。如需转载请留言告知。另外欢迎阅读笔者的个人博客一只修仙的猿的个人博客,更精美的UI,拥有更好的阅读体验。算法思路递归算法的思路其实很简
2020-08-21 17:37:08
27497
3
原创 Android中ContentProvider的启动与请求源码流程详解(基于api29)
前言你好 ~我是一只修仙的猿,欢迎阅读我的文章。ContentProvider作为四大组件之一,但是使用的频率确实很少,甚至有一些读者都没用过他,真是毫无存在感的四大组件。但是既然他能作为四大组件,说明他的重要性肯定不低,只是目前来说我们使用不到。ContentProvider的作用是跨进程共享数据,他向我们屏蔽了底层的Binder操作,使得我们可以像查询本地的数据一样查询别的进程的数据,让跨进程的数据共享变得非常方便。如我们查询手机的通讯录、短信等,都是通过ContentProvider来实现的。
2020-08-19 21:02:06
6492
原创 Android广播Broadcast的注册与广播源码过程详解(基于api29)
作为四大组件之一,广播的地位不言而喻。而了解其源码流程,可以更好地帮助我们了解他的工作流程,进而更好地了解Broadcast这个组件。这样在开发中,就会更加有自信去写代码,出现了bug也能更快地定位与解决
2020-08-17 22:35:25
6832
2
原创 Android架构之MVC、MVP、MVVM详解
什么是架构模式?什么是android架构模式?MVC、MVP、MVVM的本质区别是什么?他们在android上的应用是怎么样的?我们该如何选择?弄清楚这几个问题,可以帮助我们更好地理解这三种架构模式,继而更好地运用它们。
2020-08-17 15:44:40
1025
原创 Android中Service的启动与绑定过程详解(基于api29)
前言前面我写到一个文章是关于Activity启动流程的点击链接前往。这一篇的内容是关于Service的启动和绑定的流程详解。Service和Activity一样,都是受AMS和ActivityThread的管理,所以在启动流程上两者有一些相似。不同的是Service有绑定的流程,相对比较复杂一点,结合Service的生命周期来理解,也不是很复杂。了解启动源码的好处是整个Service对于你来说已经是透明的了,我们所做的每一个操作,心里都很清楚他的背后发生了什么。这是一种自信,也是一种能力,一种区别于入门
2020-08-08 16:06:03
8034
原创 Activity启动流程详解(基于api28)
前言Activity作为Android四大组件之一,他的启动绝对没有那么简单。这里涉及到了系统服务进程,启动过程细节很多,这里我只展示主体流程。activity的启动流程随着版本的更替,代码细节一直在进行更改,每次都会有很大的修改,如android5.0 android8.0。我这里的版本是基于android api28,也是目前我可以查得到的最新源码了。事实上大题的流程是相同的,掌握了一个版本,其他的版本通过源码也可以很快地掌握。因为涉及到不同的进程之间的通信:系统服务进程和本地进程,在最新版本的an
2020-08-02 16:49:06
26612
9
原创 算法:如何判断链表是否含有环
题目:判断链表是否有环给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。示例 :输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。来源:力扣(LeetCode)链接:htt
2020-06-13 17:51:57
300
原创 算法:计算每日温度
题目:每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。来源:力扣(LeetCode)
2020-06-12 23:59:14
508
原创 算法:把数字按规则翻译成字符串
题目:把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 :输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"来源:力扣(LeetCode)链接:https://leetcode-cn.com/pr
2020-06-10 00:00:11
545
原创 算法:最长连续序列
题目:最长连续序列给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-consecutive-sequence分析找到一组数的集合,我们想一下可能有的方法,动态规划?貌似没有状态转移方程可以写;滑动窗
2020-06-09 22:27:33
295
空空如也
相同操作系统在不同的机器上,jvm需要进行适配吗?
2020-03-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人