tonglin0325的个人主页

Java继承

Java是单继承,只能继承一个父类,但是可以实现多个接口

继承的子类不能直接访问父类中的私有属性,只能通过get和set方法来访问

在继承的操作中,子类对象在实例化之前必须首先调用父类中的构造方法后再调用子类自己的构造方法。

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
class person{
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

class student extends person{
private String school;

public String getSchool() {
return school;
}

public void setSchool(String school) {
this.school = school;
}
}


public class extends_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
student person_1 = new student();
person_1.setName("张三");
person_1.setAge(10);
person_1.setSchool("涵三中");
System.out.println("姓名:"+person_1.getName()+"\n"+"年龄:"+person_1.getAge()+"\n"+"学校:"+person_1.getSchool());
}

}

 

方法的覆写

方法的覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时候必须考虑到权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限。

访问权限:private default public  private<default<public

如果在父类中使用public定义的方法,则子类的访问权限必须是public,否则无法编译

如果将父类的一个方法定义成private访问权限,在子类中将此方法声明位default访问权限,这不算是覆写

调用父类的属性时,直接使用super.XXX

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
class person{
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

//方法:print
void print(){ //定义一个默认访问权限的方法
System.out.println("Person---->void print()");
}
}

class student extends person{
private String school;

public String getSchool() {
return school;
}

public void setSchool(String school) {
this.school = school;
}

//方法:print
public void print(){ //覆写父类中的方法,扩大了权限
System.out.println("student---->void print()");
}

}


public class extends_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
student person_1 = new student();
person_1.setName("张三");
person_1.setAge(10);
person_1.setSchool("涵三中");
System.out.println("姓名:"+person_1.getName()+"\n"+"年龄:"+person_1.getAge()+"\n"+"学校:"+person_1.getSchool());
new student().print();
}

}

 

全文 >>

gson学习笔记

  1. 字符串转JsonObject
1
2
JsonObject origJson = new JsonParser().parse(str).getAsJsonObject();

  1. JsonObject转字符串
1
2
String str = outputJson.toString();

  1. List转JsonArray
1
2
JsonArray array = new Gson().toJsonTree(list).getAsJsonArray();

 

Thrift通信协议

Thrift的通信协议主要有下面几种:

TBinaryProtocol:二进制协议

TCompactProtocol:带压缩的二进制协议

TJSONProtocol:Json协议,序列化结果例如

1
2
{"2":{"i64":1},"3":{"str":"lintong"},"4":{"lst":["i64",3,1,2,3]}}

TSimpleJSONProtocol:simple Json协议,该协议为只写,即不可反序列化,序列化结果例如

1
2
{'name': 'XiaoMing', 'age': '20'}

TMultiplexedProtocol

TTupleProtocol

 

全文 >>

ElasticSearch学习笔记——配置参数

集群参数

1.cluster.name 集群名称

也可以在注释后在es的启动命令添加 -Ecluster.name=XXX,默认为elasticsearch

 

节点参数

1.node.name 节点名称

也可以在注释后在es的启动命令添加 -Enode.name=XXX

2.node.name 节点角色

有如下参数:

node.master: false

node.data: true

node.ingest: false

node.ml: true

xpack.ml.enabled: true

参考:笔记五十二:常见的集群部署方式

全文 >>

rocketmq学习笔记

1.介绍

官方文档:https://rocketmq.apache.org/docs/quickStart/01quickstart

2.部署rocketmq

1.docker部署rocketmq

1
docker pull apache/rocketmq:5.3.1

创建network

1
2
docker network create rocketmq

启动nameserver

1
2
docker run -d --name rmqnamesrv -p 9876:9876 --network rocketmq apache/rocketmq:5.3.1 sh mqnamesrv

broker配置

1
2
3
# Configure the broker's IP address
echo "brokerIP1=127.0.0.1" > broker.conf

启动proxy和broker

全文 >>

Java单例设计模式

单例模式(Singleton Pattern)是Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。 这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

1.没有使用单例:重复调用会创建多个对象

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
package java_basic;

class Singleton{
public Singleton(){
}

public void print(){
System.out.println("Hello Word");
}
}

public class singleton {

public static void main(String[] args) {
Singleton s1 = new Singleton();
Singleton s2 = new Singleton();
Singleton s3 = new Singleton();
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
s1.print();
s2.print();
s3.print();
}

}

 

2.饿汉式单例:(一定是安全的,只有一份对象)

1.构造器私有化

2.声明私有的静态属性,同时创建该对象

3.对外提供访问属性的静态方法,确保该对象存在。

全文 >>

RocksDB原理

RocksDB 是由 Facebook 基于 LevelDB 开发的一款提供键值存储与读写功能的 LSM-tree 架构引擎。而LevelDB是一个可持久化的KV数据库引擎,由Google传奇工程师Jeff Dean和Sanjay Ghemawat开发并开源

用户写入的键值对会先写入磁盘上的 WAL (Write Ahead Log),然后再写入内存中的跳表(SkipList,这部分结构又被称作 MemTable)。LSM-tree 引擎由于将用户的随机修改(插入)转化为了对 WAL 文件的顺序写,因此具有比 B 树类存储引擎更高的写吞吐。

内存中的数据达到一定阈值后,会刷到磁盘上生成 SST 文件 (Sorted String Table),SST 又分为多层(默认至多 6 层),每一层的数据达到一定阈值后会挑选一部分 SST 合并到下一层,每一层的数据是上一层的 10 倍(因此 90% 的数据存储在最后一层)。

RocksDB 允许用户创建多个 ColumnFamily ,这些 ColumnFamily 各自拥有独立的内存跳表以及 SST 文件,但是共享同一个 WAL 文件,这样的好处是可以根据应用特点为不同的 ColumnFamily 选择不同的配置,但是又没有增加对 WAL 的写次数。

TiKV使用RocksDB,参考

1
2
https://docs.pingcap.com/zh/tidb/stable/rocksdb-overview

  

SSTable

参考:浅析RocksDB的SSTable格式

python中args,*args,**kwargs的区别

args 表示参数是一个变量

*args 表示参数是一个tuple

**kwargs 表示参数是一个dict

 

比如

1
2
3
def function(arg,*args,**kwargs):
print(arg,args,kwargs)
function(6,7,8,9,a=1, b=2, c=3)

结果为 6 (7, 8, 9) {‘a’: 1, ‘b’: 2, ‘c’: 3}