Java中部分常见语法糖
语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。
参考:https://blog.csdn.net/danchu/article/details/54986442
泛型
java泛型学习笔记
http://blog.csdn.net/uncle_gy/article/details/77881849
java泛型擦除和泛型重载
http://blog.csdn.net/uncle_gy/article/details/78501893
java的PECS原则
http://blog.csdn.net/uncle_gy/article/details/77877002
自动装箱、拆箱和循环遍历(Foreach)
示例代码:
import java.util.List;
import java.util.ArrayList;
public class JavaCandy{
public static void main(String[]args){
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
int sum=0;
for(int i:list){
sum+=i;
}
System.out.println(sum);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
反编译class
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class JavaCandy
{
public static void main(String[] paramArrayOfString)
{
ArrayList localArrayList = new ArrayList();
localArrayList.add(Integer.valueOf(1));
localArrayList.add(Integer.valueOf(2));
localArrayList.add(Integer.valueOf(3));
int i = 0;
for (Iterator localIterator = localArrayList.iterator(); localIterator.hasNext();)
{
int j = ((Integer)localIterator.next()).intValue();
i += j;
}
System.out.println(i);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
结果分析:
看到自动调用了以下语句:
localArrayList.add(Integer.valueOf(1));//装箱
int j = ((Integer)localIterator.next()).intValue();//拆箱
1
2
自动装箱拆箱的陷阱
实例代码:
public class JavaCandy{
public static void main(String[]args){
Integer a=1;
Integer b=2;
Integer c=3;
Integer d=3;
Integer e=321;
Integer f=321;
Long g=3L;
System.out.println(c==d);
System.out.println(e==f);
System.out.println(c==(a+b));
System.out.println(c.equals(a+b));
System.out.println(g==(a+b));
System.out.println(g.equals(a+b));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
反编译代码:
import java.io.PrintStream;
public class JavaCandy
{
public static void main(String[] paramArrayOfString)
{
Integer localInteger1 = Integer.valueOf(1);
Integer localInteger2 = Integer.valueOf(2);
Integer localInteger3 = Integer.valueOf(3);
Integer localInteger4 = Integer.valueOf(3);
Integer localInteger5 = Integer.valueOf(321);
Integer localInteger6 = Integer.valueOf(321);
Long localLong = Long.valueOf(3L);
System.out.println(localInteger3 == localInteger4);
System.out.println(localInteger5 == localInteger6);
System.out.println(localInteger3.intValue() == localInteger1.intValue() + localInteger2.intValue());
System.out.println(localInteger3.equals(Integer.valueOf(localInteger1.intValue() + localInteger2.intValue())));
System.out.println(localLong.longValue() == localInteger1.intValue() + localInteger2.intValue());
System.out.println(localLong.equals(Integer.valueOf(localInteger1.intValue() + localInteger2.intValue())));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
输出结果
Integer.valueof()方法
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
1
2
3
可以看到如果在(-128,128]的区间内的值就会直接从SMALL_VALUES数组中直接取值,如果大于这个范围就会新建一个类。
什么是SMALL_VALUES[i+128]
private static final Integer[] SMALL_VALUES = new Integer[256];
1
自动拆箱和装箱操作是一个耗费资源的过程,所以比较小的值就直接保存到内存里。
变长参数
示例代码:
public class JavaCandy{
public static void method(int...a){
for(int i:a)
System.out.println(i);
}
public static void main(String[]args){
System.out.println("this is method(1);");
method(1);
System.out.println("this is method(1,2);");
method(1,2);
System.out.println("this is method(1,2,3);");
method(1,2,3);
System.out.println("this is method(1,2,3,4);");
method(1,2,3,4);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
反编译结果
import java.io.PrintStream;
public class JavaCandy
{
public static void method(int... paramVarArgs)
{
for (int k : paramVarArgs) {
System.out.println(k);
}
}
public static void main(String[] paramArrayOfString)
{
System.out.println("this is method(1);");
method(new int[] { 1 });
System.out.println("this is method(1,2);");
method(new int[] { 1, 2 });
System.out.println("this is method(1,2,3);");
method(new int[] { 1, 2, 3 });
System.out.println("this is method(1,2,3,4);");
method(new int[] { 1, 2, 3, 4 });
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
可以看到此时参数自动变为数组类型。
条件编译
示例代码:
public class JavaCandy{
public static void main(String[]args){
if(true){
System.out.println("block1");
}else{
System.out.println("block2");
}
}
}
1
2
3
4
5
6
7
8
9
10
反编译结果:
import java.io.PrintStream;
public class JavaCandy
{
public static void main(String[] paramArrayOfString)
{
System.out.println("block1");
}
}
1
2
3
4
5
6
7
8
9
10
此时在if语句中会根据布尔值常量的真假,编译器会把分支中不成立的代码块消除掉。这一工作在编译器解除语法糖阶段完成。
只有if语句才有上面的效果,其他语句会显示拒绝编译。
比如:
public class JavaCandy{
public static void main(String[]args){
while(false){
System.out.println("block1");
}
}
}
1
2
3
4
5
6
7
8
输出结果:
java中类的定义使用class,枚举类的定义使用enum。在Java的字节码结构中,其实并没有枚举类型,枚举类型只是一个语法糖,在编译完成后被编译成一个普通的类。这个类继承java.lang.Enum,并被final关键字修饰。
枚举类型
枚举类型就是一些具有相同特性的类常量
java中类的定义使用class,枚举类的定义使用enum。在Java的字节码结构中,其实并没有枚举类型,枚举类型只是一个语法糖,在编译完成后被编译成一个普通的类。这个类继承java.lang.Enum,并被final关键字修饰。
public enum Fruit {
APPLE,ORINGE
}
1
2
3
使用jad对编译后的class文件进行反编译后得到:
public final class Fruit extends Enum
{
public static Fruit[] values()
{
return (Fruit[])$VALUES.clone();
}
public static Fruit valueOf(String s)
{
return (Fruit)Enum.valueOf(Fruit, s);
}
private Fruit(String s, int i)
{
super(s, i);
}
//枚举类型常量
public static final Fruit APPLE;
public static final Fruit ORANGE;
private static final Fruit $VALUES[];//使用数组进行维护
static
{
APPLE = new Fruit("APPLE", 0);
ORANGE = new Fruit("ORANGE", 1);
$VALUES = (new Fruit[] {
APPLE, ORANGE
});
}
}
---------------------
作者:uncle_gy
来源:CSDN
原文:https://blog.csdn.net/uncle_gy/article/details/78505498
版权声明:本文为博主原创文章,转载请附上博文链接!
Java中部分常见语法糖的更多相关文章
- Java的12个语法糖【转】
本文转载自公众号 Hollis 原创: 会反编译的 Hollis 侵权删 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学 ...
- python全栈开发_day14_常见语法糖,递归和匿名函数
一:常见语法糖 1)三元函数(三目函数) a=1 if 3>2 else 2 print(a) #得到返回值:1 2)列表字典推导式 lis=[("a",1),(" ...
- vue 中的.sync语法糖
提到父子组件相互通信,可能大家的第一反应是$emit,最近在学着封装组件,以前都是用的别人封装好的UI组件,对vue中的.sync这个修饰符有很大的忽略,后来发现这个修饰符很nice,官方对她的描述是 ...
- Java中的标签语法(类似于C语言goto循环体)
Java中的标签语法(少用) 101到150的质数 此法类似于C语言中的GOTO循环 public static void main(String[] args) { int count=0; //标 ...
- 超好用的Markdown编辑器Typora中的常见语法
目录 下载网址 安装 一.标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二.语法环境 三.单选 四.字体 五.分割符 六.列表 七.图片引入 八.表格 九.超链接 下载网址 正版中 ...
- JAVA中字符串常见操作
String str1="hello,world";String str2="Hello,World"; 1.字符串的比较:例,System.out.print ...
- Java 中最常见的 5 个错误
在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...
- Java学习之道:Java中十个常见的违规编码
近期,我给Java项目做了一次代码清理工作.经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错误)反复出如今代码中.因此,我把常见的这些违规编码总结成一份列表,分享给大家以帮助Java ...
- Java中十个常见的违规编码
摘要:作者Veera Sundar在清理代码工作时发现一些常见的违规编码,因此,Veera Sundar把针对常见的一些违规编码总结成一份列表,以便帮助Java爱好者提高代码的质量和可维护性. 最近, ...
随机推荐
- JAVA中各种日期表示字母
字母 日期或时间元素 表示 示例 G Era 标志符 Text AD y 年 Year 1996; 96 M 年中的月份 Month July; Jul; 07 w 年中的周数 Number 27 W ...
- matplotlib画图
matplotlib画图 import numpy as np import matplotlib.pyplot as plt x1=[20,33,51,79,101,121,132,145,162, ...
- 性能测试二十五:redis-cli 命令总结
常用命令dbsize:查看redis中的kv数量 keys *:查看redis中所有的keyset key_1 v_1:新增一个key_1,包含v_1get key_1:查看key_1中的内容del ...
- intellij idea svn 修改文件后,父文件夹也标注修改
svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观:查了一顿后,发现,可以设置: File—->settings—->version control—–>勾选show ...
- python 全栈开发,Day7(元组转换,列表以及字典的坑,集合,关系测试,深浅copy,编码补充)
一.元组转换 数字 tu = (1) tu1 = (1,) print(tu,type(tu)) print(tu1,type(tu1)) 执行输出: 1 <class 'int'>(1, ...
- 如何批量的在django中对url进行用户登陆限制
参考URL: https://blog.csdn.net/hanshengzhao/article/details/79540306?utm_source=blogxgwz0 1,首先定义一个内部有装 ...
- Jetty部署
http://www.orchome.com/127 https://blog.csdn.net/zhanngle/article/details/77591526
- [转] Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程
一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合 ...
- #14 [BZOJ2090/2089] [Poi2010]Monotonicity 2/Monotonicity
题解: 首先想到了标算..然后证明了一发是错的(事实证明很智障) 先说正确性比较显然的O(n^2)算法 令f[i][j]表示前i个物品,匹配到第j个括号,最大值是多少 g[i][j]表示前i个物品,匹 ...
- python日期与时间
1.介绍 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表 ...