最长递增子序列-Java 实现 1、Θ(n2) 打表实现初始化对角线为 1; 对每一个 i,遍历 j(0 到 i-1): 若A[i] <= A[j],置 1。 若A[i] > A[j],取第 j 行的最大值加 1。private static int getLargestLen(int[] array) { int[] max = new int[array.length]; fo...
Java并发:volatile解析 一、Java 内存模型Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。二、并发编程中的三个概念1、原子性一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。...
计算器的实现-Java 代码 用Java 实现的计算器,原理看代码注释public class MyCalculator { public static void main(String[] args) { String obj = "6+(8/2)+6/3+1*8 + 30"; ArrayList arrayList = strFormat(obj); Syste
Android 源码解析 - ScrollView ScrollView 可以在垂直方向做滑动显示内容,并且ScrollView中只能添加一个子View,下面对源代码进行分析。源码解析ScrollView 继承关系onMeasure方法@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.on
Android 源码解析 - Scroller 分析版本 : Android API 26介绍Android开发中,如果我们希望使一个View滑动的话,除了使用属性动画外。 我们还可以使用系统提供给我们的两个类Scroller和OverScroller用来实现弹性滑动。下面分析一下Scroller的使用方法以及实现方式。View中的scrollBy()和scrollTo()方法介绍/** * Set the sc
最小堆解决TopK 问题 - Java代码实现 TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据。解决方法一、对源数据中所有数据进行排序,取出前K个数据,就是TopK。解决方法二维护一个K长度的数组a[],先读取源数据中的前K个放入数组,对该数组进行升序排序,再依次读取源数据第K个以后的数据,和数组中最小的元素(a[0])比较,如果小于a[0]直接pass,大于的话,就丢弃最小的元素a[0],利用二分法找到其位
Android 动画 一篇就够 动画实际上就是在指定的时间段内持续修改某个属性的值, 使得该值在指定取值范围内平滑过渡。 动画可以分为三大类, 帧动画(Frame Animation)、补间动画(Tweened Animation)、属性动画(Android 3.0 之后增加的属性动画)帧动画帧动画是最容易实现的一种动画,这种动画更多的依赖于完善的UI资源, 原理是一定的时间段内切换多张有细微差异的图片从而在视觉上
gradientRadius 的适配问题 gradientRadius percentages 支持Android 5.0之后的系统,如果是之前的需要使用自定义View。自定义View 如下:public class RadialGradientView extends View { private final int endColor; private final int startColor; priv
避免使用startActivityForResult startActivityForResult 所有处理结果的逻辑都要放到onActivityResult中,在onActivityResult里面根据requestCode作不同处理,这样逻辑比较复杂, 我们希望的是能在发起startActivityForResult的时候捎带着把获取结果后处理的逻辑也传进去,并能在内部做处理。下面我们参考RxPermissions的做法给出了一种解决方法 Git
设计模式-建造者模式 定义官方定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,通俗的说就是:建造者模式就是如何一步步构建一个包含多个组成部件的对象,相同的构建过程可以创建不同的产品特点建造者模式是一种创建型模式,适用于那些流程固定,建造的目标对象会有所改变这种场景,还有一种场景是代替多参数构造器作用1、用户不知道对象的建造过程和细节就可以创建出复杂的对象「屏蔽了建造的具体细节」 2、用户
Java 内存模型 第一部分 内存模型我们常说Java内存模型(Java Memory Model, JMM)指的是Java运行时(Java runtime)内存模型,Java源码通过javac 翻译成字节码,由即时编译器(JIT)编译执行。因为字节码是静态代码,需要加载到内存才能成为可以动态运行的对象。运行时内存数据区大体上被分为5个区域、两大类型, 如下图。线程私有(隔离)数据区1、程序计数...
Android 框架-ImageLoader 图片加载框架 Android 开发中我们会经常会加载网络图片的需求,目前成熟的图片加载框架有 Fresco、Glide、Picasso, 比较老的还有UniversaclImageLoader(15年开发的时候还在用这个开源库,可惜现在已停止维护了)。由于最近想分析下Glide 的源码,之前有没有分析过图片加载框架,所以就自己参考网上简单的图片加载框架自己写了一个ImageLoader,分析下图片加载的基本原理和
有状态对象和无状态对象 1、进程与线程的关系进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 进程有独立的地址空间进程有单独的地址空间,包括文本区域(text region
Android 源码解析-LruCache 缓存工具类 关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻底理解Android中的缓存机制。1、LruCache的介绍LruCache是Android API 12以后提供的一个缓存工具类,采用了最近最少使用算法。它把最近使用的对象用“强引用”存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值
Glide 源码解析(一) 加载流程 Glide介绍Glide 是Google 员工 bumptech 开源的一款图片加载框架,相对于UniversalImageLoader,Picasso,它还支持video,Gif,SVG格式,支持缩略图请求,旨在打造更好的列表图片滑动体验。Glide有生命周期的概念(主要是对请求进行pause,resume,clear),而且其生命周期与Activity/Fragment的生命周期绑定,支持Vol
Mac上一键反编译Apk与查看jar文件 将需要反编译的Apk(**.apk无需重命名) 拷贝到 apk 文件夹下,然后运行run.sh 脚本,反编译完成后会自动打开Gui 工具查看反编译后的文件。拷贝文件运行脚本反编译后的结果工具下载地址
经典的Java算法面试题 1、新浪面试题:编写一个方法,计算一个字符串中,第一个不重复的字符在当前字符串中的索引。public class JavaTest { //贪心算法 编写一个方法,计算一个字符串中,第一个不重复 的字符在当前字符串中的索引。 public static String array = "abuacdeaudbdfcefhph"; public static int[] conta
Android 布局优化-ViewStub 视图 ViewStub 是一个轻量级的View,View 的宽高为0,不绘制任何东西,只是占一个位置而已。优势 在需要的时候才加载View,这样实现了View的延迟加载,避免资源的浪费,减少渲染时间, 因此可以提高页面的加载速度。不足 ViewStub所要替代的layout文件中不能有标签, ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了用法实例<LinearLayou
Android 数据库升级数据迁移以及数据库导入 在我们开发的应用中,一般都会涉及到数据库,使用数据的时候会涉及到数据库的升级、数据的迁移、增加行的字段等。比如,用户定制数据的保存,文件的端点续传信息的保存等都会涉及到数据库。我们应用第一个版本是V1.0,在迭代版本V1.1 时,我们在数据库中增加了一个字段。因此V1.0的数据库在V1.1版本需要升级,V1.0版本升级到V1.1时原来数据库中的数据不能丢失,那么在V1.1中就要有地方能够检测出来版本