Java编程语言 & JDK软件开发
Java/JDK下载地址 - https://www.oracle.com/javadownload/
新特性有:预览版的虚拟线程(JEP 425)、外部函数和内存API(JEP
424),以及正式支持Unicode 14等。
Java开发工具IDE - IntelliJ IDEA、NetBeans、Eclipse
Java兼容性
Apache NetBeans 17 IDE最高运行在JDK 19;内嵌Gradle最高支持为JDK 19; 注意 - 版本发布总会延误20天!
Gradle 8.0 最高兼容 JDK 20
Android Studio Dolphin 2021.3.1 项目 最高兼容 JDK 11
GraalVM Native Image
一种提前将(Java)代码编译为二进制文件(原生可执行文件,native executable)的技术。原生可执行文件只包含运行时所需要的代码,即应用程序类、标准库类、语言运行时和来自JDK的静态链接的原生代码(也就是这样的二进制文件可以直接运行,不需要额外安装JDK)。
Spring Boot 3.0 支持该特性技术。
Java关键字
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充,继承 | |
final | 最终值,不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地,原生方法(非Java实现) | |
new | 新,创建 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供switch选择 | |
continue | 继续 | |
default | 默认 | |
do | 运行 | |
else | 否则 | |
for | 循环 | |
if | 如果 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
null | 空 | |
变量引用 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 |
JDBC
JDBC(Java Database Connectivity) - 关系型数据库管理技术入门
// 若用了mariadb-java-client,则必须修改URL协议为 jdbc:mariadb://... String url = "jdbc:mysql://127.0.0.1:3306/db-name"; String user = "root", password = "1"; try (var conn = DriverManager.getConnection(url, user, password); Statement sta = conn.createStatement()) { // 或 参数化 var ps = conn.prepareStatement(sql); // ps.setString(1, name); // index从1数起 ResultSet rs = sta.executeQuery("select 'Hi'"); // ps.executeUpdate(); if(rs.next()){ System.out.println(rs.getObject(1)); } // Statement关闭时会连带关闭ResultSet } catch (SQLException ex) { System.err.println(ex); }
虚拟线程(Virtual Threads)/协程:Thread.ofVirtual().start(() -> System.out.println("Hello"));
Java Optional类:参考文章
对象嵌对象判null传统写法:
if (p!= null && p.getLocation() != null && p.getLocation().getCity() != null) {
return p.getLocation().getCity().toLowerCase();
}
简写:
Optional.ofNullable(p).map(Person::getLocation)
.map(Location::getCity).map(String::toLowerCase);
Gradle & Maven
repositories { mavenLocal() mavenCentral() //google() maven { url "https://x.com/x/maven-public-snapshot/" content { includeGroup "com.x.module" //includeGroup "com.x.our" } } maven { url "https://x.com/x/maven-private-snapshot/" content { includeGroup "com.x.our" } authentication { digest(BasicAuthentication) } credentials { username 'our' password '[password]' } } }
Servlet+Gradle实例:
plugins {
id 'war'
id "org.gretty" version "4.0.0"
}
repositories { mavenCentral() }
dependencies {
providedCompile 'jakarta.servlet:jakarta.servlet-api:5.0.0'
}
// 首页位置 - src/main/webapp/index.html
// http://localhost:8080/gradle-servlet-template/ss/any
@WebServlet(urlPatterns = {"/s", "/ss/*"})
public class NewServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try ( var out = response.getWriter()) {
out.println(request.getServletPath());
}
}
}
Servlet的异步和非阻塞:
// http://localhost:8080/gradle-servlet-template/aa/any
@WebServlet(asyncSupported = true, urlPatterns = {"/a", "/a/*"})
public class NewServlet extends HttpServlet {
private static final ExecutorService ES = Executors.newFixedThreadPool(9);
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
var ac = request.startAsync(request, response);
ac.setTimeout(10 * 1000);
//ac.addListener(new AsyncListener() {});
// 异步非阻塞方式读取或响应HTTP Body大尺寸内容
//var is = request.getInputStream();
//is.setReadListener(new MyRL(is, asyncContext));
//var os = response.getOutputStream();
//os.setWriteListener(new MyWL(os, asyncContext));
// 若业务线程需要Body参数可在MyRL的onAllDataRead()回调中拿取
// 或 new Thread(() -> {...}).start(); // 依然属于Servlet接待线程
ES.execute(() -> { // 或 ac.start(() -> {...});
try {
TimeUnit.SECONDS.sleep(2); // 模拟业务耗时
ac.getResponse().getWriter().write("ok");
ac.complete(); // 通知异步上下文请求处理完成
} catch (IOException | InterruptedException e) {
System.err.println(e);
}
});
}
}
启动 - gradle appRun
2022-09-20T18:53:43.044000000Z