此博内容全为自己的笔记,是写给自己看的,当然很多都可以从网上查到,我只不过做了个归纳、整理,方便查阅。如果看客觉得有用,不用客气,觉得没用,也不要咒骂,抱怨…
java 11 和之前的 java 5,java 8一样是个里程碑式的更新,本次总结自 java 8以来重要的一些特性
-
jshell
jshell 就相当于在main 方法里面,可以直接输出,或是定义类(内部类)
-
局部变量类型推断
var str = "我是刘和广"; var list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add(233);//如果 new ArrayList<Strnig>规定的泛型是 String,就不能这么写了 list.forEach(s-> System.out.println(s));
-
lamada 语法
new Thread(()->{ for (int i=0; i<5; i++){ System.out.println(i); } }).start();
public interface Customer { void accpet(String str); }
Customer customer = (var str1) -> System.out.println(str1.toUpperCase()); customer.accpet("sdflksjf");
-
增强的方法
//集合的创建可以更简单,Set 也有 of() List<String> list1 = List.of("aa","bb","cc");//Arrays.asList() 效果一样 list1.add("dd");//java.lang.UnsupportedOperationException System.out.println(list1);
-
Stream 流
/** * 流的处理的三个步骤 * 1,创建流 * 2,中间操作 * 3,终止操作 */ Stream<Integer> stream1 = Stream.of(1,10, 3, 20, 30, 50); //stream.forEach(t-> System.out.println(t)); stream1.forEach(System.out::println);//有参数无返回值 //如果为空不会报错,但传入null会报空指针, Stream<Object> stream2 = Stream.of();//Stream.of(null); stream2.forEach(System.out::println); //对于 null 的情况,可以用 ofNullable Stream<Object> stream3 = Stream.ofNullable(null); stream3.forEach(System.out::println); System.out.println("****************"); Stream<Integer> stream4 = Stream.of(1,5, 3, 20, 30, 50); //Stream<Integer> takeWhile = stream4.takeWhile(t -> t % 2 != 0);//为奇数时留下,形成新 Stream //takeWhile.forEach(System.out::println); Stream<Integer> dropWhile = stream4.dropWhile(t -> t % 2 != 0);//为奇数时丢弃,形成新 Stream dropWhile.forEach(System.out::println); //流的迭代,创建流 Stream<Integer> iterate = Stream.iterate(1, t -> (2 * t) + 1); //如果不加limit(10),会无限迭代输出,这是 jdk11 之前的做法(用 limit 限制) iterate.limit(10).forEach(System.out::println); //jdk 11 的做法 System.out.println("***************"); Stream<Integer> stream = Stream.iterate(1, t -> t < 1000, t -> (2 * t) + 1); stream.forEach(System.out::println);
-
字符串和 Operational
String str1 = "\t \n\r "; //判断字符串是否是空白字符 System.out.println(str1.isBlank()); System.out.println("*****==========="); str1 = "\t abc \r \n "; //去除字符串首尾中的空白,包括英文和其它所有语言的空白字符 String strip = str1.strip(); //去除字符串首部的空白,包括汉字 String stripLeading = strip.stripLeading(); //去除字符串尾部的空白,包括汉字 String stripTrailing = strip.stripTrailing(); System.out.println(strip+"<====>"+strip.length()); str1 = "java"; str1.repeat(3);//把str1 重复三次,输出 javajavajava //去除字符串首尾中的空白,只能去除码值小于32的(如果是中文全角的空白是去除不了的) String trim = str1.trim(); System.out.println(trim+"<====>"+trim.length());
String str = null; //of 和 get() 都不建议用,如果传入的null,会报空指针 /**Optional<String> stringOptional = Optional.of(str); System.out.println(stringOptional.get());**/ //一般用 ofNullable,取值用 orElse() Optional<String> optionalS = Optional.ofNullable(str); //如果str不为null,返回str的内容,否则返回 "空串代替" String orElse = optionalS.orElse("空串代替"); 如果 str 不为null,返回 str 的内容,否则执行 f() 方法 orElse = optionalS.orElse(f()); System.out.println(orElse); //orElse 和 orElseGet 区别:无论 str是否为空,orElse里面的都会执行,orElseGet 只有 str 为空才执行 String orElseGet = optionalS.orElseGet(() -> f()); System.out.println(orElseGet); //orElseThrow也有重载方法,跟orElseGet 用法类似.. String orElseThrow = optionalS.orElseThrow(); System.out.println(orElseThrow);//抛出 NoSuchElementException,底层还是空指针,不过源码做了控制而已
static String f(){ System.out.println("执行了f() 这个方法"); return "lhg"; }
-
字符串和输入流的 API
-
以前输入输出文件
FileInputStream fis = new FileInputStream("D:\\ideaProjects\\Demo_JDK12\\src\\com\\lhg\\demo\\StringTest.java"); FileOutputStream fos = new FileOutputStream("d://demo.java"); BufferedReader br = new BufferedReader(new FileReader("D:\\ideaProjects\\Demo_JDK12\\src\\com\\lhg\\demo\\StringTest.java")); BufferedWriter bw = new BufferedWriter(new FileWriter("d:/demo3.java")); byte[] buff = new byte[fis.available()];//fis.available():得到文件的有效字节数 int len;//读进缓冲数组里面 String line; //br bw方式 while ((line = br.readLine()) != null){ bw.write(line); bw.newLine(); } //fis fos 方式 while((len=fis.read(buff)) != -1){ fos.write(buff, 0, len); } fos.close(); fis.close(); bw.close(); br.close();
-
通过 Stream
FileInputStream fis = new FileInputStream("D:\\ideaProjects\\Demo_JDK12\\src\\com\\lhg\\demo\\StringTest.java"); byte[] buff = new byte[fis.available()];//fis.available():得到文件的有效字节数 int len;//读进缓冲数组里面 fis.close(); String string = new String(buff); string.lines().forEach(System.out::println);//可以直接输出或其它操作
-
transfer 复制流
InputStream is = StringTest.class.getClassLoader().getResourceAsStream("config.properties"); try(var os = new FileOutputStream("config_bak.properties")){ is.transferTo(os);//输入流的数据自动复制到输出流 } is.close();
-
-
Http 客户端
-
更简化的编译运行程序
之前的做法是 先javac Demo.java
,然后java Demo
运行程序,
现在直接java Demo.java
一步到位,不过 Demo.java 文件中所引用的 类必须全部来自文件本身(比如这个类 引用了 Teacher 这个类,那么 Teacher 这个类必须定义在 Demo.java 中),如果 Demo.java 中有多个类,多个 main方法,哪个类在前,就执行哪个类的 main 方法(当然只有一个 public 类) -
垃圾收集器改进
- 默认的 gc
- epsilon gc
设置好后,重新运行上面那段代码,发现程序会因为堆空间不足很快退出
- 默认的 gc
-
ZGC java 11 最为瞩目的特性没有之一