zgc垃圾回收机制con很早以前就听说了这个概念,从jdk14开始zgc进入预览版本,也意味着jdk15后,zgc将成为java运行环境的默认垃圾回收器。
开启ZGC方法
编译的过程增加如下的选项
–with-jvm-features=zgc
在java参数文件,添加如下参数
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
http://openjdk.java.net/jeps/364
http://openjdk.java.net/jeps/365
http://openjdk.java.net/jeps/363
再通过-XX:+UseConcMarkSweepGC使用CMS 垃圾回收器将会发生如下错误:
Java HotSpot™ 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC;
support was removed in
http://openjdk.java.net/jeps/368
这个特性比较简单,针对长文本,SQL,在旧版本的处理方式是
String html = "\n" +
" \n" +
" Hello, world
\n" +
" \n" +
"\n";
显然用+的方式处理显得比较的冗余
新版本助攻采用的是如下方式,通过3个双引号括起来,之前jdk13是采用,但是在后台果断放弃掉了,所以,这里建议大型开发团队在更新jdk的时候,一定要审慎,避免出现这种尴尬的情况
String html=`
<html>
<body>
<p>Hello, world</p>
</body>
</html>
`;
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
那么问题来了,如果需要拼接一些变量应该怎么办呢,我们记得,在Groovy或者python中是可以类似如下的场景的
username='jjj'
age=18
str='this student:$username,age:$age'
这样直接替换的,一来简明易懂,但是java在这方面处理比较麻烦,但是还是有方法下面提供2个方法
方法1
String code = """
public void print(""" + type + """
o) {
System.out.println(Objects.toString(o));
}
""";
方法2
String code = """
public void print($type o) {
System.out.println(Objects.toString(o));
}
""".replace("$type", type);
方法3
String code = String.format("""
public void print(%s o) {
System.out.println(Objects.toString(o));
}
""", type);
方法4
String source = """
public void print(%s object) {
System.out.println(Objects.toString(object));
}
""".formatted(type);
怎么样,是不是很麻烦,笔者也是这么觉得的。
另外java还提供3个方法,有兴趣的读者自行研究
String::stripIndent(): used to strip away incidental white space from the text block content
String::translateEscapes(): used to translate escape sequences
String::formatted(Object… args): simplify value substitution in the text block
//传统的instanceof尝尝会 是如下的几个步骤
//1.判断是否为目标类型
//2.如果是,转化为对应目标类型
//3.处理
Object obj="123";
if(obj instanceof String){
String s= (String) obj;
System.out.println(s);
}else{
System.out.println("unexpected type of object");
}
新版本的处理方式可以如下,instanceof类型后加一个变量,然后,在括号里的代码快
if(obj instanceof String s){
System.out.println(s);
}else{
System.out.println("unexpected type of object");
}
http://openjdk.java.net/jeps/305
http://openjdk.java.net/jeps/358
http://openjdk.java.net/jeps/359
Records是一个新的概念,也是一个新的关键字
他的作用是简化程序员书写的代码,针对Javabean 的书写,功能类似于scala的case,kotlin的data。c#中的record
/**
* jdk14书写方式只需要在括号中声明javabean属性
* 就会自动的帮我们生成对应名称的属性和方法,
* 以及toString,equals,方法
*/
record Range(int x,int y){
}
//编译后的代码
static final class Range extends java.lang.Record {
private final int x;
private final int y;
public Range(int x, int y) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public int x() { /* compiled code */ }
public int y() { /* compiled code */ }
}
//使用实例代码
var r=new Range(7,8);
//自动提供了toString方法
System.out.println(r.toString());
//自动提供了equals方法
System.out.println(r.equals(new Range(8,7)));
//通过属性获取属性
System.out.println(r.x+":"+r.x);
//通过方法获取属性
System.out.println(r.x()+":"+r.y());
//对字段的放射方法
Arrays.asList(r.getClass().getRecordComponents()).forEach(it->{
String name = it.getName();
System.out.println(name);
});
//用于通过反射判断一个对象是否为record类型的对象
System.out.println(r.getClass().isRecord());
//同样的,他也是支持自己手动的去处理构造函数逻辑,代码如下
record Range(int lo, int hi) {
public Range {
if (lo > hi) /* referring here to the implicit constructor parameters */
throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
}
}