- 浏览: 289493 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
狼子六:
已经开始用了
Java 枚举7常见种用法 -
相约的旋律:
方法一下面的"public static fianl ...
Java 枚举7常见种用法 -
kiddy2012:
...
[转载]程序员装B指南 -
fancy105:
写得很好,简单明了双全面!
Java 枚举7常见种用法 -
he_wen:
请问一下 G1算法是否在线上使用了?
Garbage First(G1) 日志分析工具
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会;但是这种语法对语言的功能并没有影响。
Java中的泛型,变长参数,自动拆箱/装箱,条件编译等都是,下面做简单的介绍和分析。
泛型
与C#中的泛型相比,Java的泛型可以算是“伪泛型”了。在C#中,不论是在程序源码中、在编译后的中间语言,还是在运行期泛型都是真实存在的。Java则不同,Java的泛型只在源代码存在,只供编辑器检查使用,编译后的字节码文件已擦除了泛型类型,同时在必要的地方插入了强制转型的代码。
泛型代码:
public static void main(String[] args) { List<String> stringList = new ArrayList<String>(); stringList.add("oliver"); System.out.println(stringList.get(0)); }
将上面的代码的字节码反编译后:
public static void main(String args[]) { List stringList = new ArrayList(); stringList.add("oliver"); System.out.println((String)stringList.get(0)); }
自动拆箱/装箱
自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作。
装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征。
拆箱过程:与装箱过程相反,把包装类型转换成基本类型。
需要注意的是:包装类型的“==”运算在没有遇到算数运算符的情况下不会自动拆箱,而其包装类型的equals()方法不会处理数据类型转换,所以:
自动拆箱/装箱是在编译期,依据代码的语法,决定是否进行拆箱和装箱动作。
装箱过程:把基本类型用它们对应的包装类型进行包装,使基本类型具有对象特征。
拆箱过程:与装箱过程相反,把包装类型转换成基本类型。
需要注意的是:包装类型的“==”运算在没有遇到算数运算符的情况下不会自动拆箱,而其包装类型的equals()方法不会处理数据类型转换,所以:
Integer a = 1; Integer b = 1; Long c = 1L; System.out.println(a == b); System.out.println(c.equals(a));
这样的代码应该尽量避免自动拆箱与装箱。
循环历遍(foreach)
语法:
List<Integer> list = new ArrayList<Integer>(); for(Integer num : list){ System.out.println(num); }
Foreach要求被历遍的对象要实现Iterable接口,由此可想而知,foreach迭代也是调用底层的迭代器实现的。反编译上面源码的字节码:
List list = new ArrayList(); Integer num; Integer num; for (Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(num)){ num = (Integer) iterator.next(); }
条件编辑
很多编程语言都提供了条件编译的途径,C,C++中使用#ifdef。Java语言并没有提供这种预编译功能,但是Java也能实现预编译。
很多编程语言都提供了条件编译的途径,C,C++中使用#ifdef。Java语言并没有提供这种预编译功能,但是Java也能实现预编译。
if(true){ System.out.println("oliver"); }else{ System.out.println("lee"); }
这段代码的字节码反编译后只有一条语句:
System.out.println("oliver");
在编译器中,将会把分支不成立的代码消除,这一动作发生在编译器解除语法糖阶段。
所以说,可以利用条件语句来实现预编译。
所以说,可以利用条件语句来实现预编译。
枚举
枚举类型其实并不复杂,在JVM字节码文件结构中,并没有“枚举”这个类型。
其实源程序的枚举类型,会在编译期被编译成一个普通了类。利用继承和反射,这是完全可以做到的。
看下面一个枚举类:
public enum EnumTest { OLIVER,LEE; }
反编译字节码后:
public final class EnumTest extends Enum { private EnumTest(String s, int i) { super(s, i); } public static EnumTest[] values() { EnumTest aenumtest[]; int i; EnumTest aenumtest1[]; System.arraycopy(aenumtest = ENUM$VALUES, 0, aenumtest1 = new EnumTest[i = aenumtest.length], 0, i); return aenumtest1; } public static EnumTest valueOf(String s) { return (EnumTest) Enum.valueOf(EnumTest, s); } public static final EnumTest OLIVER; public static final EnumTest LEE; private static final EnumTest ENUM$VALUES[]; static { OLIVER = new EnumTest("OLIVER", 0); LEE = new EnumTest("LEE", 1); ENUM$VALUES = (new EnumTest[] { OLIVER, LEE }); } }
至于更多细节,可以参考父类Enum。
变长参数
变长参数允许我们传入到方法的参数是不固定个数。
对于这个方法:
变长参数
变长参数允许我们传入到方法的参数是不固定个数。
对于这个方法:
public void foo(String str,Object...args){ }
我们可以这样调用:
foo("oliver"); foo("oliver",new Object()); foo("oliver",new Integer(1),"sss"); foo("oliver",new ArrayList(),new Object(),true,1);
参数args可以是任意多个。
其实,在编译阶段,args是会被编译成Object [] args。
其实,在编译阶段,args是会被编译成Object [] args。
public transient void foo(String s, Object aobj[]) { }
这样,变长参数就可以实现了。
但是要注意的是,变长参数必须是方法参数的最后一项。
除了上面介绍的语法糖,还有内部类,断言以及JDK7的switch支持字符串,自动关闭资源(在try中定义和关闭)等。
感兴趣的同学可以反编译字节码了解它们的本质。
无疑,语法糖方便了程序员的开发,提高了开发效率,提升了语法的严谨也减少了编码出错误的几率。我们不仅仅在平时的编码中依赖语法糖,更要看清语法糖背后程序代码的真实结构,这样才能更好的利用它们。
但是要注意的是,变长参数必须是方法参数的最后一项。
除了上面介绍的语法糖,还有内部类,断言以及JDK7的switch支持字符串,自动关闭资源(在try中定义和关闭)等。
感兴趣的同学可以反编译字节码了解它们的本质。
无疑,语法糖方便了程序员的开发,提高了开发效率,提升了语法的严谨也减少了编码出错误的几率。我们不仅仅在平时的编码中依赖语法糖,更要看清语法糖背后程序代码的真实结构,这样才能更好的利用它们。
发表评论
-
Java压缩/解压缩二进制文件
2013-02-08 13:56 5740在Java中提供Deflater和Inflater工具类来 ... -
java常用并发工具介绍
2013-02-06 23:22 1628本文主要介绍的工具包括: CountDownLa ... -
Garbage First(G1) 日志分析工具
2012-12-22 22:35 2211G1介绍:http://softbeta.iteye.com/ ... -
Spring源码阅读——Ioc初始化过程
2012-11-20 21:52 1269以web项目启动为例,介绍一下Ioc容器的初始化。 下面这个 ... -
Spring源码阅读——获得bean
2012-10-20 20:57 3193已XmlWebApplicationContext为例,从ge ... -
Spring源码阅读——BeanFactory体系结构
2012-10-10 18:10 2242以下是看代的码随笔,想到哪写到哪,没有组织逻辑,见谅见谅。 ... -
生成随机数组
2012-09-11 20:23 10891.要求生成一组n位的数字,0-9...(n个)之间的稠密集合 ... -
O(1)复杂度获得栈中的极值
2012-09-09 23:47 1302设计一个栈,O(1)复杂度实现入栈,出栈,栈中最大值,栈中最小 ... -
ubuntu12.04上编译openjdk7
2012-06-13 15:31 4913获取源码 从openjdk代码仓库获取(比较慢) ... -
jinfo 查看、设置JVM参数
2012-04-25 15:36 5154用法: # jinfo -h Usage: ... -
一些参数,弥补CMS(Concurrent Mark-Sweep)收集器的缺点
2012-03-28 21:11 1681CMS缺点:http://softbeta.iteye ... -
[转载]PrintCompilation 参数解释
2012-03-27 13:59 1550英文不好,所以就不翻译了: b Blocking co ... -
《Head First 设计模式》读书笔记
2012-03-01 11:30 15461.策略模式(Strategy) ... -
解决jrobin图像中文乱码
2012-02-14 23:31 1161目前发现一种方法可以解决,做个标记。 利用字体: RrdG ... -
Java内存管理——垃圾收集概念及特点
2012-02-03 12:37 1065碎碎念,介绍Java内存管 ... -
[转载]hotspot源码(JDK7)
2012-01-19 19:25 1565源码结构图,方便理解: ├─agent ... -
跨平台获取java进程id(Process ID in Java)
2012-01-18 19:20 9161原创地址:http://blog.lichengwu.cn/ ... -
了解CMS(Concurrent Mark-Sweep)垃圾回收器
2011-12-27 20:13 121101.总体介绍: CMS(Concurrent Mark- ... -
fail-fast
2011-12-13 19:34 1047fail-fast:快速失败 一般情况下,在对集合进行迭代( ... -
利用VisualVM监视远程JVM
2011-11-17 20:06 4720VisualVM介绍 VisualVM是集成了多个JDK命令 ...
相关推荐
在编程世界中,语法糖(Syntactic Sugar)是一种设计语言时引入的特性,它不增加新的功能,而是提供更简洁、更易读的语法,使得编写代码更为方便。这一概念由Peter J. Landin提出,自那时以来,许多编程语言都采用了...
标题中的"syntactic-sugar-sequence"是一个编程术语,通常指的是语法糖,它是指在编程语言中,为了使代码更简洁、易读而引入的一些语法特性。在Java中,语法糖扮演着重要的角色,提高了代码的可读性和编写效率。例如...
* box & unbox:语法糖(Syntactic Sugar),将基本类型转换为对象引用和将对象引用转换为基本类型。 * NPE(NullPointerException)和 == 操作符的区别。 Guava 框架知识点: * Guava 的设计理念:优秀的 API ...
在Python中,编译器的优化也涉及到语法糖(syntactic sugar)和内置类型,这些设计使得Python代码更易读,更简洁。例如,列表推导式、生成器表达式和装饰器都是Python编译器在后台进行优化的实例。 在提供的压缩包...
Groovy的动态特性使得在运行时可以修改和扩展程序,而它的语法糖(syntactic sugar)则让代码更加易读易写。 在DSL的世界里,Groovy可以用于创建内部DSL(Internal DSL),它将DSL嵌入到Groovy代码中,通过优雅的...
在这个版本中,Groovy更加强调与Java的互操作性,同时也增强了语法糖(syntactic sugar)以简化编程任务。 1. **动态类型与静态类型的结合**: Groovy 2.4引入了静态类型检查(@CompileStatic)的特性,允许开发者...
GNU C编译器(GCC)是GNU项目的编译系统组成...最后,文档还提到了向Java结构的字符串()方法添加语法糖(Syntactic Sugar)和从Ruby函数中调用代码块等概念,这些是高级编程技术,涉及到语言特性的增强和跨语言编程技巧。
这个库的名称暗示了其核心特性——通过一个简洁的语法糖(syntactic sugar),让开发者能够更加流畅地使用Java的功能接口。 首先,我们来理解一下什么是Java的功能接口。在Java 8及以后的版本中,为了支持函数式...
1. **语法糖(Syntactic Sugar)**:WurstCore引入了一种名为Wurst的编程语言,它是基于Java的,但通过提供更简洁、直观的语法来简化modding过程。例如,它支持链式方法调用和更简洁的条件语句,使得代码更加可读和...
LogicSugar就是一个这样的通用扩展工具类,它提供了一些方便的语法糖(Syntactic Sugar),使得代码更加简洁易读,尤其在处理条件判断和逻辑操作时。下面我们将详细介绍LogicSugar中的主要功能及其使用方法。 1. **...