FengZH的博客

  • 首页

  • 标签

  • 分类

  • 归档

栈在算法上的应用

发表于 2019-04-29 | 更新于 2019-05-13 | 分类于 算法

具体案例

  • 利用栈后进先出的特点,可以解决一些特定的算法问题

有效括号问题(LeetCode第20题)

问题描述

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。

阅读全文 »

一些java要注意的基础知识

发表于 2019-04-28 | 更新于 2019-06-03 | 分类于 Java

标识符命名规则

  • 可以由字母、数字、_、$组成,其中数字不能放在开头
  • 不能是关键字、保留字和特殊的直接量(null,true和false)
  • 不能包含空格
  • 只能包含$,不能包含@、#等特殊字符
阅读全文 »

集合(2)

发表于 2019-04-26 | 分类于 Java

List

  • List判断两个对象是否相等的标志是只要通过equals方法返回true即可。
1
2
3
4
5
6
7
List<String> list = new ArrayList<>();
list.add("first");
list.add("second");
System.out.println(list); //[first, second]
String s = "first";
list.remove(s);
System.out.println(list); //[second]
阅读全文 »

源码分析:Activity的启动过程(2)

发表于 2019-04-26 | 更新于 2019-05-05 | 分类于 Android

ActivityStackSupervisor#realStartActivityLocked(以下源码都是基于API25)

realStartActivityLocked方法中有一段非常重要的代码

1
2
3
4
5
6
7
8
9
10
11
12
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
boolean andResume, boolean checkConfig) throws RemoteException {
//...

app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);

//...
}

阅读全文 »

一些排序算法的实现(C语言)

发表于 2019-04-25 | 更新于 2019-05-13 | 分类于 算法

实现

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
* 冒泡排序
*/
void BubbleSort(int a[], int n) {
int i, j;
for (i = 0; i < n-1; i++) { //需要进行n-1轮冒泡
for (j = 0; j < n-i-1; j++) { //每一轮的比较
if (a[j] > a[j+1]) {
swap(a, j, j+1);
}
}
}
}
阅读全文 »

源码分析:Activity的启动过程(1)

发表于 2019-04-24 | 更新于 2019-04-26 | 分类于 Android

Activity#startActivityForResult

我们从Activity的startActivity方法开始分析,该方法有几种重载方式,但最终都会调用startActivityForResult方法,该方法实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) { //只需关注这部分代码
//...

Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options); //先看Instrumentation的execStartActivity方法(exec是execute的缩写,意为执行)

//...
} else {
//...
}
}

我们看下Instrumentation的execStartActivity方法

阅读全文 »

线程笔记(4)

发表于 2019-04-23 | 更新于 2019-04-26 | 分类于 Java

线程池

  • 简介:线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象或者Callable对象传给线程池,线程池就会启动一个线程来执行它们的run或call方法,当run或call方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待下一个Runnable或Callable对象。
  • 作用:使用线程池可以有效地控制系统中并发线程的数量,当系统中包含大量并发线程时,会导致系统性能剧烈下降,甚至导致JVM崩溃,而线程池的最大线程数可以控制系统中的并发线程数不超过此数。
阅读全文 »

线程笔记(3)

发表于 2019-04-23 | 更新于 2019-04-26 | 分类于 Java

线程通信

传统的线程通信(wait、notify、notifyAll)

  • wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。
  • 这三个方法必须有同步监视器对象来调用,这可分为两种情况:
    • 对于使用synchronized修饰的同步方法,因为该类的实例this就是同步监视器,所以可以在同步方法中直接使用这三个方法。
    • 对于使用synchronized修饰的同步代码块,同步监视器就是synchronized后括号的对象,所以必须使用该对象调用这三个方法。
  • wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。调用wait方法的当前线程会释放对该同步监视器的锁定。
阅读全文 »

线程笔记(2)

发表于 2019-04-23 | 更新于 2019-04-26 | 分类于 Java

线程的生命周期

新建

  • 当程序new了一个线程后,该线程就处于新建状态。
  • 此时该线程仅仅由java虚拟机为其分配内存,并初始化其成员变量,并未表现出线程的动态特征,程序也不会执行其线程体。

就绪

  • 当线程对象调用其start方法后,该线程就处于就绪状态。
  • 此时只是表示该线程可以运行了,并未真正开始运行,至于该线程何时开始运行则取决于JVM里线程调度器的调度。
阅读全文 »

线程笔记(1)

发表于 2019-04-22 | 更新于 2019-04-26 | 分类于 Java

线程和进程

主要区别

根本区别:

  • 进程是是系统进行资源分配和调度的基本单位
  • 线程是进程中的一个实体,是被系统独立调度和分派的基本单位
阅读全文 »
1…789
FengZH

FengZH

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