1、JDK中的String声明:
public final class String
被final修饰的类无法被继承,所以String没有子类。
2、创建字符串的四种方法
(1)直接赋值
String str1="hello world";
(2)通过构造方法
String str2=new String("hello world");
(3) 通过字符串数组产生
char []data=new char{'a','b','c'};
String str3= new String(data);
(4)通过String的静态方法valueOf(任意数据类型),转为字符串
String str4=String.valueOf(10);
3、字符串比较相等
使用equals方法(所有引用数据类型比较相等都使用equals方法)
public class Test {
public static void main(String[] args) {
//比较字符串是否相等
String str1="hello";
String str2="hello";
String str3="Hello";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
//不区分大小写进行比较使用equalsIgnoreCase
System.out.println(str1.equalsIgnoreCase(str3));
}
}
在某些情况下,如用户输入时,使用equals方法需注意做判空处理
此时出现了空指针异常,将要比较的内容放在前面,就可以避免。
4、字符串常量池
当使用直接赋值法产生字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中还不存在,则产生一个新的字符串对象加入常量池中。
(1)当继续使用直接赋值法产生字符串对象时,若常量池中已有该对象,则此时不在新建字符串对象,而是复用已有对象。
String str1="hello"; String str2="hello"; String str3="hello";
(2)当使用构造方法产生字符串对象时,若该对象在常量池中不存在,则先入常量池,再产生字符串对象。
String str1=new String("hello");
String str2=new String("hello");
String str3=new String("hello");
当使用了new关键字,就在堆中开辟了新的空间,此时三行代码产生了4个对象。当字符串常量hello第一次出现时,会先进入字符串常量池,然后产生str1对象,new产生str2、str3时,常量池中已经有了hello,只需产生两个对象即可。
(3)手工入池:String类提供的intern方法
public native String intern()
调用intern方法会将当前字符串引用指向的对象保存到字符串常量中。
① 若当前常量池中已经存在了该对象,则不再产生新的对象,返回常量池中的String对象 。
String str1=new String("hello");
str1.intern(); //并没有改变原来的str1
String str2="hello"; //str1还是堆中的对象,str2是常量池中的hello
System.out.println(str1==str2);
str1=str1.intern(); //此时str1被改变了
System.out.println(str1==str2); //str1和str2都是常量池中的hello
② 若当前常量池中不存在该对象,则该对象入池,返回入池后的地址。
char[] data=new char[]{'a','b','c'};//此时产生的是一个字符数组
String str1=new String(data);
str1.intern();
String str2="abc";
System.out.println(str1==str2);
5、字符串的不可变性
字符串对象的内容不能被改变,字符串的引用可以改变。
String str=new String("good");
good第一次出现时先入池,new String之后str=good;
字符串实质上是一个字符数组char[ ],字符串保存的值实际上在数组中保存。、
6、如何修改字符串的内容
1)在运行时通过反射破坏value数组的封装;
2)更换使用StringBuilder或者StringBuffer类(此时已经不是String类了);
(1)使用的append方法拼接字符串
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("hello");
stringBuilder.append(" world");
stringBuilder.append(" !");
System.out.println(stringBuilder);
(2) 关于StringBuilder类的具体使用
① StringBuilder转变为String,调用toString方法
StringBuilder sb=new StringBuilder("hello");
String str=sb.toString();
System.out.println(str);
② String转变为StringBuilder,使用StringBuilder的构造方法
StringBuilder sb=new StringBuilder("hello");
System.out.println(sb);
sb.append(" world");
System.out.println(sb);
③ 字符串的反转操作,reverse( )方法;
④ 字符串删除指定范围的数据
delete(int start, int end);删除了[start , end)的内容
⑤ 插入操作
insert(int offest, 各自数据类型)
(3)String、StringBuilder、StringBuffer的区别
① String类的对象无法修改, StringBuilder、StringBuffer的对象可以修改。
② StringBuffer是线程安全的操作,但性能较差。
③ StringBuilder是线程不安全,性能较高。
7、字符串的其他常见操作
(1)字符串比较
| equals方法 | 区分大小写,比较属性值,返回值类型boolean |
| equalsIgnore方法 | 不区分大小写,返回值类型boolean |
| compareTo方法 | 比较unicode 的值,返回类型是int |
注:关于compareTo方法——在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:相等(=0),前者大于后者(>0),前者小于后者(<0);字符串的比较大小规则, 总结成三个字 "字典序" 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一 个字符的大小(根据 unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容。
(2)字符和字符串的相互转换
① char ——> String
使用构造方法
char[] ch=new char[]{'a','b','c'};
String str=new String(ch);
System.out.println(str);
String str1=new String(ch,0,2);//将部分数组转变为字符串[0,2)
System.out.println(str1);
② String——> char
③ String——>byte
④ byte[]——>String



