Java编程语言 & JDK软件开发


Java/JDK下载地址 - https://www.oracle.com/javadownload/

新特性有:预览版的虚拟线程(JEP 425)、外部函数和内存API(JEP 424),以及正式支持Unicode 14等。

Java开发工具IDE - IntelliJ IDEANetBeansEclipse


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实例:

  Java Servlet 技术入门

    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