字符串的基本操作
String类的概述
JDK提供的API,查看String类的说明可以看到下面两句话
字符串字面值"abc"也可以看成是一个字符串对象。
字符串是常量,一旦被赋值,就不能被改变。
String类的构造方法
方法 | 说明 |
---|---|
public String() | 空构造 |
public String(byte[] bytes) | 把字节数组转成字符串 |
public String(byte[] bytes,int index,int length) | 把字节数组的一部分转成字符串 |
public String(char[] value) | 把字符数组转成字符串 |
public String(char[] value,int index,int count) | 把字符数组的一部分转成字符串 |
public String(String original) | 把字符串常量值转成字符串 |
String类的判断功能
方法 | 说明 |
---|---|
boolean equals(Object obj) | 比较字符串的内容是否相同,区分大小写 |
boolean equalsIgnoreCase(String str) | 比较字符串的内容是否相同,忽略大小写 |
boolean contains(String str) | 判断大字符串中是否包含小字符串 |
boolean startsWith(String str) | 判断字符串是否以某个指定的字符串开头 |
boolean endsWith(String str) | 判断字符串是否以某个指定的字符串结尾 |
boolean isEmpty() | 判断字符串是否为空。 |
String类的获取功能
方法 | 说明 |
---|---|
int length() | 获取字符串的长度。 |
char charAt(int index) | 获取指定索引位置的字符 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引。 |
int indexOf(String str) | 返回指定字符串在此字符串中第一次出现处的索引。 |
int indexOf(int ch,int fromIndex) | 返回指定字符在此字符串中从指定位置后第一次出现处的索引。 |
int indexOf(String str,int fromIndex) | 返回指定字符串在此字符串中从指定位置后第一次出现处的索引。 |
String substring(int start) | 从指定位置开始截取字符串,默认到末尾。 |
String substring(int start,int end) | 从指定位置开始到指定位置结束截取字符串。 |
String类的转换功能
方法 | 说明 |
---|---|
byte[] getBytes() | 把字符串转换为字节数组。 |
char[] toCharArray() | 把字符串转换为字符数组。 |
static String valueOf(char[] chs) | 把字符数组转成字符串。 |
static String valueOf(int i) | 把int类型的数据转成字符串。 注意:String类的valueOf方法可以把任意类型的数据转成字符串。 |
String toLowerCase() | 把字符串转成小写。(了解) |
String toUpperCase() | 把字符串转成大写。 |
String concat(String str) | 把字符串拼接。 |
String其他类型互转汇总
其它类型转成String类型
-
toString()
-
Object类中有public方法toString(),java对象都可以调用。注意:必须保证类对象不能为null值,否则抛出NullPointerException异常,派生类中一般覆盖此方法。
-
(String)
-
强制类型转换,需要保证能够转成String,前面使用instanceof进行检查,否则抛出CalssCastException异常。注意:语法检查时不会报错,用时一定要小心。
-
valueOf(基本类型 i)
-
与第一种类似,只是前者不能为null,后者可以为null。
-
""+
-
效率上toString()>String.valueOf>i+””
String类型转成其它类型
-
valueOf(String str)
-
可以把任意类型的数据转成字符串
-
parseLong(String str)和parseInt(String str)
-
注:基本类型数据级别(byte/short/char)->int->long->float->double
低级别向高级别自动转换;高级别向低级别强制转换会导致溢出或丢失精度
附:基本类型与包装类类型转换
正向:Integeri=new Integer(100);
反向:int b=i.intValue();
特殊:int i=Integer.parseInt(“1234”);//可以通过
floatf=Float.valueOf("1234").floatValue();
charc=Character.valueOf(“1233”).charValue();
String、StringBuffer与StringBuilder之间区别
StringBuffer常用方法(StringBuilder的省略)
(由于StringBuffer和StringBuilder在使用上几乎一样,所以只写一个)
构造方法
方法 | 说明 |
---|---|
publicStringBuffer() | 初始化出的StringBuffer对象是一个空的对象 |
publicStringBuffer(int capacity) | 分配了长度为capacity字节的字符缓冲区 |
publicStringBuffer(String str) | 创建带有内容的StringBuffer对象 |
例子
StringBuffer s = new StringBuffer();
这样初始化出的StringBuffer对象是一个空的对象
StringBuffer sb1=new StringBuffer(512);
分配了长度512字节的字符缓冲区。
StringBuffer sb2=new StringBuffer(“how are you?”)
创建带有内容的StringBuffer对象,在字符缓冲区中存放字符串“how are you?”
常用方法
方法 | 说明 |
---|---|
StringBuffer append(boolean b) | 表示将括号里的某种数据类型的变量插入某一序列中 |
charAt( ) | 返回此序列中指定索引处的 char 值 |
getChars(int start,int end,char chars[],int charStart) | 将字符串的子字符串复制给数组 |
int length() | 返回长度(字符数)。 |
toString( ) | 返回此序列中数据的字符串表示形式。 |
subString( ) | 返回一个新的 String,它包含此序列当前所包含的字符子序列。 |
StringBuffer delete(int start,int end) | 删除指定区间以内的所有字符,包含start,不包含end索引值的区间。 |
StringBuffer deleteCharAt(int index) | 删除指定位置的字符,然后将剩余的内容形成新的字符串 |
StringBuffer insert(int offset, Object obj) | 该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。 |
StringBuffer reverse() | 将StringBuffer对象中的内容反转,然后形成新的字符串 |
void setCharAt(int index, char ch) | 修改对象中索引值为index位置的字符为新的字符ch |
void trimToSize() | 将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费,和String的trim()是一样的作用。 |
执行速度比较
对字符串操作三者在执行速度方面的比较
StringBuilder > StringBuffer > String
String <(StringBuffer,StringBuilder)的原因
String:字符串常量
StringBuffer:字符创变量
StringBuilder:字符创变量
从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。
String s = "abcd";
s = s+1;
System.out.print(s);// result : abcd1
JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来;执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多底。
而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。
StringBuilder与 StringBuffer
StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。