Java中的语法糖

20 篇文章 0 订阅
3 篇文章 0 订阅

语法糖简介

语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。

很多人说Java是一个“低糖语言”,其实从Java 7开始Java语言层面上一直在添加各种糖,主要是在“Project Coin”项目下研发。尽管现在Java有人还是认为现在的Java是低糖,未来还会持续向着“高糖”的方向发展。

语法糖介绍

可能对于第一次听说语法糖的人来说,百度出来的简介并不能让你有一个比较清晰的认知,只知道是一种语法,并且是方便程序员的使用。那我换一种说法,Switch语句相信大家都有认知,类型泛型擦除也有一定的了解,那么为什么Java语言能做到呢?这就是语法糖的实现了。

糖块介绍

  • switch支持String与枚举

  • 泛型和类型擦除

  • 自动装箱与拆箱

  • 方法变长参数

  • 枚举

  • 内部类

  • 条件编译

  • 断言

  • 数值字面量

  • 增强for循环

  • try-with-resource语句

  • Lambda表达式

以上是Java中常用的12种语法糖,如果对Java基础有一定的了解,其中的大部分语法糖都会有所了解。这里就不一一赘述,简单选几个进行介绍。

switch支持String与枚举

Java从1.7开始,switch语句就开始支持String类型枚举了。众所周知,switch语句支持int,char等基本数据类型,而从1.7开始同时也支持String类型,那么String类型枚举到底是怎么实现的呢,让我们看一段代码。

//.java文件
public class Test {
    public static void main(String[] args) {
        String str = "KEKE";
        switch (str) {
            case "KEKET":
                System.out.println(str);
                break;
            case "KEKE":
                System.out.println(str);
                break;
            default:
                break;
        }
    }
}
//编译后的字节码文件
public class Test {
    public Test() {
    }

    public static void main(String[] args) {
        String str = "KEKE";
        byte var3 = -1;
        switch(str.hashCode()) {
        case 2303028:
            if (str.equals("KEKE")) {
                var3 = 1;
            }
            break;
        case 71393952:
            if (str.equals("KEKET")) {
                var3 = 0;
            }
        }

        switch(var3) {
        case 0:
            System.out.println(str);
            break;
        case 1:
            System.out.println(str);
        }
    }
}

很显然,对于String类型,编译后结合了hashcode和equals方法实现,先通过hashcode筛选,再用equals检查哈希碰撞,最后赋值给var3用另一个switch语句实现逻辑。

增强for循环

增强for循环相信大家也经常用,那么增强for循环是怎么实现的呢,同样让我们看一段代码。

import java.util.Arrays;
import java.util.List;
//.java文件
public class Test {
    public static void main(String[] args) {
      String[] str = {"KEKE","JAVA","LUCKLY"};
        for (String s : str) {
            System.out.println(s);
        }
        List<String> list = Arrays.asList(str);
        for (String s : list) {
            System.out.println(s);
        }
    }
}
//编译后的字节码文件
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test {
    public Test() {
    }

    public static void main(String[] args) {
        String[] str = new String[]{"KEKE", "JAVA", "LUCKLY"};
        String[] var2 = str;
        int var3 = str.length;

        for(int var4 = 0; var4 < var3; ++var4) {
            String s = var2[var4];
            System.out.println(s);
        }

        List<String> list = Arrays.asList(str);
        Iterator var7 = list.iterator();

        while(var7.hasNext()) {
            String s = (String)var7.next();
            System.out.println(s);
        }

    }
}

可以看到,代码比较简单。用增强for循环遍历数组的时候在反编译后同样是解析为一个for循环;而遍历集合的时候,是引用了迭代器去遍历实现。

总结

其他的语法糖其实也大差不差,没有比较难得代码,如果想要了解什么就写一段test看看字节码文件,相信你就有个大致的了解了。另外,JAVA8的新特性,比如Lambda表达式,StreamAPI等等同样属于语法糖的范畴。通过这些大概的介绍,相信再去看语法糖简介的时候就有所想法了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值