基本数据类型包括byte、int、char、long、float、double、boolean和short。String不是基本数据类型
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
转自:http://wangjc-opal.iteye.com/blog/232550
String是一个具有值类型和引用类型特点的特殊类型
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
- String s0 = "hello"; //这是在静态数据区创建了一个对象
- String s1 = "hello"; //创建静态数据对象是先在静态数据区查,如果存在则不创建新的,保证静态数据区中的数据只有一份
- String s2 = "he" + "llo";
- System.out.println(s0 == s1);// true
- System.out.println(s0 == s2);// true
- System.out.println(s0 == "hel" + "lo"); // true
首先,我们要知道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”hello”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”he”和”llo”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”hello”的一个引用。所以我们得出s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,放在堆里,它们有自己的地址空间。
看例2:
- String s4 = "abc";
- String s5 = new String("abc"); //在堆中创建一个对象,引用值当然不同
- String s6 = "ab"+ new String("c");
- System.out.println(s4 == s6);//false
- System.out.println(s4 == s5);//false