旋转跳跃-学会操作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面向对象编程文章查看此处

相关文章
|
4月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
170 4
|
4月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
252 5
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
246 1
|
4月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
291 1
|
4月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
237 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1
|
4月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
340 5
|
5月前
|
安全 Java 数据建模
Java记录类:简化数据载体的新选择
Java记录类:简化数据载体的新选择
291 101
|
5月前
|
安全 Java 开发者
Java记录类:简化数据载体的新方式
Java记录类:简化数据载体的新方式
325 100
|
Java Android开发
WSDL2Java操作指南
1. 安装JDK1.5, 配置系统环境变量:     下载安装JDK后, 设置环境变量:     JAVA_HOME=C:\Program Files\Java\jdk1.5.0_02     Path=%Path%;%JAVA_HOME%\bin(这里的%Path%指你系统已经有的一系列配置)     CLASSPATH=%JAVA_HOME%\lib  2. 下载axis,
1551 0