----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
字符串
对于字符串,我们只要掌握常见的操作方法即可。
(一) String类的特点:
(1)字符串对象一旦被初始化就不会被改变。
String str="abc";
str="nba";
System.out.println("str="+str);
此时,打印出来的结果是:str=nba,貌似是字符串的结果被改变,但是,真的是这样
其实,在这段代码中,有两个对象,之所以结果会发生改变,是因为str改变了指向引用,此时,"abc"这个字符串并没有发生改变。
(2)比较:Stringstr="abc"与String str1="abc"
在字符串建立时,在内存中有一个叫字符串缓冲区(也可理解为:字符串常量池)。
String str="abc";创建一个字符串对象str,str先到字符串常量池中寻找,发现没有
对象,于是,自己就创建一个对象"abc"。
String str1="abc";str1也先到常量池中寻找,发现已经存在,就把已有的对象地址
赋给str1。这就意味着str与str1指向同一个字符串"abc"(该对象存储在字符串常量池中)。
(3)比较:String str="abc"与String str1=newString("abc");的区别:
String str="abc";这句话就是在字符串常量池中创建了一个字符串"abc",并把地址赋给了str引用型变量。
String str1=new String("abc");表示的是:是在堆内存当中,用new的方式创建了一个String对象,这个对象接受了一个字符串"abc"这个对象,这样的话,这条语句就创建了两个对象(一个是new,另一个是"abc")。
(4)注意事项:
String s=new String();和Stringstr="";的内容是相等的,但是,不等于String str1=null;
(二)字符串常见功能(按照面向对象的思想对字符串进行功能分类):
1.获取
1.1获取字符串中字符的个数(长度)
int length();
注意:数组中的length是属性,字符串中的length是方法
1.2根据位置获取字符
char charAt(int index);
1.3根据字符获取在字符串中第一次出现的位置(防止有相同的字母)。
int indexOf(int ch);97也可以获取字符中的位置
int indexOf(int ch,intfromIndex);从指定位置进行ch的查找第一次出现的位置
int indexOf(String str);
int indexOf(String str,intfromIndex);根据字符串获取在字符串中第一次出现的位置
int lastIndexOf(int ch);
int lastIndexOf(int ch,intfromIndex);
int lastIndexOf(Stringstr);
int lastIndexOf(Stringstr,int fromIndex);
1.4获取字符串中一部分字符串,也叫子串。
Stringsubstring(int beginIndex);该字符串从指定的 beginIndex处开始,直到索引 endIndex - 1 处的字符。
Stringsubstring(int beginIndex,int endIndex);
2.转换
2.1将字符串编程字符串数组(字符串的切割)
String[] split(String regex);涉及到正则表达式
2.2将字符串变为字符数组
char[] toCharArray();
2.3将字符串转成字符数组
byte[] getBytes();
2.4将字符串中的字母转成大小写
String toUpperCase();大写
String toLowerCase();小写
2.5将字符串中的内容进行替换
String replace(char oldChar,char newChar);
String replace(Strings1,String s2);
2.6将字符串两端的空格去除
String trim();
2.7将字符串进行连接
Stringconcat(string);
3.判断
3.1连个字符串内容是否相同
boolean equals(Object obj);
备注:String类覆写了Object类中的equals方法,建立了String类自己的判断字符串对象是否相同的依据,其实就是比较字符串的内容。
booleanequalsIgnoreCase(String anotherString);忽略大小写,比较字符串的内容
3.2字符串中是否包含指定字符串?
boolean contains(stringstr);
3.3字符串是否以指定字符串开头或者以指定字符串结尾
boolean startsWith(string);
boolean endsWith(string);
4.两个字符串之间进行比较:
int compareTo(StringanotherString)按字典顺序比较两个字符串
5对字符串池进行操作:intern()方法
String str1=new String("abc");
String str2=str1.intern();
System.out.println(str2==str1);//false
创建好s1这个字符串对象,利用s1调用字符串池中的方法,发现字符串池中没有,此时,它就在字符串池中创建s1的对象,然后返回给s2(s2是池中的对象)
(三)StringBuffer(字符串缓冲区)
(1)StringBuffer就是字符串缓冲区,它是用于存储数据的容器(容器对象)。
(2)特点:
1,长度是可变的
2,可以存储不同类型的数据
3,最终要转换成字符串进行使用
4,可以对字符串进行修改
(3)常用的功能:
1,添加:
StringBuffer append(data);
StringBuffer insert(index,data);
2,删除:
StringBuffer delete(start,end):包含头,不包含尾
StringBuffer deleteCharAt(index):删除指定位置的元素
3,查找:
char charAt(index);
int indexOf(string);
int lastIndexOf(string);
4,修改:
StringBuffer replace(start,end,string);
void setCharAt(index,char);
5,可变容器长度数组:
StringBuffer(int capacity)
(4)问题:字符串缓冲区的初始容器为16个字符,为什么还要手动指定一个容器的长度?
其实这两个用哪个都行,区别在于效率上,如果你能确定数据量在多少范围之内,那么你可以直接产生一个长度为你需要的长度就可以了,但是如果你要用默认的数据来处理你的数据的话,一旦超过16就需要延长,延长第一个要开辟空间,第二个要进行运算。初始化刚好的,可以减少创建数组和延长的动作,从而达到提高效率的目的。
(四)StringBuilder:一个可变的字符序列
(1)jdk1.5以后,出现了功能和StringBuffer一模一样的对象就是StringBuilder。
(2)比较StringBuffer与StringBuilder
不同的是:
StringBuffer是线程同步(通常是用于多线程)。
StringBuilder是线程不同步(通常用于单线程)。
问题:StringBuffer是线程是如何进行同步的?
案例:当我们要向StringBuffer容器存储数据的时候,此时如果也在删除数据,那么就会导致线程安全隐患,所以,我们必须要保证存储数据的时候就不可进行删除数据,删除数据就不能进行存储数据,那么这就涉及到同步问题,如下面代码:
class StringBuffer{
Object lock;
public StringBuffer append(int x){
synchronized(lock){
}
}
public StringBuffer delete(int start,intend){
synchronized(lock){
}
}
}
添加与删除使用的是同一个锁,这个时候就保证了删除数据或者添加数据的安全性,当然,你也可以使用同步函数进行同步。
(3)StringBuilder不同步,因此,不需要判断锁,提高了效率,我们建议优先采用该类,因为在大多数实现中,它比StringBuffer
要快。
(4)注意:StringBuilder
的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer
。
总结:
(1)单线程使用StringBuilder
,多线程使用StringBuffer。
(2)针对于字符串的相关问题,基本都是一些常见的方法操作,比之前学的面向对象要容易的多,所以,对于字符串的要求是要将基本的常用的方法熟记于心。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------