1.语法糖
要说语法糖,首先要知道语法糖的含义.我们看百度百科中的定义,语法糖(Syntactic sugar),也译为糖衣语法,
是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,
这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会.
在JDK1.5之后,增加了很多语法糖,常用的如泛型,变长参数,自动装箱/拆箱,遍历循环(foreach).
今天,我们说一下语法糖之一自动装箱拆箱的梗.
2.语法糖之一--自动装箱/拆箱
在Java语言中,自动装箱(autoBoxing)是指将基本的数据类型(byte,short,char,int,long,float,double,boolean)
转换成对应的封装类(Byte,Short,Character,Integer,Long,Float,Double,Boolean),拆箱(unboxing)过程则是把
对应的封装类对象还原成基本数据类型的过程,是我们常用的语法糖之一.
今天我们以java中字节码的形式去解释一些在自动装箱/拆箱中常见易答错问题.
例1:
Integer a = 1;
Integer b = 1;
那么,打印a==b返回什么?
我们通过字节码+源码的形式去分析自动装箱.
首先,Integer a = 1的自动装箱过程是在编译器将".java"代码编译成".class"过程中进行的.
在字节码中,我们可以清楚的看到,自动装箱过程是使用了Integer类中的静态方法valueOf(int i),它的参数是一个int值,返回类型是Integer对象.见图.
我们去Integer类中找到该方法,看下源码中是怎么做的.见图.
在源码中,我们可以看到,Integer将-128~127之间的Integer对象都缓存在了私有静态内部类IntegerCache的静态常量数组cache[]中.如果超出此范围,则需要新创建Integer对象.
也就是说,在-128~127范围内的数值,自动装箱成包装类Integer后,指向的是同一个内容.
我们知道,方法中的局部变量是放在Java虚拟机栈栈帧的局部变量表中,而常量是放在方法区的.所以,此时,局部变量表中的引用类型a和b都指向了方法区中的cache[1+128]位置.所以,我们可以明确得出a==b打印出来是true.
例2:
Integer a = 257;
Integer b = 257;
那么,打印a==b返回什么?a.equals(b)呢?(此问题问过很多老鸟,答对着寥寥无几)
根据例1中的源码分析,我们可以知道,超过-128~127范围内的数值,在自动装箱时候,会新创建Integer对象,而对象的创建是在堆中完成的.因此,此时栈帧中引用类型a,b指向的是两个对象(引用类型中存放的是对象的地址或者句柄地址).所以,我们可以明确得出a==b打印是false.
对于a.equals(b),我们需要看一下Integer中equals源码部分.见图.
在源码中,我们可以清楚看到,在包装类对象比较使用equals时,当比较的对象是Integer的实例时,equals方法中做了拆箱操作,返回的是值与值的比较结果(257==257),所以,使用equals比较返回的结果a.equals(b)返回true.
如果不是Integer的实例,根据源码,直接返回false.
相关推荐
自动装箱(Auto Boxing)和拆箱(Auto Unboxing)是Java 5引入的另一个语法糖,它简化了基本类型与它们对应的包装类之间的转换。例如,int和Integer之间的转换不再需要显式调用构造函数或valueOf方法。 糖块六:内部类 ...
标题中的"syntactic-sugar-sequence"是一个编程术语,通常指的是语法糖,它是指在编程语言中,为了使代码更简洁、易读而引入的一些语法特性。在Java中,语法糖扮演着重要的角色,提高了代码的可读性和编写效率。例如...
这个主题与“Syntactic-LL-1-master”项目紧密相关,虽然标题并未直接指出,但从描述来看,我们可以推测这可能是一个研究或实现网络拥塞控制策略的代码库。在TCP/IP协议栈中,拥塞控制是为了防止过多的数据同时充斥...
C#语法糖,也称为语法便利,是C#语言中的一种特性,旨在提供更简洁、易读的代码,同时保持其高效性和灵活性。这些语法糖让开发者能够更快地编写代码,而无需牺牲程序的性能。以下是一些重要的C#语法糖的详细说明: ...
在Python的生态系统中,`syntactic_tagger`是一个用于句法分析的库,版本号为1.0.1,我们在这里讨论的是其在PyPI上的发布形式——`syntactic_tagger-1.0.1-py3-none-any.whl`。 首先,我们要明白`.whl`文件的含义。...
在编程世界中,"语法糖"(Syntactic Sugar)是一种术语,用来描述为了提高代码可读性和简化复杂概念而引入的语法结构。在JavaScript开发中,语法糖扮演着重要的角色,让开发者能够以更简洁、更直观的方式编写代码。...
Java语言作为一种广泛使用的编程语言,其语法分析是编译器设计和开发过程中的关键环节。语法分析是将源代码转化为抽象语法树(AST)的过程,它解析源代码的结构,确保代码符合语法规则。本篇文章将深入探讨如何在...
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。 ...
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。...
在编程领域,语法糖(Syntactic Sugar)是指通过提供更简洁、更易读的语法来增强语言表达力的特性。SugarLoader就是通过这种方式,将Loader API的底层实现隐藏起来,让开发者能够以更简洁的方式来使用Loader。 ...
资源分类:Python库 所属语言:Python 资源全名:syntactic_tagger-1.0.8.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
2. **词性标注**(Part-of-Speech Tagging):识别每个词汇的语法角色,如名词、动词、形容词等,这对于理解句子结构至关重要。 3. **命名实体识别**(Named Entity Recognition, NER):找出文本中的专有名词,如...
词法和语法分析的练习程序 词法分析部分通过配置文件中的正则表达式, 去构建自动机, 依次来进行词法分析。 配置文件的规则及样例请见bfn.data 被分析的源代码存于code.data 词法分析后的结果存放于lex.data 词法...
- 语法糖:编程语言设计者引入语法糖(syntactic sugar)来简化代码,这依赖于编译器对语言语法的理解。 总结,"编译语法分析实验报告"不仅涵盖了编译原理的核心概念,如语法分析的理论与实践,同时也提醒我们,...
通过将语法模式识别方法应用于ECG的识别与参数测量,本研究为自动ECG处理提供了一种新的思路。利用属性文法的强大描述能力,该方法不仅能够准确地识别ECG信号中的关键特征,还能够测量重要的参数。通过对标准标注ECG...
语法是用于构造通用神经网络的简单C ++库。 目前,该库支持为前馈反向传播算法以及时间序列网络创建多层网络。 不久将实施更多。
在编程语言Go中,语法糖(Syntactic sugar)是一种为提高代码可读性和编写便捷性的语法构造。本文将深入探讨Go语言中的“…”(三元运算符)这一语法糖的使用方法及其带来的益处。 “…”在Go语言中有两个主要的...
Irab Al-Ishraf(إعرابالأشراف)是一个Java应用程序,用于基于自然语言处理技术的阿拉伯短句的句法定位。 该应用程序使用Madamira(camel.abudhabi.nyu.edu/madamira/)进行形态分析,并使用Stanford...