String类及常用方法
1.1String的使用
1.String:字符串,使用一对“”引起来表示。
2.String声明为final,不可被继承。
3.String实现了Serializable接口,表示字符串是支持序列化的。
实现了Comparable接口,表示String可以比较大小
4.String:代表不可变的字符串序列。简称:不可变性。
体现:①当对字符串重新赋值时,需要重新指定内存区域,然后进行赋值,不能使用原有的value进行赋值。
②当对现有字符串拼接操作时,也需要重新指定区域,然后进行赋值,不能使用原有的value进行赋值。
③当调用String的replace方法修改指定的字符或字符串时,也需要重新指定区域进行赋值,不能使用原有的value进行赋值。
5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会存储相同内容的字符串的。
1.2String对象的创建
String 的实例化方式 方式一:通过字面量定义的方式 方式二:通过new+构造器的方式
/*String 的实例化方式 方式一:通过字面量定义的方式 方式二:通过new+构造器的方式 面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象? 两个:一个是堆空间中new的结构,另一个是char[]对应的常量池中的数据"abc" */@Testpublic void test2(){//字面量的方式:此时的s1和s2的数据“abc”声明在方法去中的字符串常量池中String s1 = "abc"; String s2 = "abc";//通过new + 构造器的方式:此时的s3和s4保存的是地址值,是数据在堆空间中开辟空间以后对应的地址值。String s3 = new String("abc"); String s4 = new String("abc"); Person p1 = new Person("Tom",12); Person p2 = new Person("Tom",13); System.out.println(s1==s2); //trueSystem.out.println(s1 ==s3); //falseSystem.out.println(s1 ==s4); //fSystem.out.println(s2 == s3);//fSystem.out.println(s3 ==s4); //fSystem.out.println(s1.equals(s3)); //tSystem.out.println("****************************"); System.out.println(p1.name == p2.name); //注意这里为啥是true,因为通过字面量的方式都是存放在字符串常量池中System.out.println(p1.name.equals(p2.name));//true}
String不同拼接操作的对比:
内存方面的结构要清楚。
结论:
1.常量与常量的拼接结果在常量池.且常量池中不会存在相同内容的常量 。
2.只要其中有一个是变量 结果就在堆中.
3.如果拼接的结果调用 intern() 方,返回值就在常量池中。
/*结论: 1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量 。 2.只要其中有一个是变量结果就在堆中 3.如果拼接的结果调用 intern(),返回值就在常量池中 */@Testpublic void test3(){ String s1 = "javaEE"; String s2 = "hadoop"; String s3 = "javaEEhadoop"; String s4 = "javaEE" + "hadoop"; //常量与常量拼接还在常量池String s5 = s1 + "hadoop"; //有变量参与相当于new ,在堆空间中String s6 = "javaEE" + s2; String s7 = s1 +s2; System.out.println(s3 == s4); //tSystem.out.println(s3 == s5); //fSystem.out.println(s3 == s6); //falseSystem.out.println(s5 == s6); //falseSystem.out.println(s5 == s7); //falseSystem.out.println(s6 == s7); //falseString s8 = s5.intern(); //返回值得到的s8使用的常量池中已经存在的“javaEEhadoop”System.out.println(s3 == s8); //true}
一道面试题:
/** * 一道面试题 * @author ldbstart * @create 2021-03-06 23:49 */public class StringTest { String str = new String("good"); char[] ch = {'t','e','s','t'}; public void change(String str ,char ch[]){ str = "test ok"; ch[0] = 'b'; }public static void main(String[] args) { StringTest ex = new StringTest(); ex.change(ex.str,ex.ch); System.out.println(ex.str); //"good"System.out.println(ex.ch); //best } }
JVM中涉及到字符串的内存结构
三种JVM
Sun公司的HotSpot(默认的。不用说)
BEA公司的JRockit
IBM公司的J9 VM