1.概念
String是一个最终类
java中所有的字符串常量都是String类的对象
String类底层是根据不可改变的字符数组来实现数据存储,String类对象的内容无法改变(常量)
java中所有的常量存储在方法区的运行时常量池
当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用(共享)
例题:
创建了几个对象?5个
String str="a";//1
str+="b";//str=new StringBuilder("a").append("b").toString();//4
packagecn.tedu.string;
publicclassStringDemo1{
publicstaticvoidmain(String[]args){
//字符串常量存储在方法区的运行时常量池中
//s1指向方法区常量池
String s1="ab";
//s2指向堆内存
String s2=new String("ab");
//当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用
//s3和s1指向同一个常量池
String s3="ab";
//byte b=128-1;
//当参与运算的都是常量那么在编译时期就会进行优化直接计算结果再进行赋值
//String s4="ab";s4和s1指向同一个常量池
String s4="a"+"b";
String s5="a";
//s5=s5+"b";
//有String类不能直接做拼接
//所以底层是由s5=new StringBuilder("a").append("b").toString();
//toString方法底层是new一个新的String类对象返回
//s5指向堆内存
s5+="b";
//s1指向方法区,s2指向堆内存,地址值不一样
System.out.println(s1==s2);//false
//s1和s3指向同一个常量池,地址值一样
System.out.println(s1==s3);//true
//s1和s4指向同一个常量池,地址值一样
System.out.println(s1==s4);//true
//s1指向方法区,s5指向堆内存,地址值不一样
System.out.println(s1==s5);//false
//s2和s5指向不同的堆内存
System.out.println(s2==s5);//false
}
}
2.StringBuilder与StringBuffer
从jdk1.0开始String类做拼接使用的是StringBuffer,安全可靠但是拼接效率较低。
从jdk1.5开始String类做拼接使用的是StringBuilder,不安全但是拼接效率较高。
3.重要方法
1.charAt():根据指定的下标值返回字符串对象对应的字符
2.length():返回字符串对象的长度值
3.toCharArray():把字符串对象的内容转成字符数组
4.new String(char[] cs,int offset,int count):指定字符数组内容转成新的字符串对象
public class StringDemo2 {
public static void main(String[] args) {
//
String str="asfddfs";
//指定String类对象的下标来返回对应字符
/* System.out.println(str.charAt(2));//可以获取字符串对象中任意一个字符
//遍历字符串对象的内容
//length()方法---返回字符串对象的长度值
//length属性---返回数组长度值
for (int