中小企业查询网站,cn域名著名网站,免费申请微信,100个免费推广网站下载目录
Jdk 新特性
JDK 8 特性
默认方法实现作用:可以使接口更加灵活#xff0c;不破坏现有实现的情况下添加新的方法。
函数式接口
StreamAPI
JDK 9 特性
JDK 10 特性
JDK 11 特性
JDK 14 特性
JDK 17 特性
JDK 21 特性
数据类型
基本数据类型和引用数据类型的区别…目录
Jdk 新特性
JDK 8 特性
默认方法实现作用:可以使接口更加灵活不破坏现有实现的情况下添加新的方法。
函数式接口
StreamAPI
JDK 9 特性
JDK 10 特性
JDK 11 特性
JDK 14 特性
JDK 17 特性
JDK 21 特性
数据类型
基本数据类型和引用数据类型的区别
自动装箱自动拆箱
integer和int的区别
缓存池实现
直接内存 Jdk 新特性 JDK 8 特性
1、Lambda 表达式这是 JDK 8 最重要的特性之一。它允许将函数作为方法参数传递
使得代码更加简洁。对于接口可以直接用()-{}方式来表达
小括号表示方法入参花括号内表示方法返回值如Collections的sort()方法
Optional判空。 例如可以使用 Lambda 表达式来简化集合的遍历和操作。
如ListString list Arrays.asList(a, b, c);
list.forEach((s) - System.out.println(s));。
2、Stream API提供了一种对集合进行操作的新方式。它支持链式操作
用于对数据进行过滤、映射、排序等操作。
例如ListInteger numbers Arrays.asList(1, 2, 3, 4, 5); ListInteger evenNumbers
numbers.stream().filter(n - n % 2 0).collect(Collectors.toList());
可以方便地从一个集合中筛选出偶数。
3、接口默认方法和静态方法接口可以有默认方法和静态方法。
默认方法允许在接口中提供默认的实现
这样实现接口的类在没有重写该方法时可以使用默认实现。
例如interface MyInterface {
default void myMethod() { System.out.println(Default method); }
}。 4、新的日期和时间API
5、并发增强
6、支持多重注解
7、反射的加强 。JDK8加强了反射它允许你直接通过反射获取参数的名字
9、JavaScript引擎Nashorn
10、Java虚拟机JVM的新特性
PermGen移出永久代变成是Metaspace元空间。
JVM选项-XX:PermSize与-XX:MaxPermSize分别被-XX:MetaSpaceSize与-XX:MaxMetaspaceSize所代替。
原文链接JDK 7 和 JDK8 的区别_jdk8个jdk7区别-CSDN博客 默认方法实现作用:可以使接口更加灵活不破坏现有实现的情况下添加新的方法。 功能性接口Function 接收一个功能参数t并返回一个功能结果R。
断言性接口Predicate 主要用到test方法 其中参数t为输入参数
如果输入参数符合断言则返回true否则false 。/ˈpredɪkət /
供给性接口Supplier 不接收任何参数 但有返回值。/səˈplaɪə(r)/
java.util.function.Supplier T接口仅包含一个无参的方法T get()
用来获取一个泛型参数指定类型的对象数据
消费性接口Consumer 只接收一个参数t但是没有返回值。 函数式接口
有且仅有一个抽象方法的接口不包括默认方法、静态方法以及对Object方法的重写
注一般会出现一个名词叫做“语法糖”即使用更加方便而原理不变的代码语法
如Lambda可以认为是匿名内部类的语法糖
FunctionalInterface
// 定义一个接口只包含一个抽象方法
public interface MyfuInter { public abstract void method();
}
StreamAPI
filter(T - boolean) 保留 boolean 为 true 的元素
map(T - R) 将流中的每一个元素 T 映射为 R类似类型转换
ListString newlist list.stream().map(Person::getName).collect(toList()); flatMap(T - Stream)
将流中的每一个元素 T 映射为一个流再把每一个流连接成为一个流 //去重复
StreamT distinct();
//排序
StreamT sorted();
//根据属性排序
StreamT sorted(Comparator? super T comparator);
//对对象的进行操作
StreamT peek(Consumer? super T action);
//截断--取先maxSize个对象
StreamT limit(long maxSize);
//截断--忽略前N个对象
StreamT (long n); anyMatch表示判断的条件里任意一个元素成功返回true
allMatch表示判断条件里的元素所有的都是返回true
noneMatch跟allMatch相反判断条件里的元素所有的都不是返回true joining 连接字符串 .collect(joining(,)); 返回String
groupingBy 用于将数据分组最终返回一个 Map 类型 统计count、averaging minmaxfindFirstfindAny
平均值averagingInt、averagingLong、averagingDouble
最值maxBy、minBy
求和summingInt、summingLong、summingDouble
统计以上所有summarizingInt、summarizingLong、summarizingDouble ListUser userList Lists.newArrayList();
userList.add(new User(1L, 彼得, 18));
userList.stream() .filter(user - user.getAge() 18) .map(User::getName).forEach(System.out::println);
userRespDtoList.stream().filter(x - !ObjectUtils.isEmpty(x.getDeptId())).forEach(user - {}) Map、collect、group by、distinct、sum
list.stream() .filter(s - s.startsWith(张)) .filter(s - s.length() 3) .forEach(System.out::println);
ListString idcards users.stream().map(User::getIdcard).collect(Collectors.toList()) 原文链接list对象转map stream /去重 根据属性转Map或者分组_list转map去重-CSDN博客 JDK 9 特性
模块系统Java Platform Module System - JPMS这是 JDK 9 的核心变化。它将 Java 代 码组织成模块每个模块有自己的名称、依赖关系和封装边界。
例如可以创建一个名为com.example.mymodule的模块
并且在模块描述文件module - info.java中定义模块的依赖和导出的包如module com.example.mymodule { exports com.example.api; requires java.base; }。
改进的 JShell 工具JShell 是一个交互式的 Java 编程环境。
在 JDK 9 中它得到了改进允许开发者快速地测试 Java 代码片段而不 需要编写完整的类和方法。
例如可以直接在 JShell 中输入int a 5; System.out.println(a);
并立即看到输出结果。
JDK 10 特性
局部变量类型推断var 关键字可以在声明局部变量时使用var关键字来让编译器自动 推断变量的类型。
例如var list new ArrayListString();
编译器会根据赋值的右侧自动推断list是ArrayListString类型。
这使得代码编写更加简洁尤其是在处理复杂的泛型类型时。
JDK 11 特性
新的 HTTP 客户端 API提供了一个标准的、现代化的 HTTP 客户端
用于替代旧的HttpURLConnection。
它支持同步和异步请求并且可以方便地处理请求和响应。
例如HttpClient client HttpClient.newHttpClient();
HttpRequest request HttpRequest.newBuilder().uri(URI.create(http://example.com)).build(); HttpResponseString response client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());。
字符串处理方法改进新增了一些字符串处理方法
如isBlank()用于判断字符串是否为空或仅包含空白字符
lines()用于按行拆分字符串等。这些方法使得字符串的处理更加方便。
JDK 14 特性
Records记录Records 是一种新的类类型用于创建不可变的数据类。
它自动生成了构造函数、访问器方法和equals()、hashCode()等方法。
例如record Point(int x, int y) {}定义了一个记录类它有x和y两个属性可以通过new Point(1, 2)来创建实例并且可以直接访问x和y属性。
Pattern Matching for instanceof针对 instanceof 的模式匹配这是对instanceof操作的 改进。以前在使用instanceof检查类型后还需要进行类 型转换现在可以在instanceof表达式中直接声明变量并使 用。例如if (obj instanceof String str) { System.out.println(str.length()); }。
JDK 17 特性
语言特性增强 密封类Sealed Classes改进密封类可以精确控制哪些类可以继承它。例如定义一个密封类sealed class Shape permits Circle, Square这就限制了只有Circle和Square类能够继承Shape类使得类的继承层次更加可控有助于在设计模式如状态模式、策略模式中限制子类的范围增强代码的安全性和可维护性。 /siːld/模式匹配Pattern Matching增强在处理instanceof操作时有了很大的改进。以前使用instanceof需要先进行类型判断再进行类型转换如if (obj instanceof String) { String str (String) obj; System.out.println(str.length()); }。在 Java GDK 17 中可以直接写if (obj instanceof String str) { System.out.println(str.length()); }这种方式更加简洁高效提高了代码的可读性。性能优化 JIT即时编译编译器优化通过对 JIT 编译器的改进加快了代码的执行速度。编译器能够更智能地对热点代码进行优化编译减少了字节码解释执行的时间提高了 Java 应用程序的整体性能。内存管理优化在内存布局和分配方面进行了优化。例如对于对象的内存分配机制进行了调整减少了内存碎片的产生提高了内存的利用率。这对于内存密集型的应用程序如大数据处理、内存数据库等非常有利可以降低内存占用提升系统的稳定性。新的 API 提供 日期和时间 API 增强新增了一些用于处理日期和时间的方法使得日期时间的计算和格式化更加精准。比如在处理跨时区的日期时间问题时提供了更方便的函数来进行时区转换和计算方便开发全球化应用程序。安全相关 API 更新在安全方面提供了新的 API可能包括增强的加密算法相关函数。例如在网络通信加密、数据存储加密等场景下可以利用这些新的 API 来提高应用程序的安全性保护用户数据。容器化和云原生支持提升 更好地适应容器编排平台能够更好地与 Kubernetes 等容器编排平台配合。在资源动态分配的场景下Java 应用可以更快地响应资源的变化。例如当容器的 CPU 或内存资源被重新分配时Java 应用能够及时调整自身的性能和资源消耗策略保证应用的稳定运行。云原生服务集成增强在云原生的分布式应用开发方面提供了更好的接口用于与其他服务集成。比如在微服务架构中可以更方便地与服务发现、配置管理等服务进行交互促进云原生应用的开发和部署。
JDK 21 特性
虚拟线程Virtual Threads这是一种轻量级的线程可以有效减少编写高吞吐量并发应 用程序的难度。虚拟线程能够在不增加系统资源消耗的前提下
大大提高应用程序的并发处理能力。
分代 ZGCZ Garbage Collector进一步优化了垃圾回收的性能
特别是在处理大型堆内存场景下的性能表现更好
能够减少垃圾回收的暂停时间提高系统的稳定性。
记录模式Record Patterns和模式匹配Pattern Matching增强在语言语法方面有新的 预览功能出现让代码在处理复杂数据结构和类型判断时更加简 洁高效。
例如在处理复杂的嵌套数据结构时可以更方便地提取和使用其中的数据。 2023年9月19日Oracle公司正式发布了JDK 21
数据类型
Java中的数据类型分为两大类基本数据类型和引用数据类型
基本数据类型只有8种可按照如下分类四类①整数类型long、int、short、byte②浮点类型float、double③字符类型char④布尔类型boolean 引用类型大致包括类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型例如String类型就是引用类型
还有DoubleByte,Long,Float,Char,Boolean,Short注意这里和基本类型相比首字母是大写简单来说所有的非基本数据类型都是引用数据类型
基本数据类型和引用数据类型的区别
存储位置
在方法中声明的变量:局部变量只能在方法中有效
每当程序调用方法时系统都会为该方法建立一个方法栈结束系统会释放方法栈。
在方法中声明的变量可以是基本类型的变量也可以是引用类型的变量。
当声明是基本类型的变量的时其变量名及值是放在JAVA虚拟机栈中
当声明的是引用变量时所声明的变量该变量实际上是在方法中存储的是内存地址值是放在JAVA虚拟机的栈中该变量所指向的对象是放在堆类存中的。 在类中声明的变量
在类中声明的变量是成员变量也叫全局变量放在堆中的因为全局变量不会随着某个方法执行结束而销毁。
在类中声明的变量即可是基本类型的变量 也可是引用类型的变量
当声明的是基本类型的变量其变量名及其值放在堆内存中的
引用类型时其声明的变量仍然会存储一个内存地址值该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中。 传递方式
基本变量类型在方法中定义的非全局基本数据类型变量调用方法时作为参数是按数值传递的
引用变量类型引用数据类型变量调用方法时作为参数是按引用传递的。
一切的引用数据类型都可以使用object进行接收
自动装箱自动拆箱
将基本数据类型转化为引用数据类型的过程叫做装箱
把从引用数据类型转化为基本数据类型的过程叫做拆箱
Integer类型的对象,使用intValue()可以将Integer对象拆箱为int类型变量
valueOf()--装箱 java自己的一种机制叫做自动装箱和自动拆箱
必须看一篇文章带你搞定 Java 基本数据类型和引用数据类型的区别_java基本数据类型和引用数据类型的区别-CSDN博客
integer和int的区别
1.数据类型和内存存储方式不同:
int是Java的基本数据类型直接存储数值
而Integer是int的包装类是一个对象存储在堆内存中。
2.默认值不同。
int的默认值为0而Integer的默认值为null。
变量比较方式不同。当比较两个变量是否相等时
可以直接使用操作符比较两个int变量
而Integer变量则需要使用equals方法进行比较。
3.实例化需求不同。
int变量不需要实例化即可使用而Integer变量必须实例化后才能使用。
4.方法和功能不同。
Integer提供了一些额外的操作方法例如将字符串转换成整数
以及表示整数的最大值和最小值的常量而int主要用作数值运算。 Integer最小值-2^31 , 最大值2^31-1
1byte 1字节 8 bit(位) String 4个字节 默认会被压缩不压缩8个 缓存池实现
private static class IntegerCache { static final int low -128;
assert IntegerCache.high 127;
}
assert [boolean 表达式] assert 断言 [əˈsɜːt]
Java 是从 JDK1.4 开始支持断言的主要用于程序代码的调试或测试阶段千万不能用在正式环境上。 常量池可以看作一张表虚拟机指令根据这张表找到要执行的类名、方法名、参数类型、字面量等信息。 运行时常量池当类被加载它的常量池信息就会放入运行时常量池并把里面的符号地址变为真实地址。 Byte Short Integer Long 四种类型字面量在-128 x 127 时对象将进入常量池。Character 类型 不能为负数,字面量大于等于0 且 ,小于等于127时对象将进入常量池。Boolean类型 两个字面量都会进入常量池Float 和Double 类型 不会进入常量池
彻底弄懂java中的常量池-腾讯云开发者社区-腾讯云
直接内存
并不属于jvm中内存结构不由jvm进行管理。是虚拟机的系统内存
常见NIO操作时用于数据缓冲区分配回收成本较高但读写性能高不收jvm内存回收管理。