Java从入门到精通—String类【字符串常量】

  • 一、 字符串常量
  • 二、实例
  • 【Stringdemo .java】
  • 【运行分析】
  • 【StringDemo2.java】
  • 【运行分析】


一、 字符串常量

我们俗称的字符串常量,其实程序之中不会提供有字符串这样的“基本数据类型”,提供的只是一个String类,所以任何使用" "定义的字符串常量实际上描述的都是一个String类的匿名对象

String类对象的直接赋值: 将一个匿名对象设置一个具体的引用,相当于开辟一个栈内存,指向这个匿名对象,这个匿名对象是存在堆内存的。

  • String类对象直接赋值 :String str = "Daxiong";
  • 字符串常量 :"Daxiong"

可以发现:字符串常量可以调用equals()方法实现对象相等的判断,所以程序中没有字符串常量这种基本类型,有的只是String类的匿名对象。

二、实例

我们通过一个例子验证字符串常量是匿名类对象:

【Stringdemo .java】

//验证字符串常量是匿名类对象
public class Stringdemo {
	public static void main(String[] args) {
		String str = "Daxiong";
		System.out.println("Daxiong".equals(str));     //true
		//"Daxiong"能调用equals方法,说明这是个匿名类对象
	}
}

【运行分析】

java中String常量池存储在哪里 java string常量_java


通过上面的例子可发现:字符串常量可以调用equals()方法实现对象相等的判断,所以程序中没有字符串常量这种基本类型,有的只是String类的匿名对象。

上一节我们学习了字符串的equals的比较,只有是String类对象才可以调用equals方法,基本数据类型是不可以的,因此我们得出字符串常量其实就是String类的匿名对象。


观察一种字符串匹配的情况:

【StringDemo2.java】

//假设一种字符串匹配的情况:
//用户输入内容进行匹配,但是用户可能有不输入,输入为空,就可能出现空指针情况:
public class Stringdemo2 {
	public static void main(String[] args) {
		String input = null;  //用户输入的内容
		//System.out.println(input.equals("Daxiong"));  //字符串常量在后面的情况: ERROR:空指针异常: java.lang.NullPointerException
		System.out.println("Daxiong".equals(input));  //字符串常量在前面的情况:
	}
}

【运行分析】

字符串常量放在后面:

System.out.println(input.equals("baidu");

java中String常量池存储在哪里 java string常量_java中String常量池存储在哪里_02


字符串常量放在前面:

System.out.println("baidu".equals(input));

java中String常量池存储在哪里 java string常量_java中String常量池存储在哪里_03


关于对象相等判断的小技巧💡

在以后进行项目开发的时候,如果现在某些数据是由用户输入,并且要求这些数据为一个指定内容的情况下,建议将字符串的常量写在前面。

那为什么哩? 🤔
equals()方法里面提供有一个可以回避null的判断,如果将字符串常量写在前面,那么调用equals()方法的时候永远都不可能出现“NullPointerException”,字符串常量是一个匿名对象,匿名对象一定是开辟好堆内存空间的对象。