自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 链表性能对比

程序知道的只有第1个结点的内存地址,要找到索引2的结点(即第3个)​,程序必须先读取索引0的链,然后顺着该链去找索引1。接着再读取索引1的链,去找索引2,这才能读取到索引2里的值。由于插入动作创建了一个新的结点,如下图那样改动"blue"和"purple"的链,因此实际的操作只需1步。但是,在该动作之前,计算机还得先找到索引1的结点("blue")​,让结点1的链指向新的结点。假设现在要删除刚才例子的索引2的值("purple")​,计算机就会找出索引1的结点,将其链指向"green"结点。

2024-09-13 19:27:16 930

原创 数据结构-链表

像数组一样,链表也用来表示一系列的元素。事实上,能用数组来做的事情,一般也可以用链表来做。然而,链表的实现跟数组是不一样的,在不同场景它们会有不同的性能表现。计算机的内存就像一大堆格子,每格都可以用来保存比特形式的数据。当要创建数组时,程序会在内存中找出一组连续的空格子,给它们起个名字,以便你的应用存放数据,见下图。计算机能够直接跳到数组的某一索引上。如果代码要求它读取索引4的值,那么计算机只需一步就可以完成任务。

2024-08-18 09:04:03 451

原创 快速排序效率

为了搞清楚快速排序的效率,我们先从分区开始。分解来看,你会发现它包含两种步骤。❏ 比较:每个值都要与轴做比较。❏ 交换:在适当时候将左右指针所指的两个值交换位置。一次分区至少有N次比较,即数组的每个值都要与轴做比较。因为每次分区时,左右指针都会从两端开始靠近,直到相遇。交换的次数则取决于数据的排列情况。一次分区里,交换最少会有1次,最多会有N / 2次,因为即使所有元素都需要交换,我们也只是将左半部分与右半部分进行交换,如下图所示。

2024-08-13 19:52:20 629

原创 快速排序基础

此处的分区指的是从数组随机选取一个值,以其为轴,将比它小的值放到它左边,比它大的值放到它右边。即比轴(值为3)小的值都聚在了它的左侧,比轴大的值都聚在了它的右侧,这就意味着3已经被放置到正确的位置上了。当分区完成时,在轴左侧的那些值肯定比轴要小,在轴右侧的那些值肯定比轴要大。由于左指针的值比轴要大,我们将其停在那里。(2) 右指针逐个格子向左移动,当遇到小于或等于轴的值时,就停下来。(4) 重复上述步骤,直至两指针重合,或左指针移到右指针的右边。第8步:到了分区的最后一步,将左指针的值与轴交换位置。

2024-08-12 20:42:36 195

原创 数据结构-递归

递归简单实现及如何阅读递归代码

2024-08-05 18:50:17 867

原创 数据结构-队列

套用到队列上,就是首先加入队列的,将会首先从队列移出。队列对于临时数据的处理也十分有趣,它跟栈一样都是有约束条件的数组。目前为止,队列表现得还跟栈一样,但要是移除数据的话,就会跟栈反着来了,因为队列是从开头移除数据的。首先,插入5(虽然栈的插入就叫压栈,但队列的插入却没有固定的叫法,一般可以叫放入、加入、入队)。与栈类似,队列也有3个限制(但内容不同)。想移除数据,得先从5开始,因为开头就是它。❏ 只能移除开头的数据(这也跟栈相反)。❏ 只能读取开头的数据(这跟栈相反)。这样一来,队列就只剩下100了。

2024-08-01 20:30:00 232

原创 数据结构-栈

你可以将栈看成一叠碟子:你只能看到最顶端那只碟子的碟面,其他都看不到。另外,要加碟子只能往上加,不能往中间塞,要拿碟子只能从上面拿,不能从中间拿(至少你不应该这么做)。绝大部分计算机科学家都把栈的末尾称为栈顶,把栈的开头称为栈底。注意,每次压栈都是把数据加到栈顶(也就是栈的末尾)。如果想把0插入到栈底或中间,那是不允许的,因为这就是栈的特性:只能在末尾插入数据。这也是栈的限制:只能移除末尾的数据。栈存储数据的方式跟数组一样,都是将元素排成一行。这没什么特别的,就如往数组插入数据一样平常。

2024-07-31 21:45:00 290

原创 算法-插入排序

在第一轮,temp_value为索引1的值,由于temp_value左侧只有一个值,所以最多进行一次比较。在数组完全逆序的最坏情况下,我们每一轮都要将temp_value左侧的所有值与temp_value比较。当数组完全逆序时,有多少次比较就要多少次平移,因为每次比较的结果都会使你将值右移。对于有10个元素的数组,最多需要:1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9=45次比较。你会发现,在最坏的情况里,插入排序的时间复杂度跟冒泡排序、选择排序一样,都是O(让我们来一步步地讲解。

2024-07-30 21:00:23 406

原创 算法-插入排序

(1) 在第一轮里,暂时将索引1(第2格)的值移走,并用一个临时变量来保存它。准备工作:暂时移走2,并将其保存在变量temp_value中。如果遇到比临时变量小的值,或者空隙已经到了数组的最左端,就结束平移阶段。准备工作:暂时移走索引2的值,并保存到temp_value中。第1轮先从索引1开始,其值为2。第12步:空隙到了数组最左端,因此我们将temp_value插进去,结束这一轮。准备工作:暂时移走索引4的值3,保存到temp_value中。第5步:将temp_value插回到空隙中,结束第2轮。

2024-07-25 18:41:00 377

原创 算法-选择排序

于是,第1轮开始时最小值的索引是0,到第2轮则是1,以此类推。但每轮的交换最多只有1次。如果该轮的最小值已在正确位置,就无须交换,否则要做1次交换。选择排序的步骤可分为两类:比较和交换,也就是在每轮检查中把未排序的值跟该轮已遇到的最小值做比较,以及将最小值与该轮起点的值交换以使其位置正确。循环内逐个检查数组未排序的格子,若遇到比之前记录的本轮最小值还小的格子值,就将lowestNumberIndex更新为该格子的索引。从表中可以清晰地看到,选择排序的步数大概只有冒泡排序的一半,即选择排序比冒泡排序快一倍。

2024-07-22 22:15:00 214

原创 算法-选择排序

在此过程中,我们会用一个变量来记住检查过的数字的最小值(事实上记住的是索引,但为了看起来方便,下图就直接写出数值)。第1次检查的起点是索引0,第2次是索引1,以此类推。准备工作:因为索引0的值已符合其排位,所以这一轮从下一个格子开始,即索引1,其值为2,也是目前本轮所遇到的最小值。根据此算法的定义,它是目前遇到的最小值(因为现在只检查了一个格子),于是记下其索引。第5步:本次检查的起点是索引0,不管那里的值是什么,我们都应该将最小值1换到那里。准备工作:此轮检查从索引3开始,其值4是目前的最小值。

2024-07-18 21:00:00 272

原创 二分查找与线性查找

对于长度太小的有序数组,二分查找并不比线性查找好多少。但我们来看看更大的数组。对于拥有100个值的数组来说,两种查找需要的最多步数如下所示。❏ 线性查找:100步❏ 二分查找:7步用线性查找的话,如果要找的值在最后一个格子,或者比最后一格的值还大,那么就得查遍每个格子。有100个格子,就是100步。二分查找则会在每次猜测后排除掉一半的元素。100个格子,在第一次猜测后,便排除了50个。再换个角度来看,你就会发现一个规律。长度为3的有序数组,二分查找所需的最多步数是2。

2024-07-15 19:00:34 781

原创 二分法查找

如果你说50,然后我提示要再大一点,那么你应该会选75,以排除掉剩余数字的一半。总之,一直都猜中间值,就能不断地缩小一半的范围。你小时候或许玩过这样一种猜谜游戏:我心里想着一个1到100之间的数字,在你猜出它之前,我会提示你的答案应该大一点还是小一点。因为数组的长度是已知的,将长度除以2,我们就可以跳到确切的内存地址上,然后检查其值。而且,这下我们也排除了一半的格子,即9右边的那些(以及9本身)。为了看出它的实际效果,假设有一个包含9个元素的有序数组。它的值为4,那么7就在它的右边了。我们随便挑个左边的。

2024-07-12 19:23:02 222

原创 冒泡排序的效率分析

冒泡排序的执行步骤可分为两种。❏ 比较:比较两个数看哪个更大。❏ 交换:交换两个数的位置以使它们按顺序排列。

2024-07-03 10:09:27 191

原创 算法-冒泡排序

排序算法是计算机科学中被广泛研究的一个课题。历时多年,它发展出了数十种算法,这些算法都着眼于一个问题:如何将一个无序的数字数组整理成升序?先介绍一些“简单排序”,它们很好懂,但效率不如其他排序算法。冒泡排序是一种很基本的排序算法,步骤如下。(1) 指向数组中两个相邻的元素(最开始是数组的头两个元素),比较它们的大小。(2) 如果它们的顺序错了(即左边的值大于右边),就互换位置。如果顺序已经是正确的,那这一步就什么都不用做。(3) 将两个指针右移一格。

2024-07-01 18:36:57 387

原创 算法基础详解

算法基础学习之大O记法

2024-06-27 09:30:49 442

原创 AES加密加固

一、反编译1.定义:利用编译程序从源语言编写的源程序产生目标程序的过程。2.怎么进行反编译?先了解apk对文件构造二、加固方案的手段1.反模拟器:模拟器运行apk,可以用模拟器监控到apk的各种行为,所以在实际的加固apk运行中,一旦发现模拟器在运行该APK, 就停止核心代码的运行。2.代码虚拟化:代码虚拟化在桌面平台应用保护中已经是非常的常见了,主要的思路是自建一个虚拟执行引擎,然后把原生的可执 行代码转换成自定义的指令进行虚拟执行。3.加密:样本的部分可执行代码是以压缩或

2020-06-07 18:05:31 444

原创 Java并发基础知识(五)

线程池为什么要用线程池? Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服..

2020-05-17 17:25:00 475

原创 Java并发基础知识(四)

阻塞队列阻塞队列队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。什么是阻塞队列 .

2020-05-17 16:36:34 252

原创 Java并发基础知识(三)

CAS基本原理什么是原子操作?如何实现原子操作?假定有两个操作A和B(A和B可能都很复杂),如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。实现原子操作可以使用锁,锁机制,满足基本的需求是没有问题的了,但是有的时候我们的需求并非这么简单,我们需要更有效,更加灵活的机制,synchronized关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候,访问同一资源的其它线程需要等待,直到该线程释放锁,这里会有些问题:首先,如果被

2020-05-16 16:48:09 228

原创 Java并发基础知识(二)

ThreadLocal辨析与Synchonized的比较ThreadLocal和Synchonized都用于解决多线程并发訪问。可是ThreadLocal与synchronized有本质的差别。synchronized是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程訪问。而ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。ThreadLocal的使用ThreadLocal类接口很简单,只有4个方法,

2020-05-16 14:19:54 219

原创 Java并发基础知识(一)

一、Java里的程序天生就是多线程的,那么有几种新启线程的方式?正确的答案应该是2种:1、类Thread;2、接口Runnable,有些人觉得应该是3个,还有一个是Callable接口,其实这个和Runnable是重复的,我们看源码分析首先源码中明确说明创建Thread只有2种方式;其次,Thread的构造方法中不接受任何的Callable参数我们继续看Callable,再使用的过程中,把它包装成FutureTask,而FutureTask是实现了RunnableFuture接口,R

2020-05-13 22:24:52 233

原创 Android事件分发机制

什么是事件分发用户通过屏幕与手机交互的时候,每一次点击、长按、移动等都是一个事件。 事件分发机制:某一个事件从屏幕传递到各个View,由View来使用这一事件(消费事件)或者忽略这一事件(不消费事件),这整个过程的控制。事件分发的对象是谁系统把事件封装为MotionEvent对象,事件分发的过程就是MotionEvent分发的过程。事件类型按下(ACTION_DOWN) 移动(...

2019-11-04 16:02:59 196

原创 Drawable系列之-BitmapDrawable

这几乎是最简单的Drawable了,它表示的就是一张图片。在实际开发中,我吗可以直接引用原始图片即可,但是也可以通过XML的方式来描述它,通过XML来描述的BitmapDrawable可以设置更多的效果,如下所示:下面是它的各个属性的含义。android:src这个很简单,就是图片的资源id。android:antialias是否开启图片抗锯齿功能。开启会让图片变得平滑,同...

2019-11-03 16:54:23 395

原创 Drawable系列之-Drawable简介

Drawable有很多种,它们都表示一种图像的概念,但是它们又不全是图片,通过颜色也可以构造出各式各样的效果。在实际开发中,Drawable常被用来作为View的背景使用。Drawable一般都是通过XML来定义的,当然我们也可以通过代码来创建具体的Drawable对象。在Android的设计中,Drawable是一个抽象类,它是所有Drawable对象的基类,每个具体的Drawable都有它的子...

2019-11-03 16:34:03 906

原创 Android Glide4.10.0引发的血案

今天下载最新的android studio3.5.1,导入了一个老项目,项目中的glide版本为4.8.0,可正常使用。后来把glide版本升级为4.10.0,也是可以运行的,但在项目里面有一个功能用到glide加载图片,竟然崩溃了,以下为报错日志找不到方法centerCrop(), 咨询看了代码才发现,这个功能是导入的一个第三方sdk实现的,sdk里面的glide版本为4.8.0,和...

2019-11-01 11:28:47 4525 1

原创 HashMap实现原理

一、Java中的hashCode和equals1、关于hashCodehashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同 如果对象的equals方法被重写,那么对象的...

2019-03-08 17:32:26 200

原创 自定义LabelView热门标签

现在各大主流app都有搜索功能,提到搜索不得不提热门标签,热门标签样式基本一致,今天带大家实现一个自定义的热门标签view.先上效果图:自动判断当前行是否可显示完整,如果不完整自动换行显示。1.创建LabelView继承ViewGroup2.复写三个构造方法public LabelView(Context context) { this(context, null...

2018-12-27 21:02:12 363

原创 requestDisallowInterceptTouchEvent处理滑动冲突,判断recycler是否滑动到底部

1.处理滑动冲突getParent().requestDisallowInterceptTouchEvent(true);表示不允许父控件接收事件,子View自己处理。getParent().requestDisallowInterceptTouchEvent(false);表示允许父控件接收事件,父View处理事件。实例代码:当用户按下或者移动的时候,我们告诉父组件,不要拦截我的事件...

2018-12-20 16:00:49 753

原创 Broadcast Receiver

1.广播定义在android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,Android中我们要发送的广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。2.广播的使用场景A.同一个app具有多个进程的不同组件之间的消息通信B.不同app之间的组件之间的消息通信3.广播种类1).Normal Broadcast:Context.sendBroadcast ...

2018-06-27 16:02:51 251

原创 Service介绍

Service(服务):是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。一经启动会长时间在后台运行,即使启动它的Activity或者Broadcast被销毁了也不会受影响。注意:Service和Broadcast一样,运行在主线程中,不能做长时间的耗时操作。Service和Thread的区别:1.Thread是程序执行的最小单元,可以执行异步操作,相对独立。Service是运行在主线程...

2018-06-26 18:42:22 712

原创 Fragment详解

Fragment优点:1.使用频率较高,有自己的生命周期,可以更加灵活的加入到Activity中2.Fragment比Activity更节省内存,UI切换效果更加舒适3.Fragment需要依赖Activity,可以加载到Activity中Fragment加载到Activity中的两种方法:1.静态加载:添加Fragment到Activity的布局文件当中2.动态加载:动态在Activity中添加...

2018-06-22 18:00:58 581

原创 Uri使用场景

1,调web浏览器  Uri myBlogUri = Uri.parse(" http://xxxxx.com ");  returnIt = new Intent(Intent.ACTION_VIEW, myBlogUri);  2,地图  Uri mapUri = Uri.parse("geo:38.899533,-77.036476");  returnIt = new Intent(Int...

2018-05-05 08:23:33 162

原创 Activity的生命周期

返回栈:        Android是通过任务管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个活动,处于栈顶的活动会出栈,这时前一个入栈的活动就会处于栈顶位置。系统总是会显示处于栈...

2018-04-20 14:52:52 217

原创 Java基础知识大全

一、java面向对象的三大特性与含义继承:从已有的类得到继承信息创建新类的过程,继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序的可变因素的重要手段。封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已经定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自制、封闭的对象。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供简单的编程接口;多态:允许不同子类型的...

2018-04-17 20:01:06 184

原创 屏幕适配全攻略

一、概念1.屏幕尺寸:指屏幕的对角线的长度,单位英寸,1英寸=2.54厘米。2.屏幕分辨率:指在横纵向上的像素点数。单位px,1px = 1像素点,一般以纵向像素*横向像素,如1920*1080。3.屏幕像素密度:指每英寸上的像素点数,单位dpi,与屏幕尺寸和屏幕分辨率有关。4.px:构成图像的最小单位。5.dp,dip:密度无关像素,以160dp为基准,1dip = 1px。6.sp:可以根据文...

2018-04-01 10:00:13 191

原创 Android Studio升级到3.0.1遇到Annotation processors must be explicitly declared now. The following depend

Android studio升级到3.0.1报错Annotation processors must be explicitly declared now.  The following dependencies on the compile classpath are found to contain annotation processor.  Please add them to the a...

2018-03-29 11:57:59 488

原创 Android面试解密-自定义View

一、为什么要自定义控件:1.特定的显示分格2.处理特有的用户交互3.优化我们的布局4.封装等二、如何自定义View1.自定义属性的声明与获取2.测量onMeasure3.布局onLayout(ViewGroup)4.绘制onDraw5.onTouchEvent6.onInterceptTonchEvent(ViewGroup)自定义的声明与获取1.分析需要的自定义属性2.在res/values/a...

2018-03-28 21:11:08 1807

原创 开发环境搭建-Mac平台

HomebrewHomebrew, Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件。/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"译注:在Max OS X 10.11(El Capitan)版本中,homebrew在安装软件时可...

2018-03-25 09:37:22 771 1

原创 初识React Native

          开发Android一年多时间,一直都是原生开发,今天看了处于技术前沿的React Native的介绍,忍不住感到它的强大,我准备把学习React Native过程记录于此,希望可以帮助其他新手快速入门,谢谢大家支持!React Native优点:1.跨平台,既可以开发Android,也可以开发IOS;2.低投入高回报,一次学习就可以同时开发Android和IOS;3.性能高,自...

2018-03-25 09:28:49 179

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除