关于Java JDK内置的一个类:java.lang.String 1、String 表示字符串类型,属于引用类型、不属于基本数据类型。 2、在Java中随便使用双引号括起来的对象都是String对象。例如:"abc","def"等等,这是两个String对象 3、在Java中规定,双引号括起来的字符串是不可变的,也就是说"abc"自出生到最终死亡,不可变,也不可能变成"abcd",也不能变成"ab"。 4、在JDK当中双引号括起来的字符串,都是直接存储在“方法区”的“字符串常量池”当中的。 为什么SUN公司把字符串存储在一个“字符串常量池当中呢”。因为字符串在实际的开发中使用太频繁。为了执行效率, 所以把字符串放到了方法区的字符串常量池当中。
public class Test { public static void main(String[] args) { // 在字符串常量池当中创建了三个不同的字符串对象。 String s1 = "abcd"; String s2 = "abcd"; String s3 = "xy"; //分析:这是使用new的方式创建的字符串对象。这个代码中的"xy"是从哪来的? //凡是双引号括起来的都在字符串常量池中有一份 //new对象的时候一定在堆内存当中开辟空间。 String s4 = new String("xy"); System.out.println(s3.equals(s4)); //结果为true //i变量保存的110这个值 int i = 110; //s变量保存的是字符串对象的内存地址 String s = "100"; System.out.println(s); } }
public class StringTest02 { public static void main(String[] args) { //第一个s1是在字符串常量池当中创建 String s1 = "hello"; //第二个s2是引用的地址。 String s2 = "hello"; // == 双等号是比较的内存地址 equals 是比较的值 System.out.println(s1.equals(s2)); String s3 = new String("xyz"); String s4 = new String("xyz"); //每new一次都会在堆内存当中创建一个对象, // 由于在栈当中的s3,s4是引用的堆对象的地址, // 所以s3的地址和s4的地址是不等于的 // 而他们的值是相等的。 //因此当我们在比较两值是否相等我们调用equals更加保险 System.out.println(s3 == s4); System.out.println(s3.equals(s4)); // String k = new String("TestString"); //因为"TestString"也是字符串对象,因此可以调用String的方法。 String k = null; System.out.println("TestString".equals(k));//建议使用这种方式,因为这个可以避免空指针异常。 System.out.println(k.equals("TestString"));//存在空指针异常的风险,因此不采用这种书写方式 } }
测试图如下