旋转跳跃-学会操作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小时前
|
存储 算法 搜索推荐
深入解析String数组的操作与性能优化策略
深入解析String数组的操作与性能优化策略
|
1天前
|
Java 数据处理
Java8Stream(高效处理集合数据)
Java8Stream(高效处理集合数据)
|
1天前
|
编译器 C语言 C++
|
1天前
|
Java
类信息的“隐形守护者”:JAVA反射技术全揭秘
【7月更文挑战第1天】Java反射技术是动态获取类信息并操作对象的强大工具。它基于Class对象,允许在运行时创建对象、调用方法和改变字段。例如,通过`Class.forName()`动态实例化对象,`getMethod()`调用方法。然而,反射可能破坏封装,影响性能,并需处理异常,故使用时需谨慎。它是Java灵活性的关键,常见于框架设计中。
6 0
|
1天前
|
安全 Java
解决Java中集合类的内存占用问题
解决Java中集合类的内存占用问题
|
1天前
|
Java
深入理解Java中的类与对象:封装、继承与多态
深入理解Java中的类与对象:封装、继承与多态
|
1天前
|
Java 容器
Java中使用Optional类的建议
Java中使用Optional类的建议
|
1天前
|
存储 安全 Java
Java详解 : 单列集合 | 双列集合 | Collections类
Java详解 : 单列集合 | 双列集合 | Collections类
|
1天前
|
Java
Java中的Object类 ( 详解toString方法 | equals方法 )
Java中的Object类 ( 详解toString方法 | equals方法 )
|
1天前
|
Java 测试技术 API
Java详解 : API常用类
Java详解 : API常用类