0%

Basic Knowledge

https://www.baeldung.com/tag/java-concurrency/
https://www.baeldung.com/java-concurrent-locks

Overview of the java.util.concurrent

https://www.baeldung.com/java-util-concurrent

  • Executor
  • ExecutorService
  • ScheduledExecutorService
  • Future
  • CountDownLatch
  • CyclicBarrier
  • Semaphore
  • ThreadFactory
  • BlockingQueue
  • DelayQueue
  • Locks
  • Phaser

Semaphores in Java API

https://www.baeldung.com/java-semaphore

多线程知识的要点

参考自知乎这篇文章

ThreadPoolExecutor 四种处理策略

Read more »

Basic Knowledge

HotKey

按方向切换 pane:⌘+Option+方向键
切分屏幕:⌘+d 水平切分,⌘+Shift+d 垂直切分
智能查找,支持正则查找:⌘+f
自动查找历史命令: ⌘+;
ctrl+r 搜索历史命令,一直按可以切换更多的关联历史
查看剪贴板历史: cmd+shift+h

keymap

新建标签:command + t

关闭标签:command + w

切换标签:command + 数字 command + 左右方向键

切换全屏:command + enter

查找:command + f

垂直分屏:command + d

Read more »

leetcode图专题

广度优先搜索(Breadth-First-Search、BFS)

BFS与树的层次遍历有点类似,可以用于树或者图的遍历,其具体过程如下:

  • 访问起始顶点vertex;
  • 由顶点依次访问vertex的各个未被访问过的邻接顶点W1、W2、W3、…Wn;
  • 然后依次访问W1、W2、W3、… Wn;的所有未被访问过的邻接顶点;
  • 如果所在顶点没有未被访问过的领接顶点,则退回到上一层顶点;
  • 继续从第二步开始重复,以此类推。

如果仅仅是树的层次遍历来实现BFS的话,无法满足只访问未被访问过的这一约束,比如如下的图:

因此其实现原理需要额外的一个队列和一个辅助性的数组

BOILERPLATE:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private class Graph {
int val;
int index;
Graph[] neighbors;
int currentVisitNeighborIndex;// getFristNeighbor时为0, getNextNeighbor每次+1
}

private boolean[] visitedRecord = new boolean[MAX];
private Queue<Graph> queue;
private void BFS(Graph g){
peek(g); // 具体的访问代码逻辑
visitedRecord[g.index] = true; // 代表已经访问过
queue.push(g);
while(!queue.isEmpty()){
Graph temp = intqueue.pop();
for(Graph next = getFristNeighbor(temp); next != null ; next = getNextNeighbor(temp)){
if(!visitedRecord[next.index]){
peek(next);
visitedRecord[next.index] = true; // 代表已经访问过
queue.push(next);
}
}
}
}

private void mutilGraphVetex(Graph... gs){
// 如果存在多个顶点的图
gs.forEach(this::BFS);
}

深度优先搜索(Depth-First-Search、DFS)

Read more »

这篇文章会比较乱,因为我不想做太多系列细分,就是单纯地把我从eclipse转到idea的经过写出来而已,公司的项目一直采用的>是eclipse+maven+jboss的环境开发的,版本控制通过svn控制,这年代还用svn做控制确实有点更不上时代了,转的过程有点麻烦,但是最终我还是顺利用上idea,只是目前还不太习惯。想入坑idea很早之前就有这个想法了,eclipse我们公司一直都在用很古老的一个版本,隐藏的bug且不说,时不时的卡顿就够影响效率的了。

idea的subversion巨坑

转idea遇到第一个大难题就是svn版本控制的转换,我司采用svn+ssh协议,还是秘钥文件+密码验证的。以前使用的一直是入职就分给我的一个ssh的秘钥文件eclipse专用的,还附带了一个ppk后缀的秘钥文件,但是ppk那个一直没有派上用途。idea的svn用户认证可能存在bug,我和在elipse上做了类似的svn地址和用户+秘钥文件的配置之后一直无法脸上代码仓库,一直无限弹出让我输入密码。搞得我一度想放弃。
后来在查了下,ssh+svn协议原则上是先通过ssh登录svn服务端的机器,等于先打通一条数据流通的渠道,然后svn的交互依赖于这条ssh的通道上面。一直依赖我都是直接在eclipse做svn的操作,没有考虑太多,于是我好奇用我的svn账号密码+ppk秘钥文件去登录svn指向ip的服务器,果然成功了,既然能登上去,说明idea只是没有正确通过ssh登录到svn服务器上而已,通过搜索我才知道,原来的ppk文件是putty的专用格式秘钥文件,而openssh一般采用pem,于是刻不容缓,我又查了下ppk转pem的方法,然后顺利转换到pem文件,在idea的preferences->Version Control->Subversion->SSH上面的Private key指向到新的pem秘钥文件,then connect svn server success,注意其他关于svn的设置先还原,保持默认即可。

ssh+svn可以通过SSH tunnel的方式连接

之前一定用pem秘钥的方式,有次突然抽风不能用了,于是改用SSH tunnel的方式。Subversion->SSH,勾选Subversion config,SSH tunnel用默认的:

但是要先记住ssh的pem秘钥通过命令:

1
ssh-add -k /Users/zhanshifeng/Documents/ccssoftDocument/eclipse/zhanshifeng.pem

输入密码然后即可永久记住,测试是否可以登录成功:

1
ssh zhanshifeng@199.3.0.10

不复存在的workspace

Read more »

这篇笔记摘选自张满胜老师的《英语语法新思维中级教程第2版》,以及其他网上知识点收集,只是我自己的个人复习笔记,禁止转载,如有侵权,请联系我删除。
思维导图版本点击这里

定语从句概述

在英文中,被定语从句所修饰的对象叫作antecedent,英文中对这个词的解释是a word, phrase, clause, or sentence to which a pronoun refers,即表示“代词所指代的词、短语、从句或句子”,所以先行词可以是一个词、短语、分句或者独立的句子等。

形容词作定语与从句作定语比较

当要表达复杂的意思时,往往需要借助于定语从句来完成,即要用定语从句来修饰某个名词或名词短语。比如当我们说“我不喜欢懒人”,这时只需要用一个形容词lazy来作定语就可以。
I don’t like lazy people.
如果要表达稍微复杂一点的意思,比如说“我不喜欢不守信用的人”,这时,简单地用形容词作定语就无能为力了,就要借助于一个句子来修饰名词,用作名词的定语,对名词进行限制。
I don’t like people who never keep their word.

定语从句的两个重要概念:先行词和关系词

被定语从句所修饰的对象称为先行词。
重复指代先行词、起连接主句和从句的作用,并且在定语从句中充当一定成分的连接词称为关系词。
关系词有两个作用:

  • 代词的作用: 重复指代先行词并且在定语从句中充当一定成分。
  • 连接作用:即连接主句和从句。

先行词的结构特点

先行词是一个词

Read more »