1.概述
String对象的创建:
String s1=new String(“abc”);
String s2=”abc”;
说明:以上两种创建方式等价;s1是一个类类型变量,“abc”则是一个字符串对象
s1和s2有什么区别?
s1在内存中有一个对象,s2在内存中有两个对象(在常量池中存在一个对象副本)
String的特性:一旦被初始化就不可以被改变
2.字符串的比较
两种比较方式:
s1==s2
s1.equals(s2);
说明:String
复写了Object
类中的equals
方法,该方法用于判断字符串内容是否相同;==则会比较两侧的对象地址是否相同
3.String常用方法
1.与获取相关的方法
获取字符串长度:
int length();
根据索引获取相应位置上的字符:
char charAt(int index)
可能出现角标越界异常根据给定字符获取字符在字符串中的位置:
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引。int indexOf(int ch, int fromIndex)
返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。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)
返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。说明:以上方法若没有找到目标值,则返回-1
2.与判断相关的方法
字符串中是否包含某一字串
boolean contains(CharSequence s)
当且仅当此字符串包含指定的 char 值序列时,返回 true。说明:CharSequence是一个接口,实现类有String和StringBuffer
特殊用法:利用indexOf(str)在字符串不存在时返回-1的特性,也能进行字符串是否包含某一字串,且该方法还能获取该字符串出现的位置
字符串中是否存在内容
boolean isEmpty()
当且仅当 length() 为 0 时返回 true。说明:JDK1.6之后加入本方法
原理:判断字符串长度字符串是否以指定内容结束
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。字符串是否以指定内容开头
boolean startsWith(String prefix)
测试此字符串是否以指定的前缀开始。boolean startsWith(String prefix, int toffset)
测试此字符串从指定索引开始的子字符串是否以指定前缀开始。判断字符串内容是否相同
boolean equals(Object anObject)
将此字符串与指定的对象比较。判断字符串内容是否相同,并忽略大小写
boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写。
3.与转换相关的方法
将字符数组转换成字符串
构造方法:
String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。String(char[] value, int offset, int count)
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。说明:offset是起始索引,count是字符个数
成员方法:
static String copyValueOf(char[] data)
返回指定数组中表示该字符序列的 String。static String copyValueOf(char[] data, int offset, int count)
返回指定数组中表示该字符序列的 String。static String valueOf(char c)
返回 char 参数的字符串表示形式。static String valueOf(char[] data)
返回 char 数组参数的字符串表示形式。static String valueOf(char[] data, int offset, int count)
返回 char 数组参数的特定子数组的字符串表示形式。将字符串转成字符数组
char[] toCharArray()
将此字符串转换为一个新的字符数组。将字节数组转成字符串
String(byte[] bytes)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。String(byte[] bytes, int offset, int count)
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。将字符串转为字节数组
byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte数组中。说明:字符串和字节数组在转换过程中,是可以指定编码表的。
将基本数据类型转成字符串
static String valueOf(boolean b)
返回 boolean 参数的字符串表示形式。static String valueOf(double d)
返回 double 参数的字符串表示形式。static String valueOf(float f)
返回 float 参数的字符串表示形式。static String valueOf(int i)
返回 int 参数的字符串表示形式。static String valueOf(long l)
返回 long 参数的字符串表示形式。static String valueOf(Object obj)
返回 Object 参数的字符串表示形式。
4.与替换相关的方法
String replace(char oldChar, char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的说明:使用后内存中存在两个字符串,原字符串并未改变。若要替换的字符oldChar不存在则返回原字符串
String replace(CharSequence target, CharSequence replacement)
使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。说明:可以传入字符串参数,CharSequence是一个接口,实现类有String和StringBuffer
5.与切割相关的方法
String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。说明:可以按传入的regex为分隔符对字符串进行切割,返回字符串数组
6.获取字符串子串的相关方法
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。说明:从指定位置截取到结尾
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。说明:包含头字符不包含尾字符
7.其他常用方法
将字符串装换为全大写或全小写
String toLowerCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。String toUpperCase()
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。将字符串两端多余空格去除
String trim()
返回字符串的副本,忽略前导空白和尾部空白。对两个字符串进行自然顺序比较
int compareTo(String anotherString)
按字典顺序比较两个字符串。int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,不考虑大小写。说明:按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。按字典顺序将此String对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为0;compareTo 只在方法 equals(Object) 返回 true 时才返回 0。
4.一系列示例程序
1.模拟一个trim方法
//模拟trim方法
public String myTrim(String s){
int start=0,end=s.length()-1;
//单引号代表char类型
while(start<=end&&s.charAt(start)==' ')
start++;
while(end>=start&&s.charAt(end)==' ')
end--;
return s.substring(start, end+1);
}
说明:以上方法用于去除字符串两端的空格
2.将字符串进行反转
步骤:
- 1.将字符串转换为数组
- 2.将数组反转(运用循环、首位互换)
- 3.将得到的数组转换为字符串
部分代码:
//对整个字符串进行反转
public String reverString(String s){
return(reverseString(s,0,s.length()));//调用三个参数的构造方法
}
//从指定位置对字符串进行反转
public String reverseString(String s,int index,int end){
char[] chars=s.toCharArray();
reverse(chars,index,end);
s=new String(chars);
return s;
}
//对数组进行反转
public void reverse(char[] chars,int index,int end){
for(int start=index,off=end-1;off>start;start++,off--){
swap(chars,start,off);
}
}
//对参数进行值交换操作
public void swap(char[]c,int x,int y){
char temp=c[x];
c[x]=c[y];
c[y]=temp;
}
思想:方法相互调用,将功能尽量细分(例如本例中的reverseString
、reverse
、swap
),写成一个小的函数。这样更便于对程序进行修改,且可以增加代码的复用。而这样的编写过程也符合程序设计思想。
3.获取一个字符串在另一个字符串中出现的次数
步骤:
- 1.定义一个计数器
- 2.获取指定字符第一次出现的位置索引
- 3.运用循环对该位置之后的字符串再次进行获取,每找到一次计数器自加一次
- 4.当无法再次获取时,程序结束
部分代码:
//获取一个字符串在另一个字符串中出现的次数
public int countString(String srcString,String keyString){
int count=0;
for(int location=0;(location=srcString.indexOf(keyString,location))!=-1;){
count++;
System.out.println(location);
location+=keyString.length();
}
return count;
}
或
//获取一个字符串在另一个字符串中出现的次数-另一种写法
public int countString(String srcString,String keyString){
int count=0;
int location=0;
while((location=srcString.indexOf(keyString,location))!=-1){
count++;
location+=keyString.length();
}
return count;
}
4.获取两个字符串中最大的相同字串
步骤:
- 用三目运算符获得两参数中的长度较大者和较短者
- 在循环结构中,根据长度递减的原则,利用’substring’将较短的字符串切割。每次用较长的字符串判断是否包含切割后的较短字符串。若存在,则返回该字符串。若无法找到,返回null
部分代码:
//获取两个字符串中最大的相同字串
public String getSameString(String srcString,String anoString){
// 获取两字符串中长度较短的
String shortString = srcString.length() > anoString.length() ? anoString : srcString;
String longString = shortString == srcString ? anoString : srcString;
// 若短字符串本身就包含于长字符串,则返回该短字符串
if (longString.contains(shortString))
return shortString;
for (int i = 0; i < shortString.length(); i++) {
for (int start = 0, end = shortString.length() - i; end <= shortString
.length(); start++, end++) {
String tempString = shortString.substring(start, end);
if (longString.contains(tempString))
return tempString;
}
}
return null;
}
5.StringBuffer
1.概述
线程安全的可变字符序列。一个类似于String
的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
特点:
StringBuffer
可以对字符串内容进行增删操作StringBuffer
是一个容器- 很多方法与
String
相同 StringBuffer
是可变长度的- 可以直接操作多种数据类型
- 可以通过
toString
转化为字符串
常用构造方法:
StringBuffer()
构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
2.常用方法
- 1.存储
将指定数据作为参数添加到已有数据结尾处
StringBuffer append(boolean b)
StringBuffer append(char c)
StringBuffer append(char[] str)
StringBuffer append(char[] str, int offset, int len)
按照指定的首字符索引和字符个数将字符数组添加到StringBuffer对象中StringBuffer append(CharSequence s)
将指定的 CharSequence 添加到该序列。
StringBuffer append(CharSequence s, int start, int end)StringBuffer append(double d)
StringBuffer append(float f)
StringBuffer append(int i)
StringBuffer append(long lng)
StringBuffer append(Object obj)
StringBuffer append(String str)
StringBuffer append(StringBuffer sb)
将指定的 StringBuffer 添加到此序列中。
将指定数据作为参数插入到已有数据指定位置处
StringBuffer insert(int offset, boolean b)
StringBuffer insert(int offset, char c)
StringBuffer insert(int offset, char[] str)
StringBuffer insert(int index, char[] str, int offset, int len)
StringBuffer insert(int dstOffset, CharSequence s)
StringBuffer insert(int dstOffset, CharSequence s, int start, int end)
StringBuffer insert(int offset, double d)
StringBuffer insert(int offset, float f)
StringBuffer insert(int offset, int i)
StringBuffer insert(int offset, long l)
StringBuffer insert(int offset, Object obj)
StringBuffer insert(int offset, String str)
说明:以上方法调用后返回StringBuffer
对象,即原对象已经发生改变。可以使用方法调用链的方式连输调用
- 2.删除
StringBuffer delete(int start, int end)
删除缓冲区中的数据,包含start,不包含endStringBuffer deleteCharAt(int index)
删除指定位置的字符
- 3.获取
char charAt(int index)
int indexOf(String str)
int indexOf(String str, int fromIndex)
int lastIndexOf(String str)
int length()
String substring(int start)
String substring(int start, int end)
- 4.修改
StringBuffer replace(int start, int end, String str)
void setCharAt(int index, char ch)
StringBuffer reverse()
内容反转
- 5.其他
String toString()
转换为字符串void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此字符串复制到目标字符数组。
6.StringBuilder
概述:一个可变的字符序列。此类提供一个与StringBuffer
兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer
要快。 [JDK1.5之后]
总结:方法与StringBuffer
用法相同;是线程不同步的,将 StringBuilder
的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer
。
7.基本数据类型对象包装类
1. 对应关系
基本数据类型 | 引用数据类型 |
---|---|
byte | Byte |
short | Short |
long | Long |
boolean | Boolean |
float | Float |
double | Double |
char | Character |
int | Integer |
2. 常见用法
基本数据类型转字符串:
1.基本数据类型+”“
2.基本数据类型包装类.toString(基本数据类型值)
例:Interger.toString(34);
字符串转基本数据类型:
基本数据类型包装类.parse基本数据类型(String s)
例:int a=Boolean.parseInt(“123”);
十进制转换为其他进制:
static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。static String toHexString(int i)
以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。static String toOctalString(int i)
其他进制转换为十进制:
static int parseInt(String s, int radix)
使用第二个参数指定的基数(即进制),将字符串参数解析为有符号的整数。
8.基本数据类型包装类新特性
1.自动装箱拆箱
[JDK1.5之后]
旧写法:
Integer x=new Integer(4);
int x=x.intValue+2;
新特性:
Integer x=4; 自动装箱
x=x+4;//自动拆箱+自动装箱(最终仍然返回Integer)
2.小知识
Integer a=128;
Integer b=128;
System.out.println(a==b);//输出false 双方指向不同的对象
Integer m=127;
Integer n=127;
System.out.println(m==n);//输出true 当数值在byte范围内时,对于新特性,若该值已经存在,则不会再开辟新的内存空间