- String 对象用于保存字符串,字符串常量对象使用双引号括起来的字符序列。
- 字符串的字符使用Unicode字符编码,一个字符占两个字节
- String实现了Serializable String可以串行化: 可以在网络传输
- String实现了Comparable接口,String对象可以比较大小
- String是Final类,不可以被继承。
- String有属性 private final char value[]; 用于存放字符串内容。
- 一定要注意 value是一个 final类型,不可以修改。地址不可以修改。 但是单个字符的内容可以修改。
String s1="123"; //直接指向常量池的地址
String s2=new String("123"); //先在堆中创建地址空间存放 value value指向常量池的地址,其次 s2指向堆中的地址。
Person p1=new Person();
p1.name="sss";
Person p2=new Person();
p2.name="sss";
System.out.println(p1.name=p2.name);//T 因为指向的常量池地址相同
-
intern方法, 最终返回的是常量池的地址。
-
字符串特性:
- String是一个final类,代表不可变的字符序列
- 字符串是不可变的,一个字符串对象一旦被分配,内容不可变。
String a="hello"+"abc"; //编译器会优化 只创建一个对象 helloabc String a="abc"; String b="hello"; String c=a+b; //先创建一个StringBuilder sb=StringBuilder(); //执行 sb.append("abc"); //执行 sb.append("hello"); // String c=sb.toString(); //最后其实是c指向堆中的对象 (String) value[]- > 池中 "abchello" String d="abchello"; System.out.println(c == d);// 错误 c是指向堆中对象 d指向常量池对象 -
字符串相加重要规则: 如果两个常量(“abc"+“bcd”)相加,看的是池,如果两个变量(a+b)相加,是在堆中,原码也是通过StringBuffer创建堆中的对象然后指向池中的拼接常量,相加的对象名再指向堆中的对象。
-
String 常用方法
equals() //内容是否相等
equalsIgnoreCase() //不考虑大小写 内容是否相等
length(); //返回长度
indexof(); //获取字符在字符串对象中第一次出现的索引,索引从0开始,如果找不到返回-1
lastindexof //获取字符在字符串最后出现的索引,索引从0开始,如果找不到返回-1
substring()// 截取指定范围的子串 name.substring(5); 从索引5开始到最后 name.substring(0,3); 从索引0开始取到3-1位置
toUpperCase() //大写
toLowerCase() //小写
concat(" ") //拼接
replace("ss","aa") //把ss替换成aa 返回的结果才是替换过的
split(",") //以,为标准对 对象进行分割,返回一个数组
toCharArray //转换成字符数组 char[]
new String(chars)//将字符串数组返回成字符串类型
CompareTo //比较两个字符串大小 如果前者大,返回正数 后者大 则返回负数
//如果长度相同,并且每个字符也相同 返回0
format() //格式字符串 %s %d %c %.2f



