一行初始化ArrayList
1 | ArrayList<String> places = new ArrayList<String>(){{ |
使用maven创建带依赖的可执行jar
1 | <build> |
and run
mvn clean compile assembly:single
判断数组是否包含指定元素
1 | int[] a = [1,2,3,4,5]; |
Hail Hydra
1 | ArrayList<String> places = new ArrayList<String>(){{ |
1 | <build> |
and run
mvn clean compile assembly:single
1 | int[] a = [1,2,3,4,5]; |
线程
hashtable 是同步的 相反 hashmap并不是,
null
hashtable 不允许有nullkey 或value ,hashmap 运行有一个null key 和任意个null value
iterator
hashmap的子类linkedhashmap 迭代出的元素按插入顺序 可以有hashmap -> linkedhashmap 获取有序遍历
string 类型是不可变类型,当创建String 实例对象,如果另一个进程dump 内存,是没法清除创建的string (在gc介入之前),如果用char[] 可以显式wrap数据
减少了password 被attack ….
线程间通信有四种方式
A线程写volatile变量,随后B线程读这个volatile变量。
A线程写volatile变量,随后B线程用CAS更新这个volatile变量。
A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量。
A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量。
volatile变量的读/写和CAS可以实现线程之间的通信 => java concurrent包的基石
①.判断键值对数组 table[i] 是否为空或为 null,否则执行 resize() 进行扩容;
②.根据键值 key 计算 hash 值得到插入的数组索引i,如果 table[i]==null,直接新建节点添加,转向 ⑥,如果table[i] 不为空,转向 ③;
③.判断 table[i] 的首个元素是否和 key 一样,如果相同直接覆盖 value,否则转向 ④,这里的相同指的是 hashCode 以及 equals;
④.判断table[i] 是否为 treeNode,即 table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向 ⑤;
⑤.遍历 table[i],判断链表长度是否大于 8,大于 8 的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现 key 已经存在直接覆盖 value 即可;
⑥.插入成功后,判断实际存在的键值对数量 size 是否超多了最大容量 threshold,如果超过,进行扩容。
1 | public V put(K key, V value) { |
在task执行完处理异常
处理异常11
2
3
4
5
6
7
8
9
10
11
12
var task1 = Task.Run(() =>
{
Console.WriteLine(1223);
// throw new CustomException("task1 faulted.");
}).ContinueWith(t => {
Console.WriteLine("{0}: {1}",
t.Exception.InnerException.GetType().Name,
t.Exception.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
Thread.Sleep(500);
// 当发生异常时执行ContinueWith
在task执行结束 主线程内处理异常
处理异常21
2
3var tt = Task.Factory.StartNew(() => throw new ArgumentException());
while (!tt.IsCompleted){} // tt.Wait()
var excoCollection = tt.Exception?.InnerExceptions;
处理异常3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var task1 = Task.Run(() => { throw new CustomException("This exception is expected!"); });
while (!task1.IsCompleted) { }
if (task1.Status == TaskStatus.Faulted)
{
foreach (var e in task1.Exception.InnerExceptions)
{
// 处理自定义异常
if (e is CustomException)
{
Console.WriteLine(e.Message);
}
// 抛去其他异常
else{throw e;}
}
}
如果不想等到task结束
1 | --before |
1 | INSERT INTO dbo.Learn_CouponSendJob ( |
使用redis 保存文章信息
文章包括标题、作者、赞数等信息,在关系型数据库中很容易构建一张表来存储这些信息,在 Redis 中可以使用 HASH 来存储每种信息以及其对应的值的映射。
Redis 没有表的概念将同类型的数据存放在一起,而是使用命名空间的方式来实现这一功能。键名的前面部分存储命名空间,后面部分的内容存储 ID,通常使用 : 来进行分隔。例如下面的 HASH 的键名为 article:92617,其中 article 为命名空间,ID 为 92617。
Lettuce还支持使用Unix Domain Sockets
, 这对程序和Redis在同一机器上的情况来说,是一大福音。平时我们连接应用和数据库如Mysql,都是基于TCP/IP套接字的方式,如127.0.0.1:3306,达到进程与进程之间的通信,Redis也不例外。但使用UDS传输不需要经过网络协议栈,不需要打包拆包等操作,只是数据的拷贝过程,也不会出现丢包的情况,更不需要三次握手,因此有比TCP/IP更快的连接与执行速度。当然,仅限Redis进程和程序进程在同一主机上,而且仅适用于Unix及其衍生系统。
1 | private RedisURI createRedisURI() { |