您的位置:首页 > 产品设计 > UI/UE

黑马程序员_String-StringBuffer-StringBuilder

2013-12-10 14:23 543 查看
一、String
String对象在内存中的存储位置

public static void main(String[] args) {

String str1="abc";

String str2="abc";

System.out.println(str1==str2);

}
String对象内容存储在内存中的常量池中;创建字符串对象时会在内存中查找,如果已经存在,则不会新开辟空间,所以示例中的返回值为true。

String常用方法:
1、获取:

(1)、int length():获取长度,字符串中包含的字符数,也就是字符串的长度,字符串是方法,数组是属性

(2)、根据位置获取位置上的某个字符
char charAt(int index)
(3)根据字符获取该字符在字符串中的位置
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置
int indexOf(int ch,int fromIndex):从fromIndex指定位置开始,获取str在字符串中的出现的位置
int indexOf(String str):返回的是ch在字符串中第一次出现的位置
int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取str在字符串中的出现的位置

2、判断:

(1)、字符串中是否包含一个子串

boolean contains(CharSequence s) 特殊之处:indexOf(str):可以索引str第一次出现的位置,如果返回-1,表示该str不在字符串中存在,所以,也可以用于对指定判断是否包含。
if(str.indexOf("aa")!=-1) 该方法既可以判断,也可以获取出现的位置

(2)、字符串中是否有内容

boolean isEmpty() 原理是判断长度是否为0,“” null不一样

(3)、字符串是否以指定内容开头

boolean startsWith(str)

(4)、字符串是否以指定内容结尾

boolean endsWith(str)

(5)、判断字符串内容是否相同

boolean equals(str);

(6)、判断内容是否相同,并忽略大小写

boolean equalsIgnoreCase(str);
(7)、示例:

public class Demo{
public static void method_is(){
String str = "ArrayDemo.java";
//判断是否以array开头
sop(str.startsWith("Array"));
//判断是否以.java结尾
sop(str.endsWith(".java"));
//是否包含demo
sop(str.contains("Demo"));
}
public static void method_get(){
String str = "abcdef";
//长度
sop(str.length());
//根据索引获取字符
sop(str.charAt(4));//当访问到字符串中不存在的角标时,会发生角标越界(StringIndexOutOfBoundsException )
//根据字符获取索引
sop(str.indexOf('a'));
//在指定位置,根据字符获取索引
sop(str.indexOf('a',40));//如果没有找到,返回-1
//反向索引一个字符出现的位置
sop(str.lastIndexOf('f'));
}
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
method_is();
method_get();
}
}


3、转换

(1)、将字符数组转成字符串

构造函数:

String(char[] value)

String(char[] value, int offset, int count)将字符数组一部分转成字符串

静态方法:

static String copyValueOf(char[] data);

static String copyValueOf(char[] data,int offset,int count);

static String ValueOf(char[] data);

(2)、将字符串转成字符数组

byte[] getBytes()

byte[] getBytes(Charset charset)

(3)、将字节数组转成字符串

String(byte[] value)

String(byte[] value, int offset, int count)将字节数组一部分转成字符串

(4)、将字符串转成字节数组

char[] toCharArray() 将此字符串转换为一个新的字符数组

(5)、将基本数据类型转成字符串

static String valueOf(double d)

static String valueOf(int i)

特殊:字符串恶化字节数组在转换过程中,是可以指定编码表的。

(6)、转换

将字符串转换成大写或小写

String toUpperCase();

String toLowerCase();

(7)、示例:

public class Demo{
public static void main(String[] args){
method_trans();
}
public static void method_trans(){
char[] arr = {'a','b','c','d','e','f'};
String s = new String(arr,1,3);
sop("s="+s);
String s1="zhangsan";
char [] ch=s1.toCharArray();
for(int x=0;x<ch.length;x++){
sop("ch="+ch[x]);
}

}
public static void sop(Object obj){
System.out.println(obj);
}
}


4、切割和替换

(1)、替换

String replace(char oldChar,char newChar)

(2)、切割

String[] split(String str)

(3)、子串,获取字符串中的一部分,

String substring(int beginIndex)

String substring(int beginIndex, int endIndex) //包含头,不包含尾部

(4)、示例:

public class Demo{
public static void main(String[] args){
method_sub();
}
public static void method_split(){
String s = "zhangsan,lisi,wangwu";
String[] arr = s.split(",");
for(int i=0;i<arr.length;i++){
sop(arr[i]);
}
}
public static void method_sub(){
String s = "abcdef";
sop(s.substring(2));    //从指定位置开始到结尾,如果交表不存在,会出现字符串角标越界异常
sop(s.substring(2,4));    //包含头,不包含尾部  。s.substring(0,s.length());
}
public static void sop(Object obj){
System.out.println(obj);
}
}


5、比较和去除空格

(1)、将字符串转成大写或者小写

[1]、String toUpperCase();

[2]、String toLowerCase();

(2)、将字符串两端的多个空格去除

String trim();

(3)、对两个字符串进行自然顺序的比较

int compareTo(String);

如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。返回 他们 ascle 码值相减的结果

(4)、示例:

public class Demo{
public static void main(String[] args){
method_7();
}
public static void method_split(){
String s = "zhangsan,lisi,wangwu";
String[] arr = s.split(",");
for(int i=0;i<arr.length;i++){
sop(arr[i]);
}
}
public static void method_sub(){
String s = "abcdef";
sop(s.substring(2));    //cdef
sop(s.substring(2,4));    //cd  包含头,不包含尾部
}
public static void method_7(){
String s = "         Hello Java       ";
sop(s.toLowerCase());
sop(s.toUpperCase());
sop(s.trim());
String s1 = "acc";
String s2 = "aaa";
sop(s1.compareTo(s2));//2
sop(s2.compareTo(s1));//-2
}
public static void sop(Object obj){
System.out.println(obj);
}
}


二、StringBuffer

Stringbuffer:

Stringbuffer是字符串缓冲区,是一个容器

长度可变化

可以操作多个数据类型

最终会通过toString方法变成字符串

StringBuffer可以对字符串内容进行增删

StringBuffer常用方法:

1、存储

StringBuffer append():将指定数据作为参数添加到已有数据结尾处

StringBuffer insert(index,数据):可以将数据插入到指定位置上去

2、删除

StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end

StringBuffer deleteCharAt(index):删除指定位置的字符

sb.delete(0,sb.length()); 清空缓冲区,删除全部

sb.delete(2,3); 删除一个字符,应该用 sb.deleteCharAt(2);

3、获取

char charAt(int index)

int indexOf(String str)

int lastIndexOf(String str)

int length()

String substring(int start,int end) 注意,返回的是string,不是StringBuffer

4、修改

StringBuffer replace(start,end,string);

StringBuffer reverse()

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

5、示例:

public class Demo{
public static void main(String[] args){
method_getChars();
}
public static void method_getChars(){
StringBuffer sb = new StringBuffer("abcdef");
char[] chs = new char[4];
sb.getChars(1,4,chs,1);
for(int x=0;x<chs.length;x++){
sop("chs["+x+"]="+chs[x]+";");
}
}
public static void method_update(){
StringBuffer sb = new StringBuffer("abcde");
sb.replace(1,4,"java");
sop(sb.toString());
}
public static void method_del(){
StringBuffer sb = new StringBuffer("abcde");
sb.delete(0,sb.length());
//sb.delete(1,3);//删掉 bc,2两个,因为不包含尾
sop(sb.toString());
}
public static void method_add(){
StringBuffer sb = new StringBuffer();
sb.append("abc").append(true).append(34);//方法调用链
sb.insert(1,"qq");
sop(sb.toString());
}
public static void sop(Object obj){
System.out.println(obj);
}
}


三、StringBuilder

StringBuilder

1、JDK 1.5 之后,出现了StringBuilder

2、一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

(1)、StringBuffer 是线程同步 多线程也可以,自身有判断锁,但是效率低

(2)、StringBuilder 是线程不同步 不是多线程的,不用判断锁,所以单线程都用这个

3、升级三个因素

(1)、提高效率

(2)、简化书写

(3)、提高安全性

4、StringBuilder >与 StringBuffe的区别

(1) 、在执行速度方面的比较:StringBuilder > StringBuffer

(2) 、StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。

(3)、 StringBuilder:线程非安全的;StringBuffer:线程安全
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: