从此产品 专题 文章 上网

Java编程语言 & JDK软件开发


Java 19 / JDK 19 正式发布!

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

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

Java开发工具IDE - IntelliJ IDEANetBeansEclipse


Java兼容性

Apache NetBeans 15 最高兼容 JDK 19
Gradle 7.6 最高兼容 JDK 19
Android Studio Dolphin 2021.3.1 项目 最高兼容 JDK 11

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 & Virtual Threads

        // 若用了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); }


虚拟线程/协程: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://example.com/.well-known/maven/our/project-123456/maven-public-snapshot/"
            //url "https://asia-maven.pkg.dev/project-123456/maven-public-snapshot/"
            content {
                includeGroup "com.x.module"
                //includeGroup "com.x.our"
            }
        }
        maven {
            url "https://example.com/.well-known/maven/our/project-123456/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