String相关
一. 概述
-
String为引用数据类型,是一个工具类,在java.long包中。声明如下:
public final class String extends Object
注:final修饰表示不能继承
-
关于字面值(直接量)
- 数值型字面值:整数 浮点数
- 字符型字面值:字符'a'
- 布尔型字面值:true false
- 字符串字面值:“abc”//可以为空
注:java程序中所有用到的字面值,都是String的实例
-
字符串是常量:引用不能发生改变
-
String 引用=字符串字面值
-
String 引用=new String(“字面值”)
-
-
底层
String中的属性:private final char value[]
可以看出其本质是一个char数组
二. 关于字符串定义和引用
Ⅰ. value数组 由final修饰,不能修改,只能新建
String s1="abc";
s1="str"
Ⅱ. Java对于String,会查找常量池,而非直接新建堆
String s1="abc";
String s2="abc";
Ⅲ.
String s1 = new String("abc")
【注】
-
string s1="abc";string s2="abc";
在堆中只创建了一个对象
-
String s1=new String(“abc”);String s2=new String("abc")
在堆中创建了两个对象
-
String s1=“ab”;String s2=‘a’+‘b’
同地址。因为字符串的字面值,java编译会进行优化,编译后为:string s2="ab"
-
String s="ab";String s1="a";String s2=s1+"b";Sout(s==s2)//false
1.与③对比,s1不是字面值,无法优化编译
2.顶层返回新的地址空间
三. 构造方法
-
String()
初始化一个新对象,表示一个空字符序列
-
String(Char[] value)
分配一个新的String,使其表示字符数组参数中当前包含的字符序列;将字符数组转化为字符串
-
String(char[] value,int offset,int count)
分配一个新的String,包含取自字符数组的一个子数组。其中:
Int offset:起始的下标
Int count:个数
将字符数组中部分字符转为字符串
-
String(byte[] bytes)
通过使用平台的默认字符集解码指定的byte数组,构建一个新的String
-
String(byte[] bytes,String charsetName)
通过使用指定的charset解码指定的byte数组,构造一个新的String
四. String 常用方法
-
char charAt(int index)
返回指定索引处的char值,小心越界异常
-
int length()
返回字符串长度
-
char[] toCharArray()
将字符串转成一个新的字符数组,修改字符数组的元素的值不会影响原字符串的内容;
-
int compareTo(String anotherString)
按字典顺序比较
-
获取两个字符串长度最小的值,在此范围内依下标比较
-
如果相等则比较下一位,否则返回当前字符-参数字符
-
长度范围内都相等,最后返回当前字符串长度-参数字符串长度
总结:返回0:相等;负数:当前小;正数:当前大
-
-
Int compare TolgonreCase(String str)
不分大小写进行字典序比较
-
String concat(String s1)
将指定字符串连接到此字符串的结尾
效率比+高,但高不到哪里去,一般情况下用+就行了
-
boolean contains(CharSequence s)
当且仅当字符串中包含指定的char值序列时,返回true。
注:CharSequnce是个接口,String已经默认实现了,这里也是向上造型
-
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束
应用场景:根据后缀判断文件类型
-
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始
-
boolean startsWith(String prefix,int toffset)
测试此字符串从指定索引开始的字符串是否以指定前缀开始
-
int infexOf(int ch)
返回指定字符在此字符串中第一次出现的索引
从0开始,如果没有则返回-1
-
Int indexOf(int ch,int fromIndex)
返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索,没有则返回-1
-
Int indexOf(String str)
返回指定子字符串在此字符串中第一次出现处的索引
-
Int indexOf(String str,int fromIndex)
返回指定字符串在此字符串中第一次出现处的索引。从指定的索引开始
-
Int lastIndexOf(int ch)
Int lastIndexOf(int ch,int fromIndex)
Int lastIndexOf(String str)
Int lastIndexOf(String str,int fromIndex)
-
Boolean equals(Object anObject)
将此字符串与指定的对象比较
String重写了equals方法
-
Boolean equalsIgnoreCase(string anotherString)
-
byte[] getBytes()
使用平台的默认字符集将此String 编码为byte(二进制)序列,并将结果存储到一个新的byte数组中
字符转二进制:将字符映射到整数码
码表不同,中文所占字节数不同
GBK:1个字符占2个字节
Utf-8:一个字符占3个字节
注意:Idea中默认所有项目的编码都是UTF-8
eclipse中默认的编码和平台便把一致--GBK
-
byte[] getBytes(String charsetName)
使用指定的字符集将此String编码为byte(二进制)序列,并将结果储存到一个新的byte数组中
-
int hashCode()
返回此字符串的哈希码
\(S[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]*31^0\)
空字符串的哈希值为0
-
boolean isEmpty()
当且仅当length()为0时返回true
-
String replace(Char target,Char replacement)
String replace(CharSequence target,CharSequence replacement)
使用指定的字面值序列,替换此字符串中所有匹配的的字面值
-
String substring(int beginIndex)
返回一个新的字符串,是该字符串的子字符串
String substring(int beginIndex,int endIndex)
左闭右开
-
String toLowerCase()
使用默认语言环境的规则将此String中的所有字符都转化为小写。
String toUpperCase()
使用默认语言环境的规则将此String中的所有字符都转换为大写。
-
String trim()
返回字符串的副本,忽略签到空白和尾部空白
\t\r\n\r--都属于空白
只能去掉头部和尾部的空白,中间的去不掉
-
Static String valueOf(boolean b)
返回boolean参数的字符串表示形式
Static String valueOf(char[] obj)
返回char数组参数的字符串表示形式 ,本质上调用了String中参数为字符数组的构造方法
Static String valueOf(Object obj)
返回Object参数的字符串表示形式,对于数据类型除字符数组之外,其他的都是默认调用该引用数据类型的toString方法。
-
String toString()
返回此对象本身(已经是一个字符串)
-
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式
-
String replaceAll(String regex,String replacement)
使用给定的replacement替换此字符串中所有匹配正则表达式的子字符串
String replaceFirst(String regex,String replacement)
-
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
五. String和StringBuffer和StringBuilder
-
String
由于value数组被final修饰,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间。
不存在扩容
-
StringBuilder
可变类,速度更快,但是线程不安全
默认大小16,存在扩容问题
-
StringBuffer
StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 。
StringBuffer与StringBuilder都继承AbstractStringBuilder抽象类,大致相似,只在大多方法上加了Synchronized。