String类-字符串对象
Java JDK中内置的一个类:java.lang.String
1、String字符串类型,属于引用数据类型。
2、在java中随便使用双引号括起来的都是String对象。例如:"abc","def","hello world!",这是3个String对象。
3、java中规定,双引号括起来的字符串,是不可变的,"abc"自出生到最终死亡,不可变。
4、在JDK当中双引号括起来的字符串,例如:"abc" "def"都是直接存储在“方法区”的“字符串常量池”当中的。
5、为什么SUN公司把字符串存储在一个“字符串常量池”中。因为字符串在实际的开发中使用太频繁。为了执行效率, 所以把字符串放到了方法区的字符串常量池当中。
6、String s1 = "abcdef"; s1里面保存的不是字符串,是字符串的内存地址(对象的内存地址,一个字符串就是一个对象)
public class StringTest01 { public static void main(String[] args) { // 这两行代码表示底层创建了3个字符串对象,都在字符串常量池当中。 String s1 = "abcdef"; String s2 = "abcdef" + "xy"; // 使用new的方式创建的字符串对象:"xy" // new对象在堆内存当中开辟空间。但在双引号括起来的字符串常量池中有一份。new出来之后的对象地址指向常量池中的xy String s3 = new String("xy"); // i变量中保存的是100这个值。 int i = 100; // s变量中保存的是字符串对象的内存地址。 // s引用中保存的不是"abc",是0x1111 // 而0x1111是"abc"字符串对象在“字符串常量池”当中的内存地址。 String s = "abc"; } }
/* 分析以下程序,一共创建了几个对象 */ public class StringTest02 { public static void main(String[] args) { /* 一共3个对象: 方法区字符串常量池中有1个:"hello" 堆内存当中有两个String对象。 一共3个。 */ String s1 = new String("hello"); String s2 = new String("hello"); } }
public class StringTest02 { public static void main(String[] args) { String s1 = "hello"; // "hello"是存储在方法区的字符串常量池当中;这个"hello"不会新建。(已经存在) String s2 = "hello"; // 分析结果是true还是false? // == 双等号比较的是变量中保存的内存地址 System.out.println(s1 == s2); // true String x = new String("xyz"); String y = new String("xyz"); // 分析结果是true还是false? // == 双等号比较的是变量中保存的内存地址 System.out.println(x == y); //false System.out.println(x.equals(y)); // true // 通过案例:字符串对象之间的比较不能使用“==”不保险。应调用String类的equals方法。 // String类已经重写了equals方法,以下的equals方法调用的是String重写之后的equals方法。 String k = new String("testString"); System.out.println("testString".equals(k)); // 建议使用这种方式,因为这个可以避免空指针异常。 //String k = null; // "testString"这个字符串可以后面加"."呢? // 因为"testString"是一个String字符串对象。只要是对象都能调用方法。 System.out.println(k.equals("testString")); // 存在空指针异常的风险。不建议这样写。 } }