1、String表示字符串类型,属于引用数据类型,不属于基本数据类型。
2、在Java中随便使用双括号括起来的都是String对象,例如:“abc”、“def”。
3、Java中规定,双引号括起来的字符串,是不可变的,也就是“abc”自出生到最终死亡,不可变。
4、在JDK当中双括号括起来的字符串,例如:“abc”、“def”都是直接存储在方法区的字符串常量池当中的。
为什么把字符串存储在一个“字符串常量池”当中的,因为字符串在开发中使用太频繁。为了执行效率,所以把字符串存储在字符串常量池中。
public class StringTest {
public static void main(String[] args) {
//这两行代码表示底层创建了3个字符串对象,都在方法区的字符串常量中
String s1 = "abcdef";
String s2 = "abcdef" + "xy";
//分析:这是使用new方法创建的字符串对象,这个代码的“xy”是从哪里来的?
//凡是双引号括起来的都在字符串常量池中有一份。
//new对象的时候一定在堆内存中开辟了空间。
String s3 = new String("XY");
}
}
public class StringTest {
public static void main(String[] args) {
String s1 = "hello";
//“hello”是存储在方法区的字符串常量池当中的。
//所以这个"hello"不会创建(因为这个对象已经存在了)
String s2 = "hello";
System.out.println(s1 == s2);
//分析结果是true还是false
//== 的结果是 true
String x = new String("xyz");
String y = new String("xyz");
//分析结果是true还是false
System.out.println(x == y);//false
//通过这个案例,我们知道了,字符串对象之间不能使用“==”
//“==”不保险,应该使用String类中equals方法。
//String类已经重写了equals方法,以下的equals方法调用的是Stirng重写的equals方法。
System.out.println(x.equals(y));
String k = new String("testString");
//"String"这个字符串之后能够加.吗?
//因为"testString"是一个String字符串对象,只要对象都能调用方法。
System.out.println("testString".equals(k));//建议使用这个方法,因为这个可以避免空指针异常。
System.out.println(k.equals("testString"));
}
}
面试题
public class StringTest02 {
public static void main(String[] args) {
/*
一共创建了几个对象?
3个
方法区字符串中的字符串常量中的hello
堆内存当中的两个String对象
*/
String s1 = new String("hewllo");
String s2 = new String("hello");
}