String
- 字符串是什么
- 字符串的特点
- 字符串的API
- 字符串的常量池
- 字符串的衍生类
- StringBuilder的常用API
- String与其衍生类的区别
字符串是什么
一种引用数据类型
- 顾名思义,字符串是由字符组成的长串,所以字符串的实现原理是字符数组
字符串的特点
- 不可变:字符串本质是字符数组,而数组是被final修饰的(即数组是不可变的)
- 对字符串的操作:创建一个新的字符串,内容为源字符串进行操作后的结果,再将源字符串的引用指向新的字符串
- 不可被继承:String类被final修饰,无法被继承
- 直接赋值:字符串可以像基本数据类型一样直接赋值
- String=“10”;
- String=“字符串”;
- 做加法:字符串的加法本质是字符串的拼接
- 任何类型的数据与字符串做加法,运算结果都是字符串
字符串的API
以下是字符串的原生API
- 构造方法:
- 空参构造器:new String(),创建的字符串为空(不是null)
- 有参构造器:String,int[],byte[],char[],StringBuffer,StringBuilder
- 比较两个字符串:
- int CompareTo(String s):按字典顺序比较两个字符串,参数大,返回正数;参数小,返回负数;完全相等,返回0(按位依次比较,返回值累加)
- int CompareIgnoreCase(String s):按字典顺序比较两个字符串,不考虑大小写
- boolean contains(String s):字符串是否包含指定字符串,若包含,则返回true;反之,则返回false
- static String copyValueOf(char[ ] chars):将字符数组转成字符串
- boolean endsWith(String s):若字符串以指定字符串结尾,则返回true;反之,返回false
- 使用场景:判断邮箱后缀,例如是否以qq.com结尾
- boolean startsWith(String s):若字符串以指定字符串开头,则返回true;反之,返回false
- 使用场景:判断电话号码的区号、手机号码所属国家等
- boolean startsWith(String s,int index):若从索引位置开始以指定字符串开头,则返回true;反之,返回false
- boolean equals(Object o):字符串与任意类型的数据比较,若相等,则返回true;反之,则返回false
- String中的equals()已被重写
- boolean equalsIgnoreCase(String s):字符串与任意类型的数据比较,不考虑大小写
- int indexOf():
- indexOf(int ch):返回字符在此字符串中第一次出现的位置的索引
- 需要注意的是:所需参数并非是完全意义上的整形,而是一个字符,ch为字符的Unicode码
- indexOf(int ch,int fromIndex):返回从指定索引(包括指定索引)位置开始,字符第一次出现的位置的索引
- indexOf(String s):返回字符串在此字符串中第一次出现的位置的索引
- indexOf(String s,int fromIndex):返回从索引(包括索引)位置开始,字符串第一次出现的位置的索引
- indexOf(int ch):返回字符在此字符串中第一次出现的位置的索引
- int laseIndexOf(…):返回[参数]在此字符串中最后一次出现的位置的索引
- 重载方法与indexOf(…)类似
- boolean isEmpty():判断字符串是否为"",若为空,则返回true;反之,返回false
- String replace(char oldChar,char newChar):用新字符替换字符串中的旧字符
- String subString(int beginIndex):从索引处开始截取字符串
- String subString(int beginIndex,int endIndex):从[beginIndex]索引处开始截取字符串,到[endIndex]索引处结束
- 注意:不包含[endIndex]索引处的字符
- String toLowerCase():将字符串所有字母小写化
- String toUpperCase():将字符串所有字母大写化
- String trim():去除字符串前后的空格,不去除字符串内部的空格,常用于用户名验证
- static String valueof(E e):将任意类型的数据转化为字符串
以下是字符串实现CharSequence的API
- int length():返回字符串的字符个数
- 双引号内的所有内容,包括字母、汉字、空格、标点符号、特殊符号
- char charAt(int index)
- 返回字符串中索引为[index]的字符,索引从0开始
字符串的常量池
-
常量池范围:无限大
- 与Integer常量池的区别:Integer常量池有范围(-128~127)
-
一般进池方式:所有通过直接赋值方式创建的字符串都会进常量池
-
特殊进池方式:
-
通过字面量直接运算得到的字符串也会进常量池,例如:
public static void main(String args[]){ String s = "he"+"llo"; //此时s会进入常量池 }
-
运算中存在变量时,运算得到的字符串不会进常量池,例如:
public static void main(String args[]){ String s1 = "he"; String s = s1+"llo"; //此时s不会进入常量池 }
-
字符串的衍生类
String有两个衍生类:
- StringBuffer
- StringBuilder
它们出现的目的是改进字符串的缺点,改进有两方面组成:
- 不可变—>可变
- 线程不安全—> 线程安全(StringBuffer安全,StringBuilder不安全)
它们俩除了在线程安全方面有所差异,其它方面并无明显差别,所以接下来的API介绍会以StringBuilder为例
StringBuilder的常用API
-
构造方法:
- StringBuilder():创建一个空的StringBuilder,初始容量为16个字符
- StringBuilder(int capacity):创建一个空的StringBuilder,长度由传入的参数控制
- StringBuilder(CharSequence seq):传入字符
- StringBuilder(String str):传入字符串
-
append():
- append(E e):将任意类型的参数追加到序列末尾,有多种重载
- append(char[],int start,int length):从数组的[start]位置开始,长度为length个元素追加到序列末尾
- append(String str,int start,int end):从字符串的[start]位置开始,到[end]位置结束的字符都追加到序列末尾,不包括[end]位置的元素
-
delete(int start,int end):删除从[start]到[end]之间的所有字符串,不包括[end]处的字符
-
deleteCharAt(int index):删除指定索引处的字符
-
replace(int start,int end,String str):将[start]到[end]位置的内容替换为新字符串,不包括[end]处的字符
- 与String的区别:String是单个字符的替换,StringBuffer是长串字符的替换
-
insert():
- insert(int index,E e):将所有类型的参数插入字符串的指定位置
- insert(int index,String str,int start,int end):截取[start]到[end]位置的字符串插入到[index]位置,不包括[end]位置的字符
- insert(int index,CharSequence seq,int start,int end):截取[start]到[end]位置的元素插入到[index]位置,不包括[end]位置的字符
-
reverse():将字符串中的内容前后倒置
-
subSequence(int start,int end):与String的方法类似
-
其它方法的使用方式均与String相同
以上方法的返回值均为StringBuffer对象本身
String与其衍生类的区别
String | StringBuffer | StringBuilder | |
---|---|---|---|
是否可被继承 | × | × | × |
是否可变 | × | √ | √ |
是否线程安全 | × | √ | × |
线程安全(StringBuffer)效率低,线程不安全(StringBuilder)效率高,单个线程时优先使用StringBuilder