Java 语法糖,提高代码效率神器!

引言:语法糖经常是大厂面试官常问的一个知识点,关于 Java 的语法糖很多人可能只是知道其中的某几个,但却对整体的结构不了解,本文将详细介绍 Java 语法糖的知识。

题目

什么是 Java 语法糖?

推荐解析

什么是语法糖?

语法糖是指一种编程语言的语法结构,它并不提供新的功能,但使代码更易读、更易写,提高了开发效率。这些语法糖通常是一种编译器提供的便利性,它将一种常见的模式或代码结构用更简洁、更易懂的语法表示出来。

语法糖的目的是什么?

语法糖的目的是提高代码的可读性和编写效率,而不是引入新的功能或改变语言的本质。开发者可以使用语法糖来编写更简洁、更清晰的代码,而不必深入了解底层的实现细节。

Java 的语法糖

Switch 支持 String 与枚举

举个例子

public class switchDemoString {public static void main(String[] args) {String str = "nihao";switch (str) {case "nihao":System.out.println("nihao");break;case "hello":System.out.println("hello");break;default:break;}}
}

Switch (字符串) 是用字符串的 hashcode 进行比较,case 中再利用 equals 进行判断,因为可能会产生 hash 冲突的情况。

泛型

对于 Java 虚拟机来说,需要在编译阶段通过类型擦除的方式进行解语法糖。

类型擦除的主要过程如下:1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。2.移除所有的类型参数。

举个例子

Map<String, String> map = new HashMap<String, String>();
map.put("xiaobaitiao", "nihao");

解语法糖之后

Map map = new HashMap();
map.put("xiaobaitiao", "nihao");

在虚拟机中,泛型的实现涉及到类型擦除(Type Erasure)的概念。类型擦除是指在编译时泛型类型信息被擦除,而在运行时,泛型的实例仅保留原始类型(raw type)的信息。这导致在虚拟机中,所有泛型类的类型参数在编译时都会被擦除,并且泛型类并没有自己独有的 Class 类对象。

具体来说,泛型类在编译后的字节码中不会保留其泛型信息,而是被替换为原始类型。例如,对于 List<String> 或 List<Integer>,在运行时只存在一个 List 类的对象,而无法通过 List<String>.class 或 List<Integer>.class 这样的语法来获取类对象。

这样的设计是为了保持 Java 的向后兼容性,因为泛型是在 Java 5引入的,而在引入泛型之前的代码中是没有泛型信息的。因此,为了确保与旧代码的互操作性,Java 编译器使用了类型擦除来处理泛型。

自动装箱和拆箱

这个语法糖应该是较为熟知的,自动装箱就是 Java 自动将原始类型值转换成对应的对象,比如将 int 的变量转换成 Integer 对象,这个过程叫做装箱,反之将 Integer 对象转换成 int 类型值,这个过程叫做拆箱。因为不用人工去转化,因此是自动装箱和拆箱。

举个例子(自动装箱)

 public static void main(String[] args) {int num = 1;Integer n = num;
}

反编译

public static void main(String args[])
{int num = 1;Integer n = Integer.valueOf(num);
}

自动拆箱

public static void main(String[] args) {Integer num = 10;int n = num;
}

反编译

public static void main(String args[])
{Integer num = Integer.valueOf(10);int n = num.intValue();
}

总结:装箱用 valueOf() 方法,拆箱用 xxxValue 方法,比如 intValue。

可变长参数
public static void print(String... strs)
{for (int i = 0; i < strs.length; i++){System.out.println(strs[i]);}
}

可以用... 去代表可变长参数,相当于一个一维字符串数组。一般不太常用。

断言

在 Java 中,assert关键字是从 JAVA SE 1.4 引入的,为了避免和老版本的 Java 代码中使用了assert关键字导致错误,Java 在执行的时候默认是不启动断言检查的。

举个例子

public class Test {public static void main(String args[]) {int a = 1;int b = 1;assert a == b;System.out.println("Hello Word");}
}

当 a不等于b 时,会抛出断言的异常,相等才会输出 HelloWorld,反编译后相当于一个 if else。

数值字面量

在 java 7 中,数值字面量,不管是整数还是浮点数,都允许在数字之间插入任意多个下划线。

public class Test {public static void main(String... args) {int i = 10_000;System.out.println(i);}
}

反编译后会自动把下划线去掉,就是为了方便阅读。

For-Each

For-Each 是程序员都会经常用到的,底层也是普遍都讲过是利用 for 循环和迭代器,因此使用要注意 fail-fast 机制,建议了解 Stream 流的知识。

举个例子

public static void main(String... args) {String[] strs = {"Hello"};for (String s : strs) {System.out.println(s);}List<String> strList = ImmutableList.of("Hello");for (String s : strList) {System.out.println(s);}
}
public static transient void main(String args[])
{String strs[] = {"Hello"};String args1[] = strs;int i = args1.length;for(int j = 0; j < i; j++){String s = args1[j];System.out.println(s);}List strList = ImmutableList.of("Hello");String s;for(Iterator iterator = strList.iterator(); iterator.hasNext(); System.out.println(s))s = (String)iterator.next();
}

注意事项

1)方法重载,但由于泛型擦除,导致编译失败

public static void method(List<String> list) {System.out.println("Hello World String list");}public static void method(List<Long> list) {System.out.println("Hello World Long list");}

2)try catch 中的异常不能再去区别异常的泛型类型,同样是泛型擦除机制。

3)自动拆箱和装箱,但是整数值有缓存机制。

public static void main(String[] args) {Integer a = 129;Integer b = 129;Integer c = 100;Integer d = 100;System.out.println(a == b);System.out.println(c == d);
}

输出结果

false
true

-128 到 127 和缓存机制可以实现重用,也就是说使用的是相同的对象引用,这个也比较经典。

4)增强 for 循环,上文有提到过,增强 for 底层有用到迭代器,迭代器在遍历的时候对象不允许修改或者删除。因此 CMS 异常也就是 fail-fast 多线程修改,解决方法可以直接用迭代器或者 Stream 流的方法,推荐 Stream 流掌握。

总结

语法糖在大多数情况下被我们所使用,能够较大地提升开发效率,但是在开发效率提升的同时,我们要明白语法糖的底层原理,也就是反编译后的代码,JVM 虚拟机是怎么优化的,有哪些优化机制,可能会发生什么问题,这是我们需要注意的点,避免踩坑。

Java 的语法糖是指一些在语法层面上提供的便利性,使得代码更加简洁和易读。这些语法糖并不引入新的功能,而是提供了一种更方便的语法形式。以下是 Java 中常见的语法糖:

  1. 泛型: Java 中的泛型提供了参数化类型的能力,使得在编写集合类等泛型类时可以更安全和更易用。但实际上,Java 的泛型是通过类型擦除来实现的,所以在运行时泛型信息是不可见的。

  2. 自动装箱和拆箱: 基本数据类型和对应的包装类型之间可以自动进行转换,这使得代码更易读。例如,int 到 Integer 的转换。

  3. 增强的 for 循环: 提供了更简洁的方式来迭代集合或数组,避免了手动管理索引的麻烦。

  4. 枚举类型: 提供了更简洁、类型安全的枚举定义方式,避免了使用常量的硬编码。

  5. 可变参数(Varargs): 允许方法接受可变数量的参数,而无需手动创建数组。

  6. Lambda 表达式: 引入了函数式编程的概念,使得可以更轻松地编写简洁的匿名函数。

  7. Diamond 语法(菱形语法): 在创建泛型实例时,允许省略类型参数的重复声明。

使用语法糖可能遇到的坑:

  1. 泛型类型擦除: 虽然泛型提供了更安全的集合操作,但由于类型擦除的存在,可能会导致在运行时无法获取泛型类型信息。

  2. 自动装箱拆箱带来的性能开销: 自动装箱和拆箱可能导致额外的性能开销,特别是在大量数据操作时。

  3. Lambda 表达式的闭包问题: 在使用 Lambda 表达式时,需要注意对外部变量的访问,因为 Lambda 表达式默认是对外部变量的“读取”操作,对于局部变量需要是最终的(effectively final)。

总结:

Java 的语法糖提供了一系列便捷性,使得代码更加简洁、易读,并提高了开发效率。然而,在使用语法糖时需要注意可能遇到的一些陷阱,如泛型类型擦除、自动装箱拆箱的性能开销,以及 Lambda 表达式的闭包问题。理解这些细节有助于更好地利用语法糖,同时避免潜在的问题。

喜欢的话点点赞收藏一下谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/268244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法学习【算法思想之二分法基础】

文章目录 数据结构与算法学习【算法思想之二分查找基础】本文学习目标或巩固的知识点 最基础的二分查找&#x1f7e2;通过题目可知题解结果验证 数据结构与算法学习【算法思想之二分查找基础】 本文学习目标或巩固的知识点 学习二分法类题目 巩固基础的二分法 提前说明&#…

机器人持续学习基准LIBERO系列10——文件结构

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…

(二)逻辑回归与交叉熵--九五小庞

什么是逻辑回归 线性回归预测的是一个连续值&#xff0c;逻辑回归给出的“是”和“否”的回答 Singmoid sigmoid函数是一个概率分布函数&#xff0c;给定某个输入&#xff0c;它将输出为一个概率值 逻辑回归损失函数 平方差所惩罚的是与损失为同一数量级的情形&#xff0…

Unity铰链四杆机构设计和运动仿真

一、效果图 设定好各边长度和转速后&#xff0c;点击【设置并启动】&#xff0c;自动生成一个机构模型&#xff0c;并按照原理进行运转 二、铰链四杆机构介绍 机架&#xff1a;A和D是固定位置&#xff0c;叫做机架。 曲柄&#xff1a;B点绕A点旋转&#xff0c;构成曲柄。 连…

vSphere资源管理

一 内存、CPU、资源池和vApp 内存部分&#xff1a; 关联VM内存 我们可以超额的关联内存给VM。例如&#xff1a;ESXI物理主机内存只有8G&#xff0c;但我们可以给三个VM都分配4G内存。 2.ESXI四大高级内存控制技术 a.Page sharing&#xff08;透明的页面共享&#xff09; 虚…

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述&#xff1a;php没有难题 考点总结&#xff1a;脑洞题目&#xff0c;不如我出&#xff08;狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候&#xff0c;提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …

WebServer -- 注册登录

目录 &#x1f349;整体内容 &#x1f33c;流程图 &#x1f382;载入数据库表 提取用户名和密码 &#x1f6a9;同步线程登录注册 补充解释 代码 &#x1f618;页面跳转 补充解释 代码 &#x1f349;整体内容 概述 TinyWebServer 中&#xff0c;使用数据库连接池实现…

PDN分析及应用系列二-简单5V电源分配-Altium Designer仿真分析-AD

PDN分析及应用系列二 —— 案例1:简单5V电源分配 预模拟DC网络识别 当最初为PCB设计打开PDN分析仪时,它将尝试根据公共电源网络命名法从设计中识别所有直流电源网络。 正确的DC网络识别对于获得最准确的模拟结果非常重要。 在示例项目中已经识别出主DC网络以简化该过程。 …

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

二十三、剖析 LinkedList

剖析 LinkedList 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 ArrayList随机访问效率很高&#xff0c;但插入和删除性能比较低&#xff1b;LinkedList同样实现了List接口&#xff0c;它的特点与ArrayList几乎正好相反。除了实现了L…

从第一原理看大语言模型

大模型基础框架 大模型幻觉问题 大模型能力 思维链模式 思维链模式激发的是大模型的推理能力 LLM知识能力RAG

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

实用工具:实时监控服务器CPU负载状态并邮件通知并启用开机自启

作用&#xff1a;在服务器CPU高负载时发送邮件通知 目录 一、功能代码 二、配置开机自启动该监控脚本 1&#xff0c;配置自启脚本 2&#xff0c;启动 三、功能测试 一、功能代码 功能&#xff1a;在CPU负载超过预设置的90%阈值时就发送邮件通知&#xff01;邮件内容显示…

【LeetCode:225. 用队列实现栈 + 栈 | 队列】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

有人吐槽:可视化大屏面向领导的设计,真相是这样吗?

某些老铁的态度很极端&#xff0c;看到可视化大屏页面就一口断定&#xff0c;除了讨好领导之外&#xff0c;屁用没有。真相是这样吗&#xff1f;贝格前端工场尝试给老铁们分析下。 一、可视化大屏确实要面向领导&#xff0c;但不是讨好领导 可视化大屏的设计需要考虑领导和管理…

如何使用grafana 下JSON API访问展示接口数据

一.新增connection 点击左侧菜单栏&#xff0c;选择Add new connection 下载安装即可。 二. 增加对应url和参数 1. 添加新的数据源 2. 配置对应url 3.新建仪表盘和添加接口url和参数等

Vins-Moon配准运行

Vins-Moon运行 求助&#xff01;&#xff01;&#xff01;源码地址电脑配置环境配置编译Kitti数据集制作IMU时间戳问题 适配Kitti数据集运行结果Euroc数据集kitti数据集 evo评估&#xff08;KITTI数据&#xff09;输出轨迹(tum格式)结果 求助&#xff01;&#xff01;&#xff…

React Switch用法及手写Switch实现

问&#xff1a;如果注册的路由特别多&#xff0c;找到一个匹配项以后还会一直往下找&#xff0c;我们想让react找到一个匹配项以后不再继续了&#xff0c;怎么处理&#xff1f;答&#xff1a;<Switch>独特之处在于它只绘制子元素中第一个匹配的路由元素。 如果没有<Sw…

【Prometheus】基于Altertmanager发送告警到多个接收方、监控各种服务、pushgateway

基于Altertmanager发送报警到多个接收方 一、配置alertmanager-发送告警到qq邮箱1.1、告警流程1.2、告警设置【1】邮箱配置【2】告警规则配置【3】 部署prometheus【4】部署service 二、配置alertmanager-发送告警到钉钉三、配置alertmanager-发送告警到企业微信3.1、注册企业微…

vue3基础教程(1)——nodejs环境搭建

博主个人小程序已经上线&#xff1a;【中二少年工具箱】 小程序二维如下&#xff1a; 正文开始 专栏简介1. 环境菜单2.为什么下载node3. nodejs简介4. nodejs安装5. 编辑器选择 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。…