String类的常用方法
在所有高级语言中,字符串实际是使用字符数组进行存储的。
字符串对象的产生
字符串的对象比较
1、字符串相等的比较:使用equals方法,按照两个不同字符串对象内部的一个个字符进行比较,区分大小写。不区分大小写的比较使用equalsIgnoreCase方法进行比较
2、字符串对象大小的比较
String类实现了Comparable接口,调用comparaTo方法可以实现字符串大小的比较。
比较时,compareTo方法的返回值:
a、当两个字符串长度相同时,找到第一个不相同的字符,返回其ASCII差值。
b、两个字符串长度不同时,若前K个字符都是相等的(k表示最短长度),返回两个字符串长度的差值。
c、当两个字符串对象完全相同,该方法返回值为0。
另外一个和comparaTo方法用法一致的方法,但不区分大小写:
字符串的转化
1、关于数值和字符串的转化
a、将其他数值转化为字符串对象,调用字符串的静态方法valuOf方法。
b、将字符串对象还原为数值,调用数值包装类提供的parseXXX方法。当字符串中包含了非数字内容,会转换出错。
字符串的查找
方法 | 功能 |
---|---|
char charAt( int index ) | 返回index位置的字符,若index为负或越界,抛出越界异常 |
int indexOf(int ch) | 返回ch第一此出现的位置,没有返回-1 |
int indexOf(int ch,int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 |
int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 |
int indexOf(String str,int fromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch,int fromIndex) | 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1 |
int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 |
int lastIndexOf(String str,int fromIndex) | 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1 |
boolean contains(字符/字符串) | 查询当前字符串对象中是否包含指定内容,返回true,否则返回false |
如何判断一个字符串是否由纯数字组成?
字符串的替换
指定一个新的字符串替换已有的子串
方法 | 功能 |
---|---|
String replaceAll(被取代的子串,替换后的子串) | 全部替换 |
String replaceFirst(被取代的子串,替换后的子串) | 替换从前到后的首个字串 |
字符串的拆分
将一个完整的字符串对象,按照指定的分隔符拆分为字符串数组。
方法 | 功能 |
---|---|
String[] split(String regex) | 将字符串全部拆分 |
String[] split(String regex,int limit) | 将字符串以指定的格式,拆分为limit组 |
某些特殊分隔符的拆分问题:
根据电脑ip地址分析归属地,就需要将ip进行拆分:
在拆分时某些特殊分隔符若在程序中由特殊含义,拆分时需要进行转义处理:
多次拆封问题:
字符串的截取
从一个完整的字符串中截取出一些内容。
方法 | 功能 |
---|---|
String substring(int beginIndex) | 从指定索引截取到结尾 |
String substring(int beginIndex,int endIndex) | 截取部分内容 |
JDK表示区间的函数一般都是左闭右开,substring函数中包含开始索引的字符,不包含结束索引的字符。
字符串的补充方法
方法 | 功能 |
---|---|
String trim() | 去掉字符串的左右空格,保留中间空格 |
String toUpperCase() | 字符串转大写(只能是英文字母) |
String toLowerCase() | 字符串转小写(只能是英文字母) |
接收一个英文字符串,将英文字符串的首字母大写:
字符串常量池
1、关于直接赋值法和new的方式产生对象的区别
当字符串的对象采用赋值法创建时,JVM会维护一个常量池,当字符串对象第一次产生时,就会产生该字符串对象,置入常量池中,当使用赋值法再次要产生该对象,若常量池中已经包含了改值的对象,直接复用常量池中的对象,并不会产生新的字符串对象。使用直接赋值法产生字符串引用,可以更加高效的利用空间;new方式产生,就得在堆上开辟新的空间。
2、关于intern方法
调用该方法,会将当前的字符串对象尝试置入常量池中:
a、若常量池中已经包含了当前对象的内容,不会将当前对象置入常量池,返回常量池中原有地址的对象;
b、若常量池中没有包含当前对象的内容,就将当前对象置入常量池中,返回的还是当前对象的地址。
情况1:
情况2:
情况3:
情况4:
总结:对象内容是否相等使用equals,不会有异议!!!!
字符串不可变性
1、定义:String对象一旦产生,字符串对象中保存的值不可改变。
上述代码中,一直改变的是字符串str的引用,不断指向了新的字符串对象。
2、String对象不可变的本质
String类的源码:
String被final修饰:相当于该类没有子类,JDK关闭了该类的拓展,保证所有使用者拿到的都是相同的类和方法。对于String类,没有多态。
value被final修饰:说明该引用一旦赋值,只能指向对应的字符数组对象(只有final不够,此时数组对象的内容还是可变的)。
value被private修饰:value被private封装,则整个数组对字符串类中完全隐藏,同时String类没有对外提供getter和setter方法,无法修改其内容,这才是不可变的本质。
3、String提供的字符串修改方法,其实是产生了新的字符串对象,并不是在原有基础上修改!!
以截取subString,replace,toUpperCase为例,看似都更改了字符串内容,本质上都产生了新的字符串对象!!
subString源码的返回值:
4、经典示例
StringBuffer类和StringBuilder类
由于字符串的不可变性,因此当需要频繁的修改字符串内容时,我们就需要用到JDK提供的另外两个类:StringBuffer和StringBuilder,这两个类的使用完全一致,都是修改字符串内容时用到的类。且这两个类和String类是完全独立的类,完全不是一个类。
StringBuffer
StringBuffer是线程安全的类,性能较差,一般用在多线程并发修改内容时。
StringBuilder和String的相互转换
StringBuilder类是线程不安全的类,性能较高,能满足大部分的场景使用。
1、将String对象转换成StringBuilder对象。
a、通过StringBuilder的构造方法;
b、通过StringBuilder类的成员方法append(str)。
2、将StringBuilder对象转换成String对象。
StringBuilder类的常用方法
1、增
方法 | 功能 |
---|---|
StringBuilder append(String str) | 默认在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuilder的变量 |
StringBuilder insert(int offset,String str) | 在offset位置插入:八种基本类型&String类型&Object类型数据 |
2、删
方法 | 功能 |
---|---|
StringBuilder deleteCharAt(int index) | 删除index位置的字符 |
StringBuilder delete(int start ,int end) | 删除[start,end)区间内的字符 |
3、改
方法 | 功能 |
---|---|
void setCharAt(int index,char ch) | 将index位置的字符设置为ch |
StringBuilder replace(int start,int end,String str) | 将[start,end) 位置的字符替换为str |
4、查
方法 | 功能 |
---|---|
char charAt(int index) | 获取index位置的字符 |
int indexOf(String str) | 返回str第一次出现的位置 |
int indexOf(String str,int fromIndex) | 从fromIndex位置开始找str第一次出现的位置 |
int lastIndexOf(String str) | 返回最后一次出现str的位置 |
int lastIndexOf(String str,int fromIndex) | 从fromIndex位置开始找str最后一次出现的位置 |
5、转置
方法 | 功能 |
---|---|
StringBuilder reverse() | 将当前字符串逆序处理 |