Skip to content

Commit 3e4ba04

Browse files
committed
update note
1 parent 0cc8872 commit 3e4ba04

7 files changed

Lines changed: 178 additions & 43 deletions

File tree

Java/Java 编程思想.md

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
- [日志](#%E6%97%A5%E5%BF%97)
6262
- [logback](#logback)
6363
- [字符串](#%E5%AD%97%E7%AC%A6%E4%B8%B2)
64-
- ["+"和 StringBuilder](#%E5%92%8C-stringbuilder)
6564
- [格式化输出](#%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BE%93%E5%87%BA)
6665
- [printf() 和 format()](#printf-%E5%92%8C-format)
6766
- [Formatter](#formatter)
@@ -1519,7 +1518,7 @@ assert x >= 0 : x;//将x的值传递给AssertError异常
15191518

15201519
#### 启用和禁用断言
15211520

1522-
默认情况下,断言被禁用,可以在运行程序时用`-eableassertions``-ea`选项启用。
1521+
默认情况下,断言被禁用,可以在运行程序时用`-eableassertions``-ea`选项启用。idea --> run configuration --> vm options 添加 `-ea` 开启断言。
15231522

15241523
`java -enableassertions MyApp`
15251524

@@ -1583,10 +1582,6 @@ Layout用于自定义日志输出格式。
15831582

15841583
String 对象是不可变的。String 类中会修改 String 的方法都会创建一个全新的 String 对象。
15851584

1586-
### "+"和 StringBuilder
1587-
1588-
操作符"+"连接字符串会产生许多中间对象,使用 StringBuilder 的 append()方法拼接字符串会更加高效。
1589-
15901585
### 格式化输出
15911586

15921587
#### printf() 和 format()
@@ -2468,7 +2463,7 @@ list.add(new Fruit())不能添加,是因为容器内存放的是Apple的**所
24682463

24692464
数组的 length 是数组的大小,不是实际保存的元素个数。
24702465

2471-
基本类型数组不显式初始化,会被自动初始化成初值。对象数组则会被初始化成 null。
2466+
如果不显式初始化,基本类型数组会被自动初始化成初值,对象数组则会被初始化成 null。
24722467

24732468
### 复制数组
24742469

@@ -2494,7 +2489,7 @@ dest = [47, 47, 47, 47, 47, 47, 47, 99, 99, 99]
24942489
*/
24952490
```
24962491

2497-
基本类型数组和对象数组都可以复制。复5制对象只是复制对象引用,即浅复制。System.arraycopy() 不会执行自动包装和自动拆包,两个数组需要具有相同的数据类型。
2492+
基本类型数组和对象数组都可以复制。复制对象只是复制对象引用,即浅复制。System.arraycopy() 不会执行自动包装和自动拆包,两个数组需要具有相同的数据类型。
24982493

24992494
### Arrays 工具
25002495

@@ -3062,7 +3057,7 @@ public class Synchronization {
30623057

30633058
#### 快速报错机制
30643059

3065-
fast-fail 是 Java 容器的一种保护机制。当多个线程对同一个集合进行操作时,就有可能会产生 fast-fail 事件。例如:当线程a正通过 iterator 遍历集合时,另一个线程b修改了集合的内容(modCount 不等于expectedModCount),那么线程a访问集合的时候,就会抛出 ConcurrentModificationException,产生 fast-fail 事件。
3060+
fast-fail 是 Java 容器的一种保护机制。当多个线程对同一个集合进行操作时,就有可能会产生 fast-fail 事件。例如:当线程a正通过 iterator 遍历集合时,另一个线程b修改了集合的内容(modCount 不等于expectedModCount),那么线程a在遍历的时候会抛出 ConcurrentModificationException,产生 fast-fail 事件。
30663061

30673062
```java
30683063
public class FastFail {
@@ -3084,15 +3079,15 @@ public class FastFail {
30843079
**多线程并发修改容器的方法:**
30853080

30863081
- 使用`Colletions.synchronizedList()`方法或在修改集合内容的地方加上 synchronized。这样的话,增删集合内容的同步锁会阻塞遍历操作,影响性能。
3087-
- 使用 CopyOnWriteArrayList 来替换 ArrayList。在对 CopyOnWriteArrayList 进行修改操作的时候,会拷贝一个新的数组,对新的数组进行操作,操作完成后再把引用移到新的数组
3082+
- 使用 CopyOnWriteArrayList 来替换 ArrayList。在对 CopyOnWriteArrayList 进行修改操作的时候,会拷贝一个新的集合,对新的集合进行操作,操作完成后再把引用指向新的集合
30883083

30893084
### Java 1.0/1.1 的容器
30903085

30913086
#### BitSet
30923087

30933088
参考自:[JAVA中BitSet使用](https://blog.csdn.net/xv1356027897/article/details/79518647)
30943089

3095-
位图,数据的存在性可以使用bit位上的1或0来表示,一个long型数字占用64位空间,那么一个long型数字(4个字节)就可以保存64个数字的“存在性”状态(无碰撞冲突时,即true、false状态)。BitSet内部是一个long[]数组,数组的大小由 BitSet 接收的最大数字决定,这个数组将数字分段表示[0,63],[64,127],[128,191]...。即long[0]用来存储[0,63]这个范围的数字的“存在性”,long[1]用来存储[64,127],依次递推。
3090+
位图,数据的存在性可以使用bit位上的1或0来表示,一个long型数字占用64位空间,那么一个long型数字就可以保存64个数字的“存在性”状态(true or false)。BitSet内部是一个long[]数组,数组的大小由 BitSet 接收的最大数字决定,这个数组将数字分段表示[0,63],[64,127],[128,191]...。即long[0]用来存储[0,63]这个范围的数字的“存在性”,long[1]用来存储[64,127],依次递推。
30963091

30973092
```java
30983093
public class BitSetDemo {
@@ -3151,11 +3146,13 @@ InputStream 用来表示那些从不同数据源产生输入的类。这些数
31513146

31523147
InputStream 类有一个抽象方法:`abstract int read()`,这个方法将读入并返回一个字节,或者在遇到输入源结尾时返回-1。
31533148

3154-
OutputStream 决定了输出所要去的目标:字节数组、文件或管道。OutputStream 的 `abstract void write(int b)` 可以向某个输出位置写出一个字节。read() 和 write() 方法在执行时都将阻塞,至少字节被读入或者写出。
3149+
OutputStream 决定了输出所要去的目标:字节数组、文件或管道。OutputStream 的 `abstract void write(int b)` 可以向某个输出位置写出一个字节。
3150+
3151+
read() 和 write() 方法在执行时都将阻塞,等待数据被读入或者写出。
31553152

31563153
#### Reader 和 Writer
31573154

3158-
设计 Reader 和 Writer 继承结构主要是为了国际化。老的 I/O 流继承层级结构只支持8位字节流,并且不能很好的处理16位的 Unicode 字符(两个字节)。由于 Unicode 用于字符国际化(Java 本身的 char 也是16位的 Unicode),所以添加 Reader 和 Writer 继承层次结构就是为了在所有的 I/O 操作中都支持 Unicode。另外,新类库的设计使得它的操作比旧类库更快
3155+
字符流是由通过字节流转换得到的,转化过程耗时,而且容易出现乱码问题。I/O 流提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好
31593156

31603157
```java
31613158
abstract int read();

Java/Java基础.md

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
- [Exception](#exception)
1818
- [ThreadLocal](#threadlocal)
1919
- [StringBuilder和StringBuffer](#stringbuilder%E5%92%8Cstringbuffer)
20+
- ["+"和 StringBuilder](#%E5%92%8C-stringbuilder)
2021
- [线程安全类](#%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%B1%BB)
2122
- [object方法](#object%E6%96%B9%E6%B3%95)
2223
- [为什么重写equals()要重写hashcode()](#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%87%8D%E5%86%99equals%E8%A6%81%E9%87%8D%E5%86%99hashcode)
@@ -40,6 +41,8 @@
4041
- [Arrays.sort()](#arrayssort)
4142
- [归并与快速排序](#%E5%BD%92%E5%B9%B6%E4%B8%8E%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F)
4243
- [IO流](#io%E6%B5%81)
44+
- [InputStream 和 OutputStream](#inputstream-%E5%92%8C-outputstream)
45+
- [Reader 和 Writer](#reader-%E5%92%8C-writer)
4346
- [同步异步](#%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5)
4447
- [阻塞非阻塞](#%E9%98%BB%E5%A1%9E%E9%9D%9E%E9%98%BB%E5%A1%9E)
4548
- [BIO](#bio)
@@ -210,6 +213,12 @@ threadLocals的类型ThreadLocalMap的键值为ThreadLocal对象,因为每个
210213
- StringBuilder和StringBuffer的对象是字符串变量,对变量进行操作就是直接对该对象进行修改,所以速度要比String快很多。
211214
- 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的,StringBuffer中很多方法带有synchronized关键字,可以保证线程安全。
212215

216+
### "+"和 StringBuilder
217+
218+
操作符"+"连接字符串会先创建String对象,再把拼接后的内容赋值给新的对象,在频繁修改的情况下会常量大量的对象,性能较差。
219+
220+
StringBuilder 在拼接时不是使用 String 存储,而是放到一个char数组(默认大小为16),不需要额外创建对象,拼接效率较高。
221+
213222

214223

215224
## 线程安全类
@@ -465,6 +474,27 @@ Collections.sort方法底层就是调用的Arrays.sort方法。
465474

466475
## IO流
467476

477+
继承自 InputStream 或 Reader 的类都具有 read() 方法,用于读取单个字节或者字节数组;继承自 OutputStream 或 Writer 的类都含有 write() 方法,用于写单个字节或字节数组。
478+
479+
### InputStream 和 OutputStream
480+
481+
InputStream 用来表示那些从不同数据源产生输入的类。这些数据源包括:1.字节数组;2.String 对象;3.文件;4.管道;5.一个由其他种类的流组成的序列。
482+
483+
InputStream 类有一个抽象方法:`abstract int read()`,这个方法将读入并返回一个字节,或者在遇到输入源结尾时返回-1。
484+
485+
OutputStream 决定了输出所要去的目标:字节数组、文件或管道。OutputStream 的 `abstract void write(int b)` 可以向某个输出位置写出一个字节。
486+
487+
read() 和 write() 方法在执行时都将阻塞,等待数据被读入或者写出。
488+
489+
### Reader 和 Writer
490+
491+
字符流是由通过字节流转换得到的,转化过程耗时,而且容易出现乱码问题。I/O 流提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
492+
493+
```java
494+
abstract int read();
495+
abstract void write(char c);
496+
```
497+
468498
### 同步异步
469499

470500
同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。
@@ -487,11 +517,17 @@ Collections.sort方法底层就是调用的Arrays.sort方法。
487517

488518
NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。
489519

490-
Buffer:在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。
520+
NIO与IO区别:
521+
522+
- IO是面向流的,NIO是面向缓冲区的;
523+
- IO流是阻塞的,NIO流是不阻塞的;
524+
- NIO有选择器,而IO没有。
525+
526+
Buffer:Buffer用于和Channel交互。从Channel中读取数据到Buffer里,从Buffer把数据写入到Channel。
491527

492-
Channel:NIO 通过Channel(通道) 进行读写。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。
528+
Channel:NIO 通过Channel(通道) 进行读写。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。
493529

494-
Selector:选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的
530+
Selector:使用更少的线程来就可以来处理通道了,相比使用多个线程,避免了线程上下文切换带来的开销
495531

496532
### AIO
497533

Java/集合.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
- [treemap底层](#treemap%E5%BA%95%E5%B1%82)
1313
- [list/hashset/hashmap排序](#listhashsethashmap%E6%8E%92%E5%BA%8F)
1414
- [Set](#set)
15+
- [Iterator](#iterator)
16+
- [ListIterator](#listiterator)
1517

1618
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
1719

@@ -130,3 +132,45 @@ https://blog.csdn.net/whuxiaoqiang/article/details/9371923
130132

131133

132134

135+
## Iterator
136+
137+
Iterator模式用同一种逻辑来遍历集合。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
138+
139+
主要有三个方法:hasNext()、next()和remove()。
140+
141+
```java
142+
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
143+
```
144+
145+
### ListIterator
146+
147+
Iterator的增强版,增加了以下功能:
148+
149+
1. ListIterator有add()方法,可以向List中添加对象。
150+
151+
2. hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。
152+
3. nextIndex()和previousIndex()定位索引位置。
153+
4. set() 实现对象的修改。
154+
155+
```java
156+
public interface ListIterator<E> extends Iterator<E> {
157+
boolean hasNext();
158+
159+
E next();
160+
161+
boolean hasPrevious();
162+
163+
E previous();
164+
165+
int nextIndex();
166+
167+
int previousIndex();
168+
169+
void remove();
170+
171+
void set(E var1);
172+
173+
void add(E var1);
174+
}
175+
```
176+

img/bean-life-cycle.jpg

28.7 KB
Loading

其他/linux.md

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,23 @@ man得到的内容比用 help 更多更详细,而且man没有内建与外部
4040

4141
### 查看文件
4242

43+
列出文件:`ls -l` 可以简写为 `ll`(别名,ubantu下不支持)
44+
4345
cat:输出文件所有内容
46+
4447
tail -10 demo.txt:显示最后10行
48+
49+
tail -f -n 100 demo.txt:实时查看文件,显示最后100行
50+
4551
head -10 demo.txt
52+
4653
head -20 nohup.out | tail -10:第11行到20行
47-
tail -f demo.txt:实时查看文件
4854

49-
列出文件:ls -l
55+
less:分页显示工具,可以前后翻页查看文件。pagedown下一页,pageup上一页。
56+
57+
```bash
58+
less demo.log
59+
```
5060

5161
### 文件操作
5262

@@ -130,11 +140,9 @@ redis-cli shutdown #关闭redis服务
130140

131141

132142

133-
134-
135143
## 进程端口
136144

137-
查看进程命令:`ps -ef | grep nginx`
145+
查看进程命令:`ps -ef | grep nginx` -e显示所有进程,-f显示进程对应的命令行
138146
查看端口信息:`netstat -tunlp |grep 8000`
139147

140148
正常结束进程:`kill -15 pid` 默认-15(SIGTERM)可以省略
@@ -185,10 +193,15 @@ $ echo '1234\nabcd' | grep '[[:alpha:]]'
185193

186194
## sed
187195

196+
处理、编辑文本文件。
197+
188198
```bash
189-
# 打印2-5行
199+
# 打印2-5行 nl输出文件内容带上行号
190200
$ nl passwd | sed -n '2,5p'
191201

192-
# 打印奇数行
193-
$ nl passwd | sed -n '1~2p'
202+
# 删除2-5行
203+
nl /etc/passwd | sed '2,5d'
204+
205+
# 删除第三到最后一行
206+
nl /etc/passwd | sed '3,$d'
194207
```

其他/设计模式.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
- [简单工厂模式](#%E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F)
1818
- [工厂方法模式](#%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F)
1919
- [抽象工厂模式](#%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F)
20+
- [模板模式](#%E6%A8%A1%E6%9D%BF%E6%A8%A1%E5%BC%8F)
2021

2122
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
2223

@@ -292,4 +293,30 @@ reader.read();
292293
### 抽象工厂模式
293294

294295
多了一层抽象,减少了工厂的数量(HpMouseFactory和HpKeyboFactory合并为HpFactory)。
295-
![在这里插入图片描述](https://img-blog.csdn.net/2018092509574846?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1R5c29uMDMxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
296+
![在这里插入图片描述](https://img-blog.csdn.net/2018092509574846?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1R5c29uMDMxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
297+
298+
299+
300+
## 模板模式
301+
302+
在抽象类中定义一个操作中算法的骨架,子类按照需要重写方法实现。
303+
304+
```java
305+
public abstract class DodishTemplate {
306+
//模板
307+
protected void dodish(){
308+
this.preparation();
309+
this.doing();
310+
this.carriedDishes();
311+
}
312+
313+
public abstract void preparation();
314+
315+
public abstract void doing();
316+
317+
public abstract void carriedDishes ();
318+
}
319+
```
320+
321+
322+

0 commit comments

Comments
 (0)