SplitUsage

split的用法示例

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
public class Version {
/**
* 请根据语义化版本的要求 https://semver.org/lang/zh-CN/ ,比较两个"语义化版本"
*
* <p>传入两个形如x.y.z的字符串,比较两个语义化版本的大小。如果version1小于version2,返回-1;如果version1大于
* version2,返回1。如果二者相等,返回0。
*
* <p>注意,如果传入的字符串形如x,则其等价于x.0.0。 如果传入的字符串形如x.y,则其等价于x.y.0。
*
* @param version1 传入的版本字符串1,支持x/x.y/x.y.z,你可以假定传入的字符串一定是合法的语义化版本
* @param version2 传入的版本字符串2,支持x/x.y/x.y.z,你可以假定传入的字符串一定是合法的语义化版本
* @return -1/0/1 当version1 小于/等于/大于 version2时
*/
public static int compare(String version1, String version2) {
ArrayList<String> versionArr1 = new ArrayList<>(Arrays.asList(version1.split("\\.")));
ArrayList<String> versionArr2 = new ArrayList<>(Arrays.asList(version2.split("\\.")));

ArrayList<Integer> versionIntArr1 = new ArrayList<>();
ArrayList<Integer> versionIntArr2 = new ArrayList<>();

for (String v1 : versionArr1) {
versionIntArr1.add(Integer.parseInt(v1));
}
for (String v2 : versionArr2) {
versionIntArr2.add(Integer.parseInt(v2));
}

int length = Math.max(versionIntArr1.size(), versionIntArr2.size());

while (versionIntArr1.size() < length) {
versionIntArr1.add(0);
}

while (versionIntArr2.size()<length) {
versionIntArr2.add(0);
}

for (int i = 0; i < length; i++) {
if (versionIntArr1.get(i) < versionIntArr2.get(i)) {
return -1;
} else if (versionIntArr1.get(i) > versionIntArr2.get(i)) {
return 1;
}
}
return 0;
}

public static void main(String[] args) {

}
}

字符串拼接效率问题

由于每个String连接都复制整个String,因此通常最好使用对StringBuilder.append()或StringBuffer.append()的显式调用来替换它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void printOddNumbersBetween(int start, int end) {
StringBuilder result = new StringBuilder();
// 低效的写法
/*
for (int i = start; i <= end; i++) {
if (i % 2 != 0) {
result += (i + ",");
}
}
*/

for (int i = start; i <= end; i++) {
if (i % 2 != 0) {
result.append(i).append(",");
}
}

System.out.println(result.subSequence(0,result.length()));
}

微服务简介

单体架构

单体架构是什么

单体架构会把一个完整的应用当成一开发单元。

一般企业应用包含三个部分:

  • 客户端界面(由HTML、Javascript组成,使用浏览器进行访问)
  • 数据库(由许多的表组件构成一个通用的、相互关联的数据管理系统)
  • 服务端应用

Read More

SQLite特性

SQLite

数据存储

SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标准SQL语法,还遵循ACID(数据库事务)原则,是一个嵌入式SQL数据库引擎。与大多数其他SQL数据库不同,SQLite没有单独的服务器进程,直接读写普通磁盘文件,具有多个表,索引,触发器和视图的完整SQL数据库包含在个磁盘文件中。

Read More

控制反转

控制

要阐明控制反转的概念,先要明白什么是控制。举例有两个对象,如电池Battery和它的规格参数Parameter,他们可以有如下关系:

Read More