Java常用类——String类概论
String概述与不可变性
String是一个final类,代表不可变的字符序列
字符串是常量,用双引号表示,它们的值在创建之后不能更改
String对象的字符内容是存储在一个字符数据final value[]中的
String实现了Serializable接口:表示字符串可以序列化的
String实现了Comparable接口:表示字符串可比较的(按字典序)
String s1 = "abc"; //字面量方式定义
String s2 = "abc";
System.out.println(s1==s2); //输出true
String s4="abc";
String s5=s4.replace('a','b');
System.out.println(s4); //输出abc
System.out.println(s5); //输出bbc
- 字面量都存储在方法区的字符串常量池中,常量池中不会有第二个相同的字符串
- 字符串不能被修改,一般赋值或者连接(+)都是造了新的字符串常量
- 调用String的replace()方法时,也必须新造字符串常量
String对象的创建
String str="hello"; //字面量定义
String s1 = new String(); //本质上this.value = new char[0];
String s2 = new String(String original); //本质上this.value = original.value;
String s3 = new String(char[] a);
String s4 = new String(char[] a, int startIndex, int count); //从数组a[]的第startindex开始的count个字符
String s1 = "javaEE";
String s2 = "javaEE";
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false
System.out.println(s1==s4); //false
System.out.println(s3==s4); //false
总之,如果是字面量定义,"=="之下很可能相等,因为地址值一样
否则仔细判断对象的地址...
面试题:String s=new String("abc");方式创建了几个对象?
两个,一个堆空间new结构,另一个是char[]型对应常量池的数据
String类的不同拼接操作
1.常量与常量的拼接结果在常量池中,且常量池中不会存在相同内容的常量
2.连接符中只要有一个是变量,结果就在堆中(有new结构)
3.如果拼接的结果调用intern()方法,返回值就在常量池中
String s1="javaEE";
String s2="hadoop";
String s3="javaEEhadoop";
String s4="javaEE"+"hadoop";
String s5=s1+"hadoop";
String s6="javaEE"+s2;
String s7=s1+s2;
String s8= s5.intern();
System.out.println(s3==s4); //true
System.out.println(s3==s5); //false
System.out.println(s3==s6); //false
System.out.println(s3==s7); //false
System.out.println(s5==s6); //false
System.out.println(s5==s7); //false
System.out.println(s6==s7); //false
System.out.println(s3==s8); //true