JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。
使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。
我们在Java代码中如果要访问MySQL,必须编写代码操作JDBC接口。注意到JDBC接口是Java标准库自带的,所以可以直接编译。而具体的JDBC驱动是由数据库厂商提供的。因此,访问某个具体的数据库,我们只需要引入该厂商提供的JDBC驱动,就可以通过JDBC接口来访问,这样保证了Java程序编写的是一套数据库访问代码,却可以访问各种不同的数据库,因为他们都提供了标准的JDBC驱动。实际上,一个MySQL的JDBC的驱动就是一个jar包。
package main
import (
"flag"
"fmt"
"os"
"time"
)
var (
version bool
help bool
port int
host string
score float64
sites argsSlice
period time.Duration
)
int分为有符号型(int)和无符号型(uint),从使用的角度说,区别就是能支持的数范围大小。
大端和小端解决的是内存地址和字节数据保存的顺序问题
大端存储:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。内存地址由小向大增加,而数据从高位往低位放,比如4个字节的数组[0 0 1 0]
表示十进制数 256。通常在计算机网络的TCP/IP协议中使用大端存储表示
小端存储:小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。高位内存地址和数据的高位相对应,低位内存地址和数据的低位相对应,比如4个字节的数组[0 1 0 0]
表示十进制数 256
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.1.1</version>
</dependency>
slice 翻译成中文就是切片,它和数组(array)很类似,可以用下标的方式进行访问,如果越界,就会产生 panic。但是它比数组更灵活,可以自动地进行扩容。
// runtime/slice.go
type slice struct {
array unsafe.Pointer // 元素指针
len int // 长度
cap int // 容量
}
slice 共有三个属性:
在Java
程序中,我们经常遇到一大堆单方法接口,即一个接口只定义了一个方法,此时可以以匿名类方式编写。如下是一个排序的例子
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) throws Exception {
String[] array = {"ccc", "aaa", "bbb"};
Arrays.sort(array, new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
System.out.println(Arrays.toString(array));
}
}
Lambda
的方式来编写,可以简化代码如下
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
String[] array = {"ccc", "aaa", "bbb"};
Arrays.sort(array, (s1, s2) -> s1.compareTo(s2));
System.out.println(Arrays.toString(array));
}
}
一个线程可以等待另一个线程直到其运行结束。例如,main线程在启动t线程后,可以通过t.join()
等待t线程结束后再继续运行。如果去掉 t.join()
后,main主线程和新创建的子线程就是同步运行的。
守护线程
t.setDaemon(true)
设置线程为守护线程。
public class Main {
public static void main(String[] args) {
Thread t = new MyThread();
t.start();
t.join();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("start new thread!");
}
}
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
String encoded = URLEncoder.encode("中 文!", StandardCharsets.UTF_8);
System.out.println(encoded);
String decoded = URLDecoder.decode("%E4%B8%AD+%E6%96%87%21", StandardCharsets.UTF_8);
System.out.println(decoded);
Base64编码可以把任意长度的二进制数据变为纯文本,且只包含A~Z、a~z、0~9、+、/、=这些字符。
原理
注意: 使用matches是整个字符串的匹配,find可以提取出部分。
String.matches()
对同一个正则表达式进行多次匹配效率较低,因为每次都会创建出一样的Pattern
对象。
String regex = ".*";
System.out.println("abc".matches(regex));
Pattern
对象,然后反复使用,就可以实现编译一次,多次匹配。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern p = Pattern.compile(".*");
Matcher m = p.matcher("abc");
System.out.println(m.matches());
Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个Java方法的测试。对于高质量的代码来说,测试覆盖率应该在80%以上。
package com;
public class HelloJava {
public int age;
public HelloJava(int age) {
this.age = age;
}
}