Java中一些不为人知的写法

2023-02-23 17:29:35 浏览数 (1)

今天阿粉就来说说这个 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 中的一些语法糖,不过他们都是万变不离其宗的写法,至于怎么写,还是自己怎么舒服,怎么合规怎么来,你还知道有什么其他不为人知的写法么?

0 人点赞