旋转跳跃-学会操作String类数据 | 带你学《Java面向对象编程》之二十七

简介: 本节将带领读者完成对字符串数据之间的比较,并为读者介绍了字符串常量的概念与比较字符串数据的注意事项。

上一篇:初识Java神秘成员:String类 | 带你学《Java面向对象编程》之二十六
【本节目标】
通过阅读本节内容,你将初步掌握字符串数据比较的方法,并通过使用匿名String对象避免null值异常问题的出现。

字符串比较

首先来回顾一下,如果说现在要想判断两个int型变量是否相等,那么肯定使用“==”来完成,这个是由程序直接提供的比较相等的运算符。
范例:进行“==”比较

public class StringDemo {
    public static void main (String args[]) {
        int x = 10;
        int y = 10 ;
        System.out.println(x == y) ;  //true
    }
}

但是String类实际上也牵扯到一个相等的判断问题,但是对于String类相等的判断也可以使用“==”,只不过判断的不准确而已。下面通过代码来观察。
范例:实现字符串的相等判断

public class StringDemo {
    public static void main (String args[]) {
        String strA = “mldn” ;
        String strB = new String(“mldn”) ;
        System.out.println(strA == strB) ;      //执行结果为false
    }
}

此时的比较并没有成功,虽然两个字符串对象的内容是相同的,但是“==”也无法得到准确的相等判断,那么这种情况下如果要想实现准确的字符串相等判断,那么可以使用String类中所提供的一个比较方法:

  • 字符串比较(有变形):public boolean equals(String str);

范例:利用equals()实现字符串比较

public class StringDemo {
    public static void main (String args[]) {
        String strA = “mldn” ;
        String strB = new String(“mldn”) ;
        System.out.println(strA.equals(strB)) ;      //执行结果为true
    }
}

面试题:请解释String比较中“==”与equals()的区别?

  • “==”:进行的是数值比较,如果用于对象比较上比较的是两个内存的地址数值;
  • equals():是类所提供的一个比较方法,可以直接进行字符串内容的判断。

字符串常量

字符串常量是String类的匿名对象
现在已经清楚了String类的基本操作形式,但是需要做出一个明确的定义,在程序的开发之中任何的一个整数是int型,任意的小数默认都是double,但是对于字符串而言,首先程序之中不会提供有字符串这样的基本数据类型,那么可以提供的只有一个String类,所以任何使用“"”定义的字符串常量实际上描述的都是一个String类的匿名对象。
以String strA= “mldn” ;为例:
内存分析图:

image.png
图一 内存分析图

所谓的String类对象的直接赋值直接描述的是,将一个匿名对象设置一个具体的引用名字。
范例:观察匿名对象的存在

public class StringDemo {
    public static void main (String args[]) {
        String str = “mldn” ; 
        System.out.println(“mldn”.equals(str)) ;     //执行结果为true
    }
}

此时可以发现字符串常量已经可以明确的调用equals()方法实现对象相等的判断,所以可以得出一个结论:程序中的确没有字符串的常量这种基本类型,有的只是String类的匿名对象。
关于对象相等判断的小技巧:
在以后进行项目开发的时候,如果现在某些数据是由用户输入,并且要求这些数据为一个指定内容的情况下建议将字符串的一个常量写在前面。
接收用户输入数据的字符串调用方法:

public class StringDemo {
    public static void main (String args[]) {
        String input= null ;              //用户输入内容
        System.out.println(input.equals(“mldn”)) ;     
    }
}             //Exception in thread “main”java.lang.NullPointerException

换个方式,将字符串常量写在前面:

public class StringDemo {
    public static void main (String args[]) {
        String input= null ;          //用户输入内容
        System.out.println(“mldn”.equals(input)) ;       //执行结果false
    }
}

equals()方法里面提供有一个可以回避null的判断,所以如果将字符串常量写在前面,那么调用equals()方法的时候永远都不可能出现“NullPointerException”,字符串是一个匿名对象,匿名对象一定是开辟好堆内存空间的对象。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:领会String类诞生的奥妙 | 带你学《Java面向对象编程》之二十八
更多Java面向对象编程文章查看此处

相关文章
|
15天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
38 17
|
7天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
11天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
50 4
|
12天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
27 2
|
16天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
20天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
20天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
20天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
23 3
|
23天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
22 5
|
23天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
30 2