0%

静态代理

结婚案例

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package ml.guest997;

public class StaticProxy {
public static void main(String[] args) {
Company company = new Company(new Person()); //静态代理对象的创建需要传入真实对象
company.work();
}
}

//结婚接口
interface Marry {
void work();
}

//人(真实对象)实现结婚接口
class Person implements Marry {

@Override
public void work() {
System.out.println("人结婚了");
}

}

//公司(代理对象)也实现结婚接口
class Company implements Marry {

//代理的真实对象
private Person person;

public Company(Person person) {
this.person = person;
}

@Override
public void work() {
//代理对象可以做很多真实对象做不了的事情,这样真实对象就能专注做自己的事。
before();
person.work();
after();
}

private void before() {
System.out.println("公司处理结婚前事务");
}

private void after() {
System.out.println("公司处理结婚后事务");
}

}
/*结果为
公司处理结婚前事务
人结婚了
公司处理结婚后事务
*/

可以看到代理对象的创建类似于线程创建时传了个实现 Runnable 接口的类对象。

Lambda 表达式

阅读全文 »

程序、进程和线程

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是 CPU 调度和执行的的单位。

普通方法调用和多线程启动

注意:很多多线程是模拟出来的,真正的多线程是指有多个 CPU(多核),如服务器。如果是模拟出来的多线程,即在一个 CPU 的情况下,在同一个时间点,CPU 只能执行一个代码,因为切换得很快,所以就有同时执行的错觉。

阅读全文 »

File

表示物理磁盘中的一个文件或者文件夹。

方法名说明
boolean CreateNewFile()创建一个空文件。
boolean mkdir()创建一个指定路径名的文件夹。
boolean delete()删除一个指定的文件或文件夹,文件夹必须为空才能被删除。
boolean exists()判断指定的文件或文件夹是否存在。
String getAbsolutePath()返回文件或文件夹的绝对路径
String getName()返回文件或文件夹的名称
String getParent()返回文件/文件夹所在路径
boolean isDirectory()判断是否为目录
boolean isFile()判断是否为文件
long length()返回文件的长度
File[] listFiles()返回目录中的所有内容,一个文件数组。如果指定的路径不是一个目录就返回 null。
boolean renameTo(File dest)重命名指定的文件。

文件操作

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ml.guest997;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class FileTest {
public static void main(String[] args) throws IOException {
System.out.println(File.separator); //名称分隔符
System.out.println(File.pathSeparator); //路径分隔符

File file = new File("../IO/test.md"); //创建文件对象
if (!file.exists()) {
file.createNewFile();
FileWriter fw = new FileWriter("test.md", true); //设置为追加内容
fw.write("https://guest997.ml - 一个在互联网下的小小 Coder");
fw.close();
}
System.out.println(file.length()); //返回的是文件字节数
System.out.println(new Date(file.lastModified()).toLocaleString()); //获取文件最后修改时间
System.out.println(file.isFile());
System.out.println(file.renameTo(new File("rename.md")));
//即使文件被重命名了,下面方法显示的文件名依旧是在创建文件对象时传入的文件名。
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getName());
System.out.println(file.getParent()); //只有在 new File 时,存在父路径,才能正常显示,否则为 null。
System.out.println(file.delete()); //重命名之后会使得删除文件失败
}
}
/*结果为
\
;
58
2022-3-12 20:14:32
true
true
..\IO\test.md
E:\DEMO\IO\..\IO\test.md
test.md
..\IO
false
*/
阅读全文 »

流(续)

字符流

字符流的父类(抽象类)

  • Reader(字符输入流)
  • Writer(字符输出流)
阅读全文 »

内存与存储设备之间传输数据的通道。数据借助流传输。

分类

  • 按方向分为:
    • 输入流:将存储设备中的内容读入到内存中。
    • 输出流:将内存中的内容写入到存储设备中。
  • 按单位分为:
    • 字节流:以字节为单位,可以读写所有数据。
    • 字符流:以字符为单位,只能读写文本数据。
  • 按功能分为:
    • 字节流:具有实际传输数据的读写功能。
    • 过滤流:在节点流的基础之上增强功能。

字节流

阅读全文 »

Collections 工具类

方法名说明
static void reverse(List<?> list)反转集合元素
static void shuffle(List<?> list)随机打乱集合元素的顺序
static void sort(Listlist)升序排序(元素类型需要实现 Comparable 接口)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ml.guest997;

import java.util.*;

public class CollectionsTest {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(6);
list.add(1);
list.add(8);
list.add(90);
list.add(11);
System.out.println(list);
Collections.sort(list); //排序,还能通过实现 Comparator 接口定制排序规则。
System.out.println(list);

System.out.println(Collections.binarySearch(list, 11)); //二分查找法寻找元素下标,前提是元素是排序过了的。

Collections.reverse(list); //反转集合元素
System.out.println(list);

Collections.shuffle(list); //随机打乱集合元素的顺序
System.out.println(list);

//集合转数组(toArray 方法)
System.out.println(Arrays.toString(list.toArray()));

//数组只能直接转 list。注意:基本类型数组转成 list 时需要修改为包装类,否则全部元素会合起来只有一个元素存在。
int[] i = {1, 2, 3, 4, 5, 6};
System.out.println(Arrays.asList(i).size());
String[] s = {"guest", "guest997", "Guest997"};
System.out.println(Arrays.asList(s));
}
}
/*结果为
[6, 1, 8, 90, 11]
[1, 6, 8, 11, 90]
3
[90, 11, 8, 6, 1]
[90, 8, 6, 1, 11]
[90, 8, 6, 1, 11]
1
[guest, guest997, Guest997]
*/