Java String类
String类简介
字符串严格意义上来讲并不能算是一个基本数据类型,也就是说没有任何一门语言会提供有字符串这种数据类型的,而Java为了方便开发者进行项目的编写,所以利用其JVM的支持制造了一种可以简单实用的String类。
范例一:String对象实例化
public class StringDemo {
public static void main(String[] args) {
String str = "www.baidu.com"; // 直接赋值
System.out.println(str);
}
}
需要注意的是,String这个类里面之所以可以保存字符串,只要的原因是其中定义了一个数组,也就是说在String里面所有的字符串中的每一个字符的数据都是保存在了数组之中。
对比源代码的差别:
JDK1.8以前的String类 | JDK1.9以后的String类 |
---|---|
JDK1.8以前String保存的是字符数组 | JDK1.9以后String保存的是字节数组 |
---|---|
private final char[] value; | private final byte[] value; |
- JDK1.9以后对于字符串的定义形式实际上是增多了,要比JDK1.8多;
- JDK1.9开始String类中的数组采用byte类型,而1.8之前使用使用的是char[] 字符数组。
总结:所谓的字符串就是对数组的一种特殊包装应用,在String类里面除了可以使用直接赋值的形式为对象实例化之外,也可以按照传统的方式利用构造方法对String进行实例化
范例二:构造方法实例化
public class StringDemo {
public static void main(String[] args) {
String str = new String("www.baidu.com"); // 构造方法实例化
System.out.println(str);
}
}
字符串比较
public class StringDemo {
public static void main(String[] args) {
String strA = "A";
String strB = new String("A");
System.out.println(strA == strB); // false
}
}
此时的比较并没有成功,所以发现虽然两个字符串的内容是相同的,但是“==”也无法得到准确的相等判断,这种情况下如果要想实现准确的字符串相等判断,那么必须使用String类提供的equals()方法。
public class StringDemo {
public static void main(String[] args) {
String strA = "A";
String strB = new String("A");
System.out.println(strA.equals(strB)); // true
}
}
面试题:请解释String比较中“==”与equals()的区别?
- “==”:进行的是数值比较,如果用于对象比较上,比较的是两个内存的地址数值;
- equals():是类所提供的一个比较方法,可以直接进行字符串内容的判断;
String对象(常量)池
对象池的主要目的,是实现数据的共享处理。以String对象池为例,里面的内容主要就是为了重用,而重用实际就属于共享设计,但是在Java之中对象池实际上可以分为两种:
静态常量池
- 指的是程序(*class)在加载的时候会自动将此程序中保存的字符串、普通的常量、类和方法的信息等等,全部进行分配
范例三:静态常量池
public class StringDemo {
public static void main(String[] args) {
String strA = "ABC";
String strB = "A" + "B" + "C";
System.out.println(strA == strB); // true
}
}
本程序之中所给出的内容全部都是常量数据(字符串的常量都是匿名对象),所以最终在程序加载的时候会自动帮助开发者处理好相应的连接操作。
运行时常量池
- 当一个程序(*class)加载之后,里面可有有一些变量,这个时候提供的常量池就是运行时常量池
范例四:运行时常量池
public class StringDemo {
public static void main(String[] args) {
String info = "B";
String strA = "ABC";
String strB = "A" + info + "C";
System.out.println(strA == strB); // false
}
}
这个答案不熟悉的朋友可能觉得很奇怪,这个时候之所以是一个false,是因为程序在加载的时候并不确定info是什么内容。因为在进行字符串连接时,info采用的是一个变量,变量的内容是可以修改的,所以它不认为strB的结果是最终的真实结果。