Java中有哪些语法糖?

不要你写汇编,Java句句是糖

不能同意上面的这句话,要说为什么,首先要定义下面要讲的“语法糖”。

语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,并没有给语言添加什么新东西,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
语法糖_百度百科

从上面可以看出,就Java语言而言,语法糖并没有给class级别的代码新增其他特性,而是借助编译器,实现了基于编译器的新语法。这种新语法方便易用,可读性好易维护,所以称之为“糖”。下面谈到的都是基于编译器的语法糖。

1. 自动装箱与拆箱(Autoboxing and unboxing)(JDK 1.5)

代码

Integer amount = 100;

编译后,就自动装箱为

Integer amount = Integer.valueOf(100);

同样的,自动拆箱

Integer amount = ...;
int x = amount; // 实际为: int x = amount.intValue();

可以看出,自动拆箱是有可能抛出NullPointerException的,要留意避免。

2. 泛型与类型擦除(JDK 1.5)

从JDK 1.5开始,Java引入了泛型,但Java的泛型是通过类型擦除实现的(当然有很多人吐槽这不是真正的泛型),即只在源代码中有泛型定义,到了class级别就被擦除了(类的成员变量的泛型可以通过反射获取到)。

Map<String,String> map = new HashMap<String,String>();
map.put("hello world","你好啊,李银河");
String hello = map.get("hello");
System.out.println(hello);

// 编译后,反省被擦除,并引入强制类型转换
Map map = new HashMap(); //类型擦除
map.put("hello", "你好啊,李银河");
String hello = (String)map.get("hello");//强制转换
System.out.println(hello);

3. 方法变长参数(JDK 1.5)

public static void print(String... args) {
    for(String str : args){
        System.out.println(str);
    }
}

// 编译后
public static void print(String... args) {
    String[] var1 = args;
    int var2 = args.length;
    //增强for循环的数组实现方式
    for(int var3 = 0; var3 < var2; ++var3) {
       String str = var1[var3];
            System.out.println(str);
    }
}

4. 接口Iterable支持的foreach语法(JDK 1.5)

很常见,不赘述

5. 枚举类型

6. 接口AutoCloseable支持的try-with-resource语法(JDK 1.7)

7. switch支持枚举、字符串

其他:

JDK1.8 待熟悉了Lambda的本质之后再决定补充与否。

作者:陈鹏
链接:https://www.zhihu.com/question/26971230/answer/268464546

原文地址:https://www.cnblogs.com/GarfieldEr007/p/10205298.html

时间: 2024-10-08 09:22:48

Java中有哪些语法糖?的相关文章

JVM(二):Java中的语法糖

JVM(二):Java中的语法糖 上文讲到在语义分析中会对Java中的语法糖进行解糖操作,因此本文就主要讲述一下Java中有哪些语法糖,每个语法糖在解糖过后的原始代码,以及这些语法糖背后的逻辑. 语法糖 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.

【Java基础】Java中的语法糖

目录 Java中的语法糖 switch对String和枚举类的支持 对泛型的支持 包装类型的自动装箱和拆箱 变长方法参数 枚举 内部类 条件编译 断言 数值字面量 for-each try-with-resource Lambda表达式 Lambda表达式的语法 基本的Lambda例子(实现功能接口) 使用Lambdas排序集合 使用Lambdas和Streams 字符串对+号的支持 参考 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身

Java 中的语法糖

定义:指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会:但是这种语法对语言的功能并没有影响.Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是 泛型:ava的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型 public static void main(String[] args) { List<String> stringList = new ArrayList<String&g

java新的语法糖:Java 8 Lambda表达式

***************************************************************************

不了解这12个语法糖,别说你会Java!

本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语法糖的同时,了解这些语法糖背后的原理 语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用.简而言之,语法糖让程序更加简洁,有更高的可读性. 有意思的是,在编程领域,除了语法糖,还有语法盐和

Java中的10颗语法糖

语法糖(Syntactic Sugar):也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可读性,减少程序代码出错的机会. 相对于C#及许多其他JVM来说,Java在现代编译语言之中属于“低糖语言”.尤其是JDK1.5之前的版本,“低糖”语法也是java语言被怀疑已经“落后”的一个表现方面. 在Javac的源码中,解语法糖的过程由desugar()方法触发,在com.sun.tools.javac.comp.Tr

从jvm角度来解析java语法糖

java有很多语法糖,比如自动拆箱,自动装箱,foreach等等,这些原理相信每一个入门教程里都有讲,但是我相信不是每一个人 都通过查看这些语法糖的字节码来确认这些原理,因为我也是现在才想看一下. 1.自动拆箱和自动装箱 public void test() { Integer integer = 1; int i = integer; } //将常量1放入操作数栈 0: iconst_1 //调用Integer.valueOf 入参为0操作指令压入的1 1: invokestatic #2 /

Javac语法糖之EnumSwitch

Enum在Java中也被当作一个类来处理,并且Enum也算是Java中的语法糖,主要通过Javac中的Lower类来处理枚举这个语法糖的. Java7中允许在swith中使用enum类,如下: public class TestEnumClass { public void test() { Color color = Color.RED; switch (color) { case RED: System.out.println("red"); break; case GREEN:

Java语法糖4:内部类

内部类 最后一个语法糖,讲讲内部类,内部类指的就是在一个类的内部再定义一个类. 内部类之所以也是语法糖,是因为它仅仅是一个编译时的概念,outer.java里面定义了一个内部类inner,一旦编译成功,就会生成两个完全不同的.class文件了,分别是outer.class和outer$inner.class.所以内部类的名字完全可以和它的外部类名字相同. 内部类分为四种:成员内部类.局部内部类.匿名内部类.静态内部类.先逐一了解下,再看下使用内部类有什么好处. 成员内部类 成员内部类是最常见的内