一、String类
final类型的,常量。一旦创建不能被不能被继承
出现原因:方便对char数组进行操作。提供了对字符串的常用操作。
1、字符串存储原理
字符串是常量,一旦创建不能被修改,由于在程序中经常使用,java提供了字符串缓冲机制。
(1)如果使用双音号形式定义一个字符串,这个字符串就会在缓冲区中。
String s1 = “abc”; //先在字符串缓冲区查找是否有”abc”对象,如果有直接指向,
如果没有,在缓冲区创建。
String s2 = “abc”; //同上
System.out.println(s1 == s2); //true
(2)如果使用构造函数形式定义一个字符串,那么就不会引用缓冲区中的了,一定会创建一个新的。
String s1 = new String(“abc”);//缓冲去外创建对象,用s1指向。然后查找缓冲区内是有存在,不存在,在缓冲区中创建对象
String s2 = new String(“abc”);//缓冲区外创建对象,用s2指向。然后查找缓冲区内是否存在,存在,不做任何操作
System.out.println(s1 ==s2); //false
2、字符串相加
(1)两个字符串相加是通过StringBuffer实现的,返回的是一个由构造函数创建的字符串。
System.out.println(s3== s4); //false.
(2)在定义两个字符串的时候直接用两个字符串常量相加,编译时会自动改为一个字符串。
编译时改为 String s = “abc”; |
(3)如果将一个对象和一个字符串相加,返回的是这个对象的toString()结果和这个字符串相连。
3、String类的构造函数
(1)将字节数组解码成字符串:String(byte[] b)
byte[]arr = {97,98,99};
String s = newString(arr); //使用默认码表GBK码表解码,英文解为1个字节,中文解为两个字节
System.out.println(s); // abc
(2)用指定码表将字节数组解码成字符串:String(byte[] b, String charSetName);
byte[]arr = {97,98,99};
String s = new String(arr,“UTF-8”); //用UTF-8码表解码,英文解为1个字节,其他字符解为3个字节
(3)用指定码表将字节数组中的一部分字节解码成字符串:
String(byte[] b, int startIndex, int length,码表)
String s = new String(arr,1,3,”UTF-8”); //用UTF-8码表解码,从1号索引开
始,取3个字节(1个汉字)
(4)将字符数组组装成字符串:String(char[] c);
char[]c = {‘吃’, ‘饭’, ‘了’, ‘嘛’};
Strings = new String(c); //得到字符串吃饭了嘛
(5)将字符数组中的一部分组装成字符串:String(char[] c, int startIndex, int length)
String s = new String(c,0, 3); //将字符串从0号索引开始,取3个字符
(6)通过StringBuffer构建字符串
StringBuffer sb = new StringBuffer();
sb.append("abc");
sb.append("def");
String s3=new String(sb); //在缓冲区外创建对象,在缓冲区内创建对象
String s4 = sb.toString(); //在缓冲区外创建对象,缓冲区内已有,不创建
System.out.println(s3); //abcdef
System.out.println(s4); //abcdef
System.out.println(s3 == s4); //false
4、String类的常用方法
int compareTo(anthorString); // 按自然顺序比较字符串
char chatAt(int index); //获取指定索引上的字符
char[] toCharArray(); //将字符串转为字符数组
String conCat(String s); //将s字符串连接到字符串末尾
String replace(String s1, String s2); //将指定的s1字符串替换为s2
String subString(int beginIndex, int endIndex); //截取子串
int length(); //获取字符串的长度
byte[] getBytes(); //编码。使用默认码表将字符串转为字节数组
String[] split(分隔符); //将字符串分割成字符串数组
分隔符是正则表达式,如果是 . 需要写成\\.
String toLowerCase(); //转为小写
String toUpperCase(); //转为大写
String trim(); //去掉字符串的前后空白
boolean contains(String s); //是否包含s字符串
boolean endsWith(String s); //是否以s字符串结尾
boolean startsWith(String s); //是否以s字符串开头
int indexOf(Strings); //查找子串s第一次出现的位置
int indexOf(String s, int index); //从index号索引开始找子串s第一次出现位置
int lastIndexOf(String s); //查找子串s最后一次出现的位置
二、StringBuffer
字符串是常量,能修改,在相加时内部使用StringBuffer操作,效率低。
StringBuffer是一个可以存储字符的容器,其中可以存储若干字符。可以理解为可变的字符串。
StringBuffersb = new StringBuffer();
sb.append(“abc”);
sb.append(“def”);
System.out.println(sb);
常用方法:
sb.delete(int index1, int index2); //删除sb字符串的从index1(包括)号索引到index2(不包括)号索引的所有字符
sb.insert(int index , String s); //在sb字符串的index1号索引开始,插入字符串s,
原字符串后移。
sb.append(参数);
sb.reverse();
sb.toString();
注意:
String类的所有方法都不会改变原字符串的值。如果一个字符串在使用的时候需要改变,就需要用StringBuffer。
三、StringBuilder
StringBuilder的功能与StringBuffer完全一样。
StringBuffer是线程安全的,所有方法都是同步的。
StringBuilder是线程不安全的,但是效率高。