1.特点
1. 字符串对象一旦被初始化就不会被改变
2. 字符串缓冲区(常量池),新建字符串时先去常量池找,有就把地址返回,没有就创建。
例子:
1.
String s = "abc"; //存储在字符串常量池中
String s1 = "abc";
System.out.println(s == s1); //true
2.
String s = "abc"; //在常量池中产生一个字符串对象,共享的
String s1 = new String("abc"); //初始化"abc"字符串对象。新创建的字符串是"abc"的副本。s1特有
//就是在堆内存里面产生两个对象,一个new,一个字符串对象。
System.out.println(s == s1); //flase
System.out.println(s.equals(s1)); //String类是Object的子类,它复写了equals()方法,这里比较的不是地址了,是内容。
//其实就是比较字符串内容,true
2.构造函数
例子:
1.
String s = new String(); //等效与String s = ""; 不等效String s = null;
byte[] arr = {65,66,67,68};
String s1 = new String(arr); //将字节数组变成字符串,ABCD
2.
char[] arr = {'C','z','q','G','s'};
String s = new String(arr,0,3); //将字符数组指定部分变成字符串,这里从0开始,取3个,即Czq
3.方法:
按照面对对象的思想对字符串进行功能分类
"abcd"
1.获取:
1.1. 获取字符串中字符的个数。
int length();
1.2根据位置获取字符。
char charAt(int index);
1.3根据字符/字符串 获取在字符串中第一次出现的位置。不存在返回-1
int indexOf(int ch); 从0开始
int indexOf(int ch, int fromIndex);从指定位置进行ch的查找,第一次出现的位置
int indeOf(String str);
int indeOf(String str, int fromIndex);
int lastIndexOf(int ch); 从最后一个开始
int lastIndexOf(int ch, int fromIndex);
int lastIndeOf(String str);
int lastIndeOf(String str, int fromIndex);
1.4获取字符串中的一部分字符串。也叫子串。
String substring(int beginIndex, int endIndex) 包含begin,不包含end
String substring(int beginIndex)
2.转换:
2.1将字符串变成字符串数组(字符串的切割):涉及到正则表达式
String[] split(String regex) regex - 定界正则表达式
String[] split(String regex, int limit) limit 切割成几段
2.2将字符串转换成字符数组。反过来用字符串构造函数。
或者使用静态方法:String copyValueOf(char[] data)
String copyValueOf(char[] data,int offset, int count)
String[] toCharArray();
2.3将字符串变成字节数组
byte[] getByte(); 一个汉字两个字节,是负的
2.4将字符串中的字母转换成大小写
String toUpperCase() : 大写
String toLowerCase(): 小写
2.5将字符串中的内容进行替换
String replace(char oldChar, char newChar); 如果没有找到旧字符,就不新建字符串,直接在常量池中调用原字符串对象
String replace(CharSequence target, CharSequence replacement); 字符串替换,String类是CharSequence接口的子类。(它所有的子类都可以替换)
2.6将字符串两端的空格去掉,返回字符串的副本
String trim();
2.7将字符串进行连接
String concat(String str) 如果str长度为0,则不创建新字符串,直接在常量池中调用原字符串对象
和 + 等效,但是上面的更专业。
2.8将基本数据类型将换成字符串,静态方法
String valueOf(boolean b)
String valueOf(char c)
String valueOf(char[] data)
String valueOf(char[] data,int offset,int count)
String valueOf(double d)
String valueOf(float f)
String valueOf(int i)
String valueOf(long l)
String valueOf(Object obj)
3判断:
3.1两个字符串内容是否相同
boolean equals(Object obj) 区分大小写
boolean equalsIgnoreCase(String str) 忽略大小写
3.2字符串中是否包含指定字符串
boolean contains(String str)
3.3字符串是否以指定字符串开头/结尾
boolean startsWith(String);
boolean endsWith(String);
4.比较:按字典顺序比较。等于,返回0。小于,返回一个负数。大于返回一个正数
int compareTo(String anotherString)
4.intern方法:操作字符串池,如果字符串池中包含此字符串,则返回池中的字符串。如果池中没有,在则在池中新建一个并返回新的字符串对象。开发基本不用
String s1 = new String("abc"); //"abc"是在对象中被操作,池中没有
String s2 = s1.intern(); //相当于将新的"abc"存到池里
System.out.println(s1==s2); //false
String s1 = "abc"; 在池中新建
String s2 = s1.intern();
System.out.println(s1==s2); //true
5.StringBuffer:就是字符串缓存区。(内部就相当于数组,默认16个字符)
用于存储数据的容器。
特点:
1.长度可变
2.可以存储不同类型数据
3.最终要转成字符串进行使用。toString()
4.对字符串可以修改
具备的功能: 增删改查 C(create增)U(update改)R(read查)D(delete删)
1.添加:
StringBuffer append(data); 追加到尾部
StringBuffer insert(int offset, data); 插入到指定位置
2.删除:
StringBuffer delete(int start, int end); 包含头,不包含尾
StringBuffer deleteCharAt(int index); 删除指定位置的元素
delete(0,sb.length()); 清空
3.修改:
StringBuffer replace(start,end,string); 替换
void setChatAt(index, char); 替换一个字符
4.查找:
char charAt(index);
int indexOf(String);
int lastIndexOf(String);
5.其他:
设置长度: void setLength(int );
sb.setLength(0); 清空(了解)
反转: StringBuffer reverse
注意:
可变长度数组: 容量不够就新建一个数组,把原来的元素复制过来,然后添加新的元素。容量是原来的一倍不等。
能确定容器容量时最好在初始化时就确定,效率高些。
- StringBuilder: jdk1.5以后出现了和StringBuffer一模一样的对象。
不同的是:
StringBuffer是线程同步的。如果是单线程每次运行都要判断锁,效率低。安全,通常用于多线程。
StringBuilder是线程不同步的。是补充的单个线程的等价类,单线程时优先使用StringBuilder,由于不执行同步,所以速度更快。
原理:
class StringBuffer
{
Object lock;
public StringBuffer append(int x)
{
synchronized(lock)
{}
}
public StringBuffer delete(int start, int end)
{
synchronized(lock)
{}
}
}