1 引子

今天开始写一点有质量的博客,比如攒几天发一篇。

最近最大的事迹就是期末考结束和推掉所有科研和竞赛。

抱着过了就好的心态,整个期末过程其实可以说是没什么压力的,虽然挂了一科。但是也导致一个经常恶意熬夜、爱打游戏、过度恶意水作业和过度恶意旷课的坏毛病。

不得不说,single的日子过的非常舒坦,得益于情绪起伏低,步步为营有更多的思考时间和空间,然后可以按照自己的节奏随意阅读、自研、娱乐、运动等。不过也有必要思考为什么处在人际关系情形下,人容易失去理智。

其他的事情,阅读毛选、我的奋斗等,上油管看看青年大学习,玩玩eu4、红警、pvz之类的;

今天一看炼丹云,欠费一百多,已经是崩了。不过没事后面不用了。然后感觉就是这个

2 规划

总体要完成的几个项目:

1.zhipinkkclub

2.timerme

3.bbs

4.留下想像空间的项目,可以是自研轮子或者自研游戏。暂不安排

建议划分为四个阶段,

七月上旬:短学期+恢复日常学习状态((看课如b站、淘宝、抖音等平台的)、力扣(3/day)、八股)+看书)

七月中旬:

回到家里,整理一下书房,先开始学CN,然后着手做BBS和TIMERME,注意可以有合理的任务分配。日常的学习状态保持,然后也保持阅读书籍。k8s。grpc。

七月下旬:

CN收尾、OS开始、日常、阅读、TIMERME收尾,zhipinkkclub完成。

八月上旬:

OS收尾、计组开始、日常(包括阅读)、bbs

八月中旬:

计组、日常、BBS+zhipinkk体系基本完善、认真收尾八股,开始投简历。

八月下旬:

短学期、日常 、八股、计组。

3 电子管->晶体管->与->或->加法器->ALU

电子管原理https://www.bilibili.com/video/BV1Pu411N74Q/?spm_id_from=333.337.search-card.all.click&vd_source=ef22f225254902b1a7226d19e89d6cde

在学习知识的时候,如果有不懂得地方,会呈现两种状态,一种是知道多看几遍可以搞懂的,一种是感觉比较难理解的,后者往往可能是缺了某块知识,这种时候跳过是最好的,回头再看就会很快,否则会浪费时间。

这个世界很神奇,为什么刚好有电这种东西存在呢?

与逻辑实现:

https://www.bilibili.com/video/BV1Ti4y1e71G/?spm_id_from=333.337.search-card.all.click&vd_source=ef22f225254902b1a7226d19e89d6cde

4 effective java:静态工厂方法替代构造方法

简单来说,对象的实例不用去new,而是自定义的创建对象函数,然后注意这玩意是静态的,静态的代表不需要对象实例就可以被调用。而构造函数将会被私有化。优点是意图明确,然后内存的控制更灵活。缺点在于难在API文档中标识出来构造应该通过静态工厂方法。

public class Vehicle {
private String type;

// 私有构造函数,防止外部直接使用new来创建对象
private Vehicle(String type) {
this.type = type;
}

// 静态工厂方法,提供了更明确的命名
public static Vehicle createCar() {
return new Vehicle("Car");
}

public static Vehicle createBike() {
return new Vehicle("Bike");
}

// Getter方法
public String getType() {
return type;
}
}

public class Main {
public static void main(String[] args) {
// 使用静态工厂方法创建对象
Vehicle car = Vehicle.createCar();
Vehicle bike = Vehicle.createBike();

System.out.println(car.getType()); // 输出:Car
System.out.println(bike.getType()); // 输出:Bike
}
}

5 effective java:构造器替代多参数构造函数

image-20240711012617675

如图展示一个构造器,也就是常说的builder。

首先明确概念抽象类:不能被实例化的类。

抽象方法:没有方法体的方法。

然后如果添加一些枚举可以让代码可读性更高:

image-20240711020315176

6 effective java: Singleton的优化

Singleton:单例模式,即只有一个实例。

私有构造器:确保只实例化一次,但是一开始就全局实例化,可能出现没有用也有实例的情况

image-20240711102704908

枚举单例:枚举机制可以防止被多次实例化。

image-20240711102811875

7 EJ:私有构造器防止类被实例化

私有的构造函数并且抛异常,很好杜绝一个类似于枚举类型的类被实例化。

image-20240711103524305

缺点是不能继承(子类化),因为没有构造函数,子类必须调用超类构造器。

image-20240711103708618

8 了解依赖注入与JAVA8的Supplier接口

示例:不使用依赖注入

interface MessageService {
void sendMessage(String message, String recipient);
}

class EmailService implements MessageService {
public void sendMessage(String message, String recipient) {
System.out.println("Sending an email to " + recipient + ": " + message);
}
}

class Application {
private EmailService emailService; // 直接依赖具体实现

public Application() {
this.emailService = new EmailService(); // 实例化具体实现
}

public void processMessages(String message, String recipient) {
emailService.sendMessage(message, recipient);
}
}

public class Main {
public static void main(String[] args) {
Application app = new Application();
app.processMessages("Hello, World!", "user@example.com");
}
}

示例:使用依赖注入

其他不变

class Application {
private MessageService messageService; // 依赖抽象接口,而不是具体实现

public Application(MessageService service) { // 通过构造函数注入依赖
this.messageService = service;
}

public void processMessages(String message, String recipient) {
messageService.sendMessage(message, recipient);
}
}
public class Main {
public static void main(String[] args) {
MessageService service = new EmailService(); // 创建依赖对象
Application app = new Application(service); // 注入依赖
app.processMessages("Hello, Dependency Injection", "user@example.com");
}
}

对比分析

主要区别在于,一个是依赖接口,一个是依赖具体实现类。显然前者灵活性更好。

Supplier接口的定义

Supplier<T> 接口定义非常简单,它包含一个没有输入参数的方法 get(),该方法返回一个泛型 T 类型的结果。这里的 T 是输出类型,由实现此接口的类来指定。

@FunctionalInterface
public interface Supplier<T> {
T get();
}

用途

Supplier 接口通常用于延迟生成或计算值,或者在需要生成一个新对象而不需要额外信息时使用。例如,它可以用于提供默认值或者构造复杂对象。

示例

下面是一个使用 Supplier 接口的简单示例:

import java.util.function.Supplier;

public class SupplierExample {
public static void main(String[] args) {
// 使用Lambda表达式创建Supplier实例
Supplier<String> stringSupplier = () -> "Hello, World!";

// 调用get()方法获取值
System.out.println(stringSupplier.get()); // 输出:Hello, World!

// 创建一个更复杂的对象
Supplier<LocalDateTime> timeSupplier = () -> LocalDateTime.now();
System.out.println("Current time: " + timeSupplier.get()); // 输出当前时间
}
}

使用 Supplier 接口来改造工厂模式是一个现代化和更具灵活性的方法。这种方式允许我们使用 Java 8 引入的函数式编程特性,让代码更加简洁和可扩展。下面我将示范如何使用 Supplier 接口来改造之前的数据库连接工厂。

能否展现一个资源工厂传递给构造器的设计方法?

在设计模式中,资源工厂的概念通常与依赖注入(DI)结合使用,特别是在构造器注入的情况下。这种模式不仅有助于降低组件之间的耦合,还提高了代码的灵活性和可测试性。

假设我们有一个应用程序需要连接到多种数据库(如MySQL、PostgreSQL等),我们可以创建一个数据库连接工厂,这个工厂根据配置或需求动态创建相应的数据库连接。

步骤 1: 定义数据库连接接口

首先,我们定义一个数据库连接的接口,这个接口规定了所有数据库连接必须实现的方法。

public interface DatabaseConnection {
void connect();
void disconnect();
}

步骤 2: 实现具体的数据库连接类

接下来,我们实现几个具体的数据库连接类,每个类对应一种数据库。

public class MySQLConnection implements DatabaseConnection {
public void connect() {
System.out.println("Connecting to MySQL database.");
}

public void disconnect() {
System.out.println("Disconnecting from MySQL database.");
}
}

public class PostgreSQLConnection implements DatabaseConnection {
public void connect() {
System.out.println("Connecting to PostgreSQL database.");
}

public void disconnect() {
System.out.println("Disconnecting from PostgreSQL database.");
}
}

在Java中,Supplier 是一个功能接口(functional interface),主要用于提供一个数据值,而不接受任何参数。它属于 java.util.function 包,这个包包含了多种功能接口,用于支持Java的Lambda表达式和函数式编程。

步骤 3: 使用 Supplier 改造工厂

这次我们使用 Supplier<DatabaseConnection> 来改造工厂方法,使其返回一个 Supplier 实例,而不是直接返回一个数据库连接对象。这种方式让我们能够延迟连接的创建直到真正需要时。

import java.util.Map;
import java.util.HashMap;
import java.util.function.Supplier;

public class DatabaseConnectionFactory {
private static final Map<String, Supplier<DatabaseConnection>> connectionSuppliers = new HashMap<>();

static {
connectionSuppliers.put("MySQL", MySQLConnection::new);
connectionSuppliers.put("PostgreSQL", PostgreSQLConnection::new);
}

public static Supplier<DatabaseConnection> getConnectionSupplier(String type) {
Supplier<DatabaseConnection> supplier = connectionSuppliers.get(type);
if (supplier == null) {
throw new IllegalArgumentException("No such database type supported.");
}
return supplier;
}
}

步骤 4: 使用构造器注入 Supplier

现在我们修改 DataManager 类,使其接收一个 Supplier<DatabaseConnection>。这允许 DataManager 控制连接的实际创建时机。

public class DataManager {
private Supplier<DatabaseConnection> connectionSupplier;

public DataManager(Supplier<DatabaseConnection> connectionSupplier) {
this.connectionSupplier = connectionSupplier;
}

public void processData() {
DatabaseConnection connection = connectionSupplier.get(); // 实际创建连接
connection.connect();
System.out.println("Processing data...");
connection.disconnect();
}
}

步骤 5: 在应用中使用

我们使用改造后的工厂来获取连接的 Supplier 并传递给 DataManager

public class Main {
public static void main(String[] args) {
Supplier<DatabaseConnection> connectionSupplier = DatabaseConnectionFactory.getConnectionSupplier("MySQL");
DataManager manager = new DataManager(connectionSupplier);
manager.processData();
}
}

工厂类似于一种分发装置。

9

高手总是会把一个非常有讲究的事情描述的非常轻松,首先一点是他的精神状态确实比较轻松,其次他们懒得给对他们毫无利益的外人总结自己独门的解决方案。比如高绩点他会说期末学个两周,平时代签就可以。殊不知平时的精神状态、作息、预备知识等都是非常重要的因素,也不能保证他之前没有在其他地方学过。因此我们如果想要复刻高手的逻辑,就要复刻他们隐藏的一些点,而不是只见表面。比如说,可以平日里非常努力地做其他事情而不是摆烂,然后作息要正常,心态要好,同时可以超前学习某些科目,然后隔一段时间反复速成,也会得到很好的巩固。

10

有的时候会发现,有事情的时候感觉来不及学了,就想开摆,而开摆的时候又感觉没那么明显来不及学的感觉。不过这只是一种自我欺骗,面对焦虑,不应该去逃避,而是直接硬钢,让自己行动起来,而不是逃走。因为前者对自己长期收益更大,而后者“得一夕安寝,而秦兵又至矣”。

11

知识都是前人写好的,他们往往不是什么世界的真理,而是认为的规定,我们要做的就是学别人的规定罢了。

12

有时候发现自己没有那么强的欲望和目标感,这是因为对太多东西祛魅了,往往就丧失了向上的动力。适当赋魅其实是必要的,如果一些奖、成绩、论文我们看做是垃圾,但是一些重要的岗位、考到好的院校却可以当做我们宏伟的目标。没有志向的人终究会堕落。

祛魅这个东西再说,比如游戏为什么上瘾,因为游戏打得好,排名高,会让人觉得有面子,也会得到一些崇拜。但是大了之后,就发现没人崇拜了,也没人在意这个游戏,它的含金量失去了,只是自娱自乐,因此也就没意思了。现仅存的就是一些虚幻的征服感。人越趋向于理解事物的本质,就越会痛失幻想的能力。突然发现中学时期我所诟病的梦想家其实是一个伟大的能力,而我却逐渐遗失了它,包括遗失了对恋爱之流的幻想。情绪稳定也许是有好处,但是随之带来的是也没有特别令人兴奋的时刻。幻想不得不说是一项伟大的能力,还有那种不服输的野性也是。所谓的情绪稳定,往坏了说就是丧失了征服的野性,也失去了对梦想的渴望,未老先衰,不是好事。贪婪的人才能得到更多,这是人性的本质,但是隐藏是一门艺术。我要推翻一直以来“真实”的信念,因为我觉得真实才能轻松不容易露馅,但现在看来,去弄虚作假而瞒天过海,才是更高深的一门学问。当然,这里的弄虚作假我不希望是学术、技术等,而是人际关系方面。在前者方面上,我还是认为以“真”为本才好,毕竟杀人造了把假刀,也杀不死人。但是在人际上,却可以靠撒谎实现借刀杀人。这就是物理层面和精神层面的差距。

13

是什么人能够脱颖而出?明知道需要自律但是真正能自律的人。对一些事情真正热爱并且去做的人。前人归结作几个词:致良知、知行合一。

有的知识,一下子理解不了,不需要死磕,因为自己的储备还没有到那个level,只需要耐心地继续储备,回头顺其自然地就解决了。如果患得患失,或者对无生命事物动怒,无异于原始人。

让自己变成被迫学习的人,然后完成一些任务之后就可以获得一些奖励,这样会很欢乐。把自己当成一个小孩,然后用理性人建立奖励机制,这应该是一种不错的学习办法。

人就应该建立多重人格,不然又怎么去了解世界上那么多性格?每多一种人格就多一种对他人的了解。而不同的人格还可以帮助自己认识自我,找到一个适合于自己当下的人格,然后逐渐让他们相互借鉴融合。

14

感觉学习工作无聊的时候,就让自己发呆放空,而不是找事情消遣。放空会让自己变得更无聊,从而会觉得学习工作稍微会有趣一点。这是利用人性本来的规律。

15

我必考研,干嘛不考?考的好处:

1.考上了有光环title,更有自尊,更好找工作

2.有更好的平台资源和人脉

3.去大城市见识一下

4.有更多时间去学习,去修炼,去深造,有更多未知的可能,更能和先进技术接轨

5.好找对象,不仅是院校上的,还有title上的

不考的好处:

1.早点工作,提早步入成年人生活

2.大学期间腾出更多时间投入开发和自己的项目

玛德总的来说肯定长远看是考研好,对不。冲。

16

滞后性,不仅是审美、大众追求,还有价值观的对齐。

比如学历贬值,但是仍然有它很有用的刻板印象;

海归、好工作、好专业、发论文;

门槛一旦降低,那么价值就降低。

17

天才都不适合婚姻。

哲学和文学到底是不是一体两面呢?他们好像是交织在一起的。

我现在在从绩优主义向幸福注意、犬儒主义和荒诞主义转变。

人不应该对着自己的弱点期待被怜悯和安慰,而是去除这些弱点。

人类的进步靠的不是合群的人,而是逆天的人。

18

今天刷20道力扣。总结一些细节小点,作为备忘录

1.异或公式

image-20240722180750670

image-20240722180800750

2.StringBuilder是一个final类,因此不能通过继承匿名内部类来扩展它。