今天阿粉就来说说这个 Java 中一些不为人知的写法,为什么呢?因为如果这个项目不是你一开始做的,而是中途接手了别人写的项目,最后你来负责维护,那么就会有各种各样诡异的写法,有时候这些写法看起来真的没有那么高大上,反而对后来的接手你的代码的人不是那么友好,看都看不太明白,今天阿粉就来看看有哪些不为人知的写法,甚至可以称之为鬼畜写法。
标签循环
阿粉直接先给大家来一段代码:
代码语言:javascript复制public static void main(String[] args) {
int arr [] = {21,22,34,45,123,324,512};
System.out.println("开始");
outer:
for (int i = 0; i < arr.length; i ) {
System.out.println(i);
if (arr[i] == 45){
break outer;
}
}
System.out.println("结束");
}
那么什么是标签循环呢?
我们都知道,在 Java 中,我们通常熟悉的是通过 break 和 continue 两个关键字来控制程序的走向,当需要程序从一个地方跳到另一个地方时,就需要要通过标签来实现。
我们具体的来看一段代码:
代码语言:javascript复制 public static void main(String[] args) {
int i = 0;
outer:
while(true){
System.out.println("Outer while loop");
while(true){
i ;
System.out.println("i=" i);
if(i==1){
System.out.println("continue");
continue ;
}
if(i == 3){
System.out.println("continue outer");
continue outer;
}
if(i == 5){
System.out.println("break");
break ;
}
if(i==7){
System.out.println("break outer");
break outer;
}
}
}
}
这段代码的运行结果如下:
代码语言:javascript复制Outer while loop
i=1
continue
i=2
i=3
continue outer
Outer while loop
i=4
i=5
break
Outer while loop
i=6
i=7
break outer
Process finished with exit code 0
1)一般的continue会退回最内层循环的开头(顶部),并继续执行。
2)带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
3)一般的break会中断并跳出当前循环。
4)带标签的break会中断并跳出标签所指的循环。
看到这里,大家应该知道在这个标签循环怎么用了吧,阿粉也是在看 C 语言教程的时候,知道有标签这个东西,进而又去看了 Java ,发现 Java 中也有这种,但是用的人反而并不是那么多。
for循环的变种格式
我们都知道,for 循环有基础的 for 循环,还有增强 for 循环,甚至还有迭代器的循环,但是有些循环写出来,是真的有点让人咂舌,比如上面阿粉的代码。我们来写个简单的案例。
我们都知道基础的 for 循环的格式是这个样子的,
代码语言:javascript复制//基础 for 循环
public static void main(String[] args) {
for (int i = 0; i < 10; i ) {
System.out.println(i);
}
}
但是如果你发现别人的代码,你会看到这种另类的变种 for 循环。
代码语言:javascript复制 public static void main(String[] args) {
int i = 0;
for (;i < 10;) {
System.out.println(i);
i ;
}
}
其实写法上变了,但是本质上没变,有人就总喜欢这么写,整的如果要是不了解点歪的,还不知道他想表达什么意思呢。
List 不按照套路的赋值
我们都知道,一般我们创建List之后,全都是使用add 方法进行赋值,就比如下面这样:
代码语言:javascript复制 List<String> placeTwo = new ArrayList<>();
placeTwo.add("北京");
placeTwo.add("上海");
一般写的话,很多人都会这么写,但是总有一些小伙伴喜欢炫技,直接这么写:
代码语言:javascript复制List<String> place = new ArrayList<String>(){{add("上海");add("北京");}};
同理,Map的赋值,也是可以这么写的:
代码语言:javascript复制
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("key",1234);
map2.put("key1",2334);
简化的写法:
代码语言:javascript复制Map<String,Object> map = new HashMap<String,Object>(){{put("key",1234);put("key1",2334);}};
同样的,在 JDK 的源代码里面也有一些很有意思的写法:
代码语言:javascript复制static {
final int size = -(-128) 127 1;
}
这种写法在 JDK 的源代码里面有很多,这段代码来自于 JDK 的包装类 java.lang.Byte 的静态方法,为什么要这么写呢?
阿粉觉得,可能他是想说明这个数的取值范围是Byte的 256 个数是由 -128~127 这个范围组成的,起到标识数字范围的作用。
其实这种写法还有非常多,比如 JDK9 中的一些语法糖,不过他们都是万变不离其宗的写法,至于怎么写,还是自己怎么舒服,怎么合规怎么来,你还知道有什么其他不为人知的写法么?