Java 基础入门易错知识点(三)

🎈 个人主页👉: tbRNA-CSDN博客

💯 个人简介:在校大学生一枚💋.
😍 希望我的文章对大家有着不一样的帮助,欢迎大家关注我,感谢大家的多多支持!

🎉 欢迎 👍点赞 ✍评论 ⭐收藏
Java 基础入门易错知识点(二)

Java 基础入门易错知识点(一)

目录

一、判断引用类型相等

二、yield

[三、for each循环](#三、for each循环)

四、打印数组内容

五、可变参数


一、判断引用类型相等

在Java中,判断值类型的变量是否相等,可以使用**==** 运算符。但是,判断引用类型的变量是否相等,== 表示" 引用是否相等 ",或者说,是否指向同一个对象。

例如,下面的两个String类型,它们的内容是相同的,但是,分别指向不同的对象,用 == 判断,结果为false:

java 复制代码
// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1 == s2) {
            System.out.println("s1 == s2");
        } else {
            System.out.println("s1 != s2");
        }
    }
}

要判断引用类型的变量内容是否相等,必须使用**equals()**方法:

java 复制代码
// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        } else {
            System.out.println("s1 not equals s2");
        }
    }
}

注意:执行语句s1.equals(s2) 时,如果变量s1为null ,会报NullPointerException:

java 复制代码
// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = null;
        if (s1.equals("hello")) {
            System.out.println("hello");
        }
    }
}

要避免NullPointerException错误,可以利用短路运算符&&

java 复制代码
// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = null;
        if (s1 != null && s1.equals("hello")) {
            System.out.println("hello");
        }
    }
}

二、yield

大多数时候,在switch表达式内部,我们会返回简单的值。

但是,如果需要复杂的语句,我们也可以写很多语句,放到**{...}** 里,然后,用yield返回一个值作为switch语句的返回值:

java 复制代码
// yield
public class Main {
    public static void main(String[] args) {
        String fruit = "orange";
        int opt = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> {
                int code = fruit.hashCode();
                yield code; // switch语句返回值
            }
        };
        System.out.println("opt = " + opt);
    }
}

三、for each循环

for循环经常用来遍历数组,因为通过计数器可以根据索引来访问数组的每个元素:

java 复制代码
int[] ns = { 1, 4, 9, 16, 25 };
for (int i=0; i<ns.length; i++) {
    System.out.println(ns[i]);
}

但是,很多时候,我们实际上真正想要访问的是数组每个元素的值。Java还提供了另一种for each循环,它可以更简单地遍历数组:

java 复制代码
// for each
public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 4, 9, 16, 25 };
        for (int n : ns) {
            System.out.println(n);
        }
    }
}

和for循环相比,for each循环 的变量n不再是计数器,而是直接对应到数组的每个元素。for each 循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。

除了数组外,for each循环 能够遍历所有**" 可迭代 "**的数据类型。

四、打印数组内容

直接打印数组变量,得到的是数组在JVM中的引用地址:

java 复制代码
int[] ns = { 1, 1, 2, 3, 5, 8 };
System.out.println(ns); // 类似 [I@7852e922

这并没有什么意义,因为我们希望打印的数组的元素内容。因此,使用for each循环来打印它:

java 复制代码
int[] ns = { 1, 1, 2, 3, 5, 8 };
for (int n : ns) {
    System.out.print(n + ", ");
}

使用for each循环打印也很麻烦。幸好Java标准库提供了Arrays.toString(),可以快速打印数组内容:

java 复制代码
// 遍历数组
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 1, 2, 3, 5, 8 };
        System.out.println(Arrays.toString(ns));
    }
}

五、可变参数

可变参数用**类型...**定义,可变参数相当于数组类型:

java 复制代码
class Group {
    private String[] names;

    public void setNames(String... names) {
        this.names = names;
    }
}

上面的**setNames()**就定义了一个可变参数。调用时,可以这么写:

java 复制代码
Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames("Xiao Ming"); // 传入1个String
g.setNames(); // 传入0个String

完全可以把可变参数改写为**String[ ]**类型:

java 复制代码
class Group {
    private String[] names;

    public void setNames(String[] names) {
        this.names = names;
    }
}

但是,调用方需要自己先构造String[ ],比较麻烦。例如:

java 复制代码
Group g = new Group();
g.setNames(new String[] {"Xiao Ming", "Xiao Hong", "Xiao Jun"}); // 传入1个String[]

另一个问题是,调用方可以传入null:

java 复制代码
Group g = new Group();
g.setNames(null);

而可变参数可以保证无法传入null,因为传入0个参数时,接收到的实际值是一个空数组而不是null。

💯如果这篇文章对你有用的话,请继续关注!

相关推荐
zh_xuan10 小时前
kotlin 尾随Lambda表达式函数的常用简写
开发语言·kotlin
码出财富17 小时前
SpringBoot 内置的 20 个高效工具类
java·spring boot·spring cloud·java-ee
沐知全栈开发17 小时前
Perl 数据库连接
开发语言
我是小疯子6617 小时前
Python变量赋值陷阱:浅拷贝VS深拷贝
java·服务器·数据库
森叶18 小时前
Java 比 Python 高性能的原因:重点在高并发方面
java·开发语言·python
二哈喇子!18 小时前
Eclipse中导入外部jar包
java·eclipse·jar
微露清风18 小时前
系统性学习C++-第二十二讲-C++11
java·c++·学习
qq_3168377518 小时前
uni.chooseMedia 读取base64 或 二进制
开发语言·前端·javascript
方圆工作室18 小时前
【C语言图形学】用*号绘制完美圆的三种算法详解与实现【AI】
c语言·开发语言·算法
小二·18 小时前
Python Web 开发进阶实战:混沌工程初探 —— 主动注入故障,构建高韧性系统
开发语言·前端·python