当前位置: 首页 > news >正文

JAVA语法糖

大纲

JAVA语法糖让程序更加简洁,有更高的可读性。

语法糖
switch支持String与枚举
泛型
变长参数
自动拆装箱
枚举类
内部类
条件编译
断言
数值字面量
for-each
try-with-resource
lambda表达式

switch支持String与枚举

字符串的 switch 是通过equals()和hashCode()方法来实现的。

Code sharing 方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除(type erasue)实现的。

虚拟机中没有泛型,只有普通类和普通方法,所有泛型类的类型参数在编译时都会被擦除,泛型类并没有自己独有的Class类对象。比如并不存在List.class或是List.class,而只有List.class。

泛型

不同的编译器对于泛型的处理方式是不同的,通常情况下,一个编译器处理泛型有两种方式:Code specialization和Code sharing。C++和 C#是使用Code specialization的处理机制,而 Java 使用的是Code sharing的机制。

  • 泛型遇到重载:编译不过,因为泛型编译后类型被擦除了
  • 当泛型遇到 catch:泛型的类型参数不能用在 Java 异常处理的 catch 语句中。因为异常处理是由 JVM 在运行时刻来进行的。
  • 当泛型内包含静态变量:由于经过类型擦除,所有的泛型类实例都关联到同一份字节码上,泛型类的静态变量是共享的。

变长参数

可变参数在被使用的时候,他首先会创建一个数组,数组的长度就是调用该方法是传递的实参的个数,然后再把参数值全部放到这个数组当中,然后再把这个数组作为参数传递到被调用的方法中。

自动拆装箱

装箱过程是通过调用包装器的 valueOf 方法实现的,而拆箱过程是通过调用包装器的 xxxValue 方法实现的。

对象相等比较:在 Java 5 中,在 Integer 的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。

适用于整数值区间-128 至 +127。
只适用于自动装箱。使用构造函数创建对象不适用。

枚举类

当我们使用enum来定义一个枚举类型的时候,编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承。

内部类

内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员。

  • 匿名内部类、局部内部类、静态内部类也是通过桥方法来获取 private 属性。
  • 静态内部类没有this$0的引用
  • 匿名内部类、局部内部类通过复制使用局部变量,该变量初始化之后就不能被修改。

条件编译

Java 语法的条件编译,是通过判断条件为常量的 if 语句实现的。其原理也是 Java 语言的语法糖。根据 if 判断条件的真假,编译器直接把分支为 false 的代码块消除。通过该方式实现的条件编译,必须在方法体内实现,而无法在整个 Java 类的结构或者类的属性上进行条件编译,这与 C/C++的条件编译相比,确实更有局限性。在 Java 语言设计之初并没有引入条件编译的功能,虽有局限,但是总比没有更强。

断言

Java 在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。

-enableassertions会设置$assertionsDisabled 字段的值。

数值字面量

在 java 7 中,数值字面量,不管是整数还是浮点数,都允许在数字之间插入任意多个下划线。这些下划线不会对字面量的数值产生影响,目的就是方便阅读。

for-each

for-each 的实现原理其实就是使用了普通的 for 循环和迭代器。

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出java.util.ConcurrentModificationException异常。

try-with-resource

那些我们没有做的关闭资源的操作,编译器都帮我们做了。

lambda表达式

lambda 表达式的实现其实是依赖了一些底层的 api,在编译阶段,编译器会把 lambda 表达式进行解糖,转换成调用内部 api 的方式。

http://www.dtcms.com/a/298090.html

相关文章:

  • 高效算法的实现与优化是计算机科学的核心,直接决定了程序的性能和资源消耗。下面针对排序算法、搜索算法和动态规划,深入探讨其高效实现与关键优化技术。
  • 机器视觉对位印刷加工PCB板应用
  • LlamaIndex 和 Elasticsearch Rerankers:无与伦比的简洁
  • Power Compiler:漏电功耗、内部功耗、切换功耗及其计算方式(NLPM)
  • 基于Transform、ARIMA、LSTM、Prophet的药品销量预测分析
  • Jenkins中HTML文件显示样式问题解决方案
  • 【数据库】AI驱动未来:电科金仓新一代数据库一体机如何重构性能边界?
  • Vue接口平台十二 —— 测试任务(Task)
  • CentOS7 安装 Redis
  • ThreadLocal使用及其原理和注意点
  • 背包DP之完全背包
  • MCP (Model Context Protocol) 与 HTTP API:大模型时代的通信新范式
  • 如何在windows设置Redis服务后台自启动
  • Hive【安装 01】hive-3.1.2版本安装配置(含 mysql-connector-java-5.1.47.jar 网盘资源)
  • 数据管理能力成熟度评估模型(DCMM)详解
  • 基于Matlab图像处理的瓶子自动检测与质量评估系统
  • SpringBoot整合Fastexcel/EasyExcel导出Excel导出多个图片
  • QKV 为什么是三个矩阵?注意力为何要除以 √d?多头注意力到底有啥用?
  • MyBatis 之缓存机制核心解析
  • android JXL 导出Excel(.xls/xlsx)
  • 解决企业微信收集表没有图片、文件组件,不能收集图片的问题
  • windows 安排 openssl
  • 三、操作系统——第1章:计算机系统概述
  • 星痕共鸣 C++显示打出的攻击力
  • 【前端工程化】前端项目开发过程中如何做好通知管理?
  • AVL树和红黑树的特性以及模拟实现
  • 【CMake】CMake 与 C++ 协同:条件配置机制及控制台控制实例解析
  • [C++]string::substr
  • MindJourney:构建空间智能的新范式——VLM与视频扩散式世界模型的融合
  • 【LeetCode Solutions】LeetCode 热题 100 题解(16 ~ 20)