# 流程控制结构

流程控制部分请顺应程序的过程自行品味一番, 你就明白了!

# 条件结构

# if-else条件式

int a = 0;
int b = 1;
if(a == b){ 
    //注意, 比较是否一致应该用双等号, 而不是单等号
    //只有赋值才用单等号
    System.out.println("相等");
}else{
    System.out.println("不相等");
}

输出结果:

不相等

你也可以把else部分去掉单独留下if.

int a = 1;
int b = 1;
if(a == b){ //如果不相等, 那在这里就什么也不输出了
    System.out.println("相等");
}

输出结果

相等

如果if的内容只有一句话, 那可以省略掉if的花括号.

int a = 0;
int b = 1;
if(a == b)
    System.out.println("相等");
else
    System.out.println("不相等");

输出结果

不相等

比较String时不能这样比较, 对象之间比较是否一样应该用equals方法.

String a = "hi";
String b = "hi";
if(a.equals(b)) //你也可以写 b.equals(a)
    System.out.println("相等");
else
    System.out.println("不相等");

输出结果

相等

你还可以表演一波套娃.

String a = "hi";
String b = "hi";
String c = "hello";
if(a.equals(b)){
    System.out.println("相等");
    if(b.equals(c)){
        System.out.println("并且b和c也相等");
    }else{
        System.out.println("但是b和c不相等");
    }
}else{
    System.out.println("不相等");
}

输出结果

相等
但是b和c不相等

其实究其本质, 刚才的比较数字a==b代表着一个boolean值, a.equals(b)的原因是调用了a对象的equals方法, 这个方法的返回值是一个boolean值(还记得boolean吗? 它是8大基本类型之一).
boolean值内容只有两种, truefalse.
也就是, if其实判断的是后面的括号里是true还是false. 你可以这样试试:

if(true){
    System.out.println("你会发现这代码一定会被执行");
} else {
    System.out.println("但是这行代码不会, 所以你在这里骂人, 别人不拆你的程序, 他就不知道.");
}

输出结果

你会发现这代码一定会被执行

同理, 改成if(false)以后, 刚才我说可以用来骂人的地方就会被执行, 别人就可以知道了.

# 对抗null

请看下面的操作:

String str = null; //诶? 我给str的初始值是null
System.out.println(str.equals("hi"));

结果报错了. 报错内容是NullPointerException, 这代表着错误的类型, 你可以在报错内容中找一找NullPointerException, 琢磨一下报错信息怎么看.
学会看报错也是非常重要的本领, 我就不相信你写的插件没报过错!

null代表空指针, 意思是str里面我什么也不放, 我就愿意让它在那里空着.
很明显, str里面没对象, 没对象的话我们str.equals("hi"), 执行的是谁的equals呢? 这就有问题.

如果str代表用户输入的东西, 万一用户给我们一个null过来怎么办? 我们应该警惕null!
对抗null的工具就是if!

String str = null;
if(str == null) {
    System.out.println("你个瓜娃娃是憨批? 啥也不给我让我给你弄啥子?");
} else {
    System.out.println("abc".equals(str));
}

# 与或运算

Java给出了四种运算符, 它们专属于boolean 分别为|||&&&.

前两个为或, 后两个为与. 其实很好理解.
用这个东西的时候需要捋顺它们的逻辑关系.

int i1 = 1;
int i2 = 2;
int i3 = 3;
String str1 = "hi"
String str2 = null;
String str3 = "hi";

//第一步, 我想让i1 i2里任一有个数字是2
if(i1==2 || i2==2){ //这里你可以把 || 改成 |
    //第二步, 我想看看str1 str3是不是都是 hi
    if(str1.equals("hi") && str3.equals("hi")){
        //第三步, 我想看看str1 str2 str3其中是不是有一个是hi
        //注意, str2是null, 比较会报错
        //我感觉这里程序要完蛋了
        if(str1.equals("hi") || str3.equals("hi") || str2.equals("hi")){
            System.out.println("顺利运行");
        }
    }
}

运行结果:

顺利运行

嗯???没报错! 我们认为那里str2是null肯定会报错, 其实并没有.
把那一行的 || 改成 | 以后, 程序因为str2是null报错了.

其实&& 和 ||的意思是“不刨根问底”. 也就是知道结果就跑路.
用这种思乡分析一下刚才没报错的原因, 其实很简单, 它已经发现str1.equals("hi")true了, 直接导致str1.equals("hi") || str3.equals("hi") || str2.equals("hi")整体就是true了, 实际上后面的str3.equals("hi")str2.equals("hi")根本就没被执行.

我们也可以看到&&也有这样的性质

String str1 = "hi"
String str2 = null;
if(str1.equals("hello") && str2.equals("hello")){
    System.out.println("好!");
} else {
    System.out.println("啥?");
}

输出结果

啥?

因为str1.equals("hello")已经是false了, 已经不用继续看了, 那么str2.equals("hello")不会被执行, str1.equals("hello") && str2.equals("hello")整体就是false.

# 英文感叹号

不解释, 直接看:

if(1==2){
    //这里肯定不会被运行
}

if(1!=2){ //判断1是不是不等于2
    System.out.println("1不等于2");
}

if(!"hi".equals("hello")){
    System.out.println("hi 和 hello 不一样");
}

boolean b = true; //现在它是true
b = !b; //如果你在一个布尔量前面加个英文感叹号的话
System.out.println(b);

输出结果

1不等于2
hi 和 hello 不一样
false

也就是说, "hi".equals("hello")代表false, !"hi".equals("hello")代表着true, 感叹号让结果反过来了.

# 循环结构

# for循环

在Java中如果要重复性执行某代码, 可以使用for循环. 基本语法之一如下:

for(初始式; 条件,如果这个式子结果一直是true那么一直执行; 重复式,一次循环完毕后执行一次){
    重复的代码;
}

比如:

//一般我们都有个习惯, 第一个数字是0
for(int i=0;i<10;i++){ 
    //i++的意思就是i=i+1
    //这里循环内容要是只有一句话也可以省略花括号
    System.out.println("我想吃桃子x" + i);
}

输出结果

我想吃桃子x1
我想吃桃子x2
我想吃桃子x3
我想吃桃子x4
我想吃桃子x5
我想吃桃子x6
我想吃桃子x7
我想吃桃子x8
我想吃桃子x9
我想吃桃子x10

其实就是等效于:

int i=0;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
//然后JVM就一直帮你复读
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) System.out.println("我想吃桃子x"+i); i=i+1;
if(i<10) //这时候i=10不满足条件了, 在这个时候停止了

# 遍历for

如果有个数组:

int[] nums = {1,2,3,666,999,888,444};

我想遍历一遍这个数组, 把每个数都输出出来怎么办? 你可以这样写:

for(定义元素 : 数组){
    代码
}

下面是个例子

for(int num:nums){
    System.out.println(num);
}

# while循环

结构如下

while(条件,布尔值为true就会一直执行){
    循环的代码
}

# 死循环

如果你想让这个代码形成死循环, 那么:

for(;;){
    循环的代码
}

或者 

while(true){
    代码
}

# break与continue

for(int i=0;i<10;i++){
    if(i==5)
        continue;
    System.out.println(i);
}

输出结果

1
2
3
4
6
7
8
9
10

可以发现, continue代表跳出本次循环

for(int i=0;i<10;i++){
    if(i==5)
        break;
    System.out.println(i);
}

输出结果

1
2
3
4

可以发现, break代表结束整个循环