作者:是中心呀
# 什么是语法糖
语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了。这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能、或能提升语法的严谨性、或能减少编码出错的机会。
# 可变参
public class testSuger { public static void main(String[] args) { print("yan","zhong","xin"); String[] strs = {"yan", "zhong", "xin"}; print2(strs); } public static void print(String... strings){ System.out.println("传递的是几个字符串"); for (int i=0;i ) { System.out.println(strings[i]); } } public static void print2(String... strings){ System.out.println("传递的是一个字符串数组"); for (String string:strings ) { System.out.println(string); } System.out.println(strings instanceof String[]); }}
结果为:
从print方法中可以看出,可以使用遍历数组的方式遍历可变参数,通过print1方法,判断strings instanceof String[] 可以知道可变参数是利用数组实现的。可以创建一个数组,传进给可变参数位置。
注意:可变参必须是参数列表中最后一个,而且最多只能有一个可变参数。
# foreach循环原理
首先,我们回顾一下java中遍历的方式一般有三种:fori,Iterator,foreach。
import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class foreachTest { public static void main(String[] args) { ArraySplit();IteratorSplit();foreachSplit(); } public static void ArraySplit(){ String [] strings=new String[]{"yan","zhong","xin"}; for (int i=0;i System.out.println(strings[i]); } } public static void IteratorSplit(){ Listlist=new ArrayList(); list.add("yan"); list.add("zhong"); list.add("xin"); Iterator iterator=list.iterator(); while (iterator.hasNext()){ String s=(String) iterator.next(); System.out.println(s); } } public static void foreachSplit(){ Listlist=new ArrayList(); list.add("yan"); list.add("zhong"); list.add("xin"); for (String s:strings ) { System.out.println(s); } }}
老规矩,上面既然是 foreach 用法,那就编译成 class 然后用 javap(推荐:漫画:奇怪,为什么在Java中 2*(i*i) 比 2*i*i 快?) 看下字节码咯,如下:
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(s)){ s = (String)iterator.next(); }
反编译可以知道,foreach底层是利用迭代器实现的,初始化获得迭代器,判断条件hasNext(),然后获得nextz(),最后打印这个结果。
注意:迭代器使用过程中,禁止修改迭代器中的内容。否侧会抛出java.util.ConcurrentModificationException。推荐:原创:如何来判断一个List是否有序?
通过反编译可以看出foreach的遍历底层就是利用传统的fori经典遍历方式进行遍历: