FengZH的博客

  • 首页

  • 标签

  • 分类

  • 归档

kotlin 的基本使用

发表于 2019-09-23 | 分类于 Kotlin

基础

1. 对象的定义

kotlin 在定义对象时,涉及到两个关键字:val 和 var。

val 定义的是常量(只能一次赋值),var 定义的是变量(可多次赋值)。

1
2
3
4
5
6
7
8
val i : Int = 1     //立即赋值
val j = 2 //可省略对象类型,自动推断为Int类型(通常写法)

val k : Int //先不赋值,此时要声明类型
k = 3 //现在赋值

var v = 5
v = 6 //可以改变var变量的值

阅读全文 »

Activity 的启动:四种启动模式及各种 FLAG

发表于 2019-09-15 | 分类于 Android

简介

Activity 有四种不同的启动模式,这四种模式分别是:standard,singleTop,singleTask,singleInstance。

这四种模式中,standard模式是默认的模式,其他三个想要使用的话,要在 AndroidMainFest 文件中进行修改(通过给对应的 activity 设置 launchMode 属性,例如:)。

阅读全文 »

wait & notify 机制

发表于 2019-09-13 | 分类于 Java

前言

有时候,各个线程在执行过程需要相互通信,例如发送控制指令、向另一个暂停执行的线程发送恢复执行的指令。

如果只是发送一个控制指令,可以使用一个用 volatile 修饰的共享标记量在两个线程之间通信。如果要唤醒另一个暂停执行的线程,就涉及到了 wait/notify 机制,下面就来分析一下这个机制。

阅读全文 »

洗牌算法

发表于 2019-09-01 | 分类于 算法

问题背景

有这样一个问题:给定一个长度为 n 的数组,你的任务是打乱该数组,保证每个元素出现在任意位置的概率相同,也就是在 n! 个排列中,每一个排序出现的概率相同。

很容易想到的方法是每次随机选出一个未被选过的元素,也就是说第一次有 n 种选择,第二次有 n-1 种选择,以此类推。使用这种方式时要么每次选出元素后都该把元素删除,接下来缩小随机数的生成范围;要么不删除元素,但是产生的随机数是已经选过的元素时,还要再次产生随机数。无论是哪种方式,时间复杂度都不只 O(n)。

这时就乱到洗牌算法出场了,它能够在 O(n) 时间复杂度下打乱数组。

阅读全文 »

蓄水池抽样算法(Reservoir Sampling)

发表于 2019-08-31 | 分类于 算法

前言

什么是抽样问题?抽样问题就是从一个大数据量 N 中抽取出 M 个不重复的数据。例如:

  1. 从 100000 份调查报告中抽取 1000 份进行统计
  2. 从一本很厚的电话簿中抽取 1000 人进行统计

抽样问题最重要的是做到公平,也就是保证每个元素被抽到的概率是相同的。最容易想到的解决方法是生成随机数,例如对于问题 1,可以通过算法生成 [0, 100000-1] 间的随机数 1000 个,并且保证这 1000 个数字不重复,然后取出相应的元素即可。

但是对于问题 2 就不一样了,我们事先不知道数据的规模有多大,虽然可以先对数据进行一次遍历,计算出数据的数量,但这样在数据量很大时可能会很浪费时间。

这时就轮到蓄水池抽样算法出场了,它能够在只遍历一次数据的情况下,随机抽取出指定数量的不重复数据。

阅读全文 »

PriorityQueue 源码分析

发表于 2019-08-30 | 分类于 Java

[toc]

前言

PriorityQueue,即优先队列,队列中的元素依据某种规则进行排序,包括自然排序和定制排序。优先队列不允许插入 null,如果要使用自然排序,那么存储的对象必须实现 Comparable 接口。

本文将分析优先队列的构造、入队、出队等操作,其中又涉及到了扩容、上浮调整、下沉调整等。

以下代码基于 JDK 1.8

阅读全文 »

TreeMap 源码分析

发表于 2019-08-20 | 分类于 Java

前言

本文所有代码基于 JDK 1.8

主要分析最基本的构造方法及增删改查操作,最后在此基础上分析一些其他的方法。

阅读全文 »

RecyclerView 源码分析(二):布局

发表于 2019-08-06 | 更新于 2019-08-07 | 分类于 Android

前言

本文将主要分析 RecyclerView 的布局过程(以第一次布局为例),由于 RecyclerView 的 measure 也与 layout 关系比较密切,所以接下来主要看 onMeasure 和 onLayout(亲测 onMeasure 和 onLayout 是在设置了 LayoutManager 和 Adapter 后才执行)。先看 onMeasure:

阅读全文 »

RecyclerView 源码分析(一):Recycler

发表于 2019-08-04 | 更新于 2019-08-06 | 分类于 Android

前言

RecyclerView 是一个好用又复杂的控件,其功能的高度解耦化,规范化的 ViewHolder 写法,以及对动画的友好支持,都是它与传统 ListView 的区别。

它有几大模块:

  • LayoutManager:控制 item 的布局
  • RecyclerView.Adapter:为 RecyclerView 提供数据
  • ItemDecoration:为 RecyclerView 添加分割线
  • ItemAnimator:控制 item 的动画
  • Recycler:负责回收和提供 View,和 RecyclerView 的复用机制相关

下面就从源码(API 28)角度分析 RecyclerView,RecyclerView 的源码很复杂,很难在一篇文章内讲完,所以打算分几篇来讲,本文是第一篇,将围绕 RecyclerView 的内部类 Recycler 展开分析:

阅读全文 »

ListView 源码分析

发表于 2019-07-31 | 分类于 Android

前言

虽然现在在展示数据的时候,更多的是使用 RecyclerView 而不是 ListView。但了解 ListView 还是很有必要的,通过了解 ListView,既可以帮助理解更加复杂的 RecyclerView,也可以更进一步地理解 ListView 和 RecyclerView 的区别。本文将基于 API28 分析 ListView 源码。

阅读全文 »
1234…9
FengZH

FengZH

阳光总在风雨后!坚持就是胜利!
82 日志
6 分类
33 标签
GitHub E-Mail
© 2019 – 2020 FengZH
|
0%