黑马程序员-学习日记
黑马程序员_JAVA中API中对象String和StringBuffer/StringBuilder
------- android培训、java培训、期待与您交流! ----------
一:String对象:
String类的成员使用
1,构造函数。
可以通过字符串的构造函数,
将一个字节数组或者字符数组或者int型数组中的一部分变成一个字符串对象。
代码体现:
public static void consMethod()
{
String s = new String();
String s1 = "";
System.out.println(s.equals(s1));
//将字节数组的一部分变成字符串对象
byte[] arr = {98,99,100};
String s2 = new String(arr,0,arr.length);
System.out.println("s2="+s2);
//将字符数组的一部分变成字符串对象
char[] arr1 = {'q','c'};
String s3 = new String(arr1,1,1);
System.out.println("s3="+s3);
//将字节数组的一部分变成字符串对象
int[] arr2 = {65,66,67};
String s4 = new String(arr2,0,arr2.length);
System.out.println("s4="+s4);
}
2,一般函数:
二:字符串对象所具备的功能:
1,判断。
1.1 判断两个字符串内容是否相同。
boolean equals(Object):覆盖了Object类中的方法。
1.2 判断两个字符串内容是否相同,忽略大小写。
boolean equalsIgnoreCase(string)
1.3 判断一个字符串中是否包含另一个字符串。
boolean contains(string):jdk1.5出现的功能。
1.4 判断一个字符串是否以一个字符串开头。
boolean startsWith(string):
1.5 判断一个字符串是否以一个字符串结尾。
boolean endsWith(string);
1.6 判断字符串是否有具体的字符数据。或者成为判断字符串是否有内容。
boolean isEmpty():原理就是判断字符串的长度是否为0.该方法是jdk1.6版本。
public boolean isEmpty(){
return this.length()==0;
}
代码体现:
public static void method(){
//判断字符串内容是否相同,忽略大小写。
String s1 = "abc";
String s2 = "Abc";
System.out.println("s1.equals(s2):"+s1.equals(s2));
System.out.println(("s1.equalsIgnoreCase(s2):"+s1.equalsIgnoreCase(s2));
//判断字符串是否包含指定字符串
String s3 = "kkabcde";
System.out.println(("s3.contains(s1)="+s3.contains(s1));
//判断字符串是否是以指定字符串开头
System.out.println(("s3.startsWith(ab)="+s3.startsWith("kk"));
//判断字符串是否是以指定字符串结尾
String s4 ="StringDemo.java";
System.out.println("s4.endsWith(.java)="+s4.endsWith(".java"));
//判断字符串是否有内容
String s5 = "";
System.out.println("s5.isEmpty()="+s5.isEmpty());
}
2.获取
2.1 获取字符串的长度。
int length();
2.2 根据指定的位置获取该位置对应的字符。
char charAt(index);
2.3 根据字符获取该字符第一次出现的位置
int indexOf(ch);
int idnexOf(ch,fromIndex):从fromIndex位置开始获取ch第一次出现的位置。
找到了就返回第一次出现角标位,没找到,就返回-1.所以,
可以通过-1这种方式判断一个字符是否在字符串存在。
2.4 根据字符串获取该字符串第一次出现的位置
int indexOf(string);
intidnexOf(string,fromIndex):从fromIndex位置开始获取string第一次出现的位置。找到了就返回第一次出现角标位,没找到,就返回-1.所以,可以通过-1这种方式判断一个字符串是否在字符串存在。这既是contains方法原理。
2.5 同样是获取一个字符或者字符串第一次出现的位置,但是是通过反向索引完成。
功能和indexOf一致。
int lastIndexOf(ch);
intlastIdnexOf(ch,fromIndex):
int lastIndexOf(string);
intlastIdnexOf(string,fromIndex):
2.6 获取字符串中的一部分字符串。
String substring(start):从start开始到结尾。
Stringsubstring(start,end);获取到的字符串包含start位,不包含end位。
classStringMethodDemo {
public static void sop(String str){
System.out.println(str);
}
public static void main(String[] args) {
method();
}
public static void method(){
String s1 = "abcedfckk";
sop(s1);
//根据指定位置获取该位置的字符
sop("s1.charAt(2):"+s1.charAt(2));
//从第3个位置开始查找指定字符出现的位置
sop("s1.indexOf(c)="+s1.indexOf('c',3));
//从开始位置开始查找指定字符出现的位置
sop("s1.indexOf(q)="+s1.indexOf('q'));
//从开始位置开始查找指定字符串出现的位置
sop("s1.indexOf(ckq)="+s1.indexOf("ckq"));
//反向开始查找指定字符出现的位置
sop("s1.lastIndexOf(c)="+s1.lastIndexOf('c'));
//从指定位置开始获取字符串的一部分
sop("s1.substring(2):"+s1.substring(2));
//获取整串 s1.substring(0,s1.length());
sop("s1.substring(2,5):"+s1.substring(2,5));
sop("s1="+s1);// 原串没变化。
}
}
3,转换:
3.1 将字符串转成字节数组。
byte[] getBytes():编码解码时较为常用。还有在io流操作字节数据也很常用。
3.2 将字符串转成字符数组。
char[] toCharArray():
3.3 将字符数组或者数组中的一部分转成字符串。
static String copyValueOf(char[])
3.4 将字符数组或者数组中的一部分转成字符串。
static StringvalueOf(char[]):
3.5 基本数据类型变成字符串。
static String valueOf(int);
static StringvalueOf(double);
static StringvalueOf(boolean);
...
int x = 3;
String.valueOf(x);-->"3";
x+""--> "3";
3.6 将对象变成字符串 staticString valueOf(object)和object.toString():结果是一样的。
3.7 将字符串转成大写或者小写。
小写:toLowerCase():
大写:toUpperCase():
3.8 String concat(String str)
将指定字符串连接到此字符串的结尾。
public static void main(String[] args) {
//将指定字符串连接到此字符串的结尾。
System.out.println("abc".concat("kk"));
System.out.println("abc"+"kk");
}
public static void method_4(){
String s = "aBQQQc";
//将指定字符串转换成大写或者小写
System.out.println(s.toUpperCase());
System.out.println(s.toLowerCase());
System.out.println(s);
}
public static void method_3(){
String s = "abc";
//将字符串转化成字节或者字符数组
byte[] arr = s.getBytes();
for(int x=0; x<arr.length;x++){
System.out.println(arr[x]);
}
char[] arr1 = s.toCharArray();
for(int x=0; x<arr1.length;x++){
System.out.println(arr1[x]);
}
}
public static void method(){
Demo d= new Demo();
//将基本数据类型转化成字符串
String s = String.valueOf(d);
//调用的是Object父类中的方法
System.out.println(d.toString());
System.out.println(s);
}
4,替换。
4.1 替换字符。
Stringreplace(oldChar,newChar):
4.2 替换字符串
Stringreplace(string,string);
5,切割:String[] split(regex);
6,去除字符串两空格。
String trim();
classStringMethodDemo{
public static void sop(String str){
System.out.println(str);
}
public static void main(String[] args) {
method_4();
}
public static void method_4(){
//按字典顺序比较字符串
int num ="ba".compareTo("bc");
sop("num="+num);
通过对返回结果的判断,发现 除了正数,就是负数,要么就是0.
左边的对象如果大于右边的对象,返回正数,
左边小于左边,返回负数。
左边等于右边,返回0.
}
public static void method_3(){
String s = " ab c ";
sop("--"+s+"--");
//trim()去除字符串中的空格
sop("--"+s.trim()+"--");
}
public static void method_2(){
String s ="zhangsan.lisi.wangwu";
//用.进行切割
String[] arr =s.split("\\.");
s = "qqsdqqfgqqhjkqq";
//用字符串"qq"进行切割
String[]arr1 = s.split("qq");
for(int x=0; x<arr1.length;x++){
System.out.println(arr1[x]+"--");
}
}
public static void method_1(){
String s = "java";
//用指定字符替换字符串中的字符
sop("s.replace(a,k)="+s.replace('a','k'));
sop("s.replace(av,qq)="+s.replace("av","qq"));
}
}
5.字符串中的基本属性:
class StringTest {
public static void main(String[] args) {
String s1 = "java";
String s2 = "hehe";
test(s1,s2);
System.out.println(s1+"....."+s2);//字符串一旦初始化就不会被改变。
//System.out.println(s1.charAt(10));//StringIndexOutOfBoundsExceptio
//StringIndexOutOfBoundsException:只要访问到字符串中不存在的角标,就会在运行时期,发生该异常。
//System.out.println(s1.substring(2,19));
System.out.println(s1.replace('k','n'));//当要替换的字符不存在时,结果是原来的字符串。
System.out.println("-"+s1.substring(1,1)+"-");//当头尾角标相等时,结果是 "" 空字符串。
System.out.println("--"+s1.substring(4)+"--");//当开始角标等于长度时,结果是 "" 空字符串。
}
public static void test(String s1,Strings2){
s1.replace('a','k');
s1 = s2;
}
}
class StringDemo {
public static void main(String[] args) {
String s = "abc";//定义了一个字符串类型的数据; "abc" 是一个字符串对象。
//字符串一旦被初始化就不会被改变;因为字符串是一个常量。
//s = "ddd";str重新指向"ddd"这个对象。 而"abc"没有变化过。
String s1 = "abc";//s1对应的字符串已经存在于内存中,所以不会在重新开辟空间,
//所以s1和s指向的同一个对象.
System.out.println(s==s1);//true
String s2 = "abc";
String s3 = newString("abc");
//这种两种定义"abc"字符串的方式都可以。s2相对简单,一般都按照s2这样定义。
//s2和s3的其他区别:
//1,地址值一样。
//2,创建s2并初始化,内存中只有一个对象。就是字符串对象。
//创建s3并初始化,内存有两个对象,一个是new,一个是字符串。
System.out.println("s2==s3:"+(s2==s));
System.out.println(s2.equals(s3));//String类的equals方法复写Object中方法,比较是字符串的内容是否相同。
String s4 = "ab";
String s5 = "c";
String s6 = s4+s5;
String s7 ="ab"+"c";
System.out.println("s1==s6:"+(s1==s6));//false
System.out.println("s1==s7:"+(s1==s7));//true;
}
}
三:StringBuffer和StringBuilder
StringBuffer:字符串缓冲区,缓冲区用于存储数据,所以它也称之为容器。
A.缓冲区的特点:
1,可以添加基本数据和引用数据。添加数据完毕;一般都需要将其转成字符串进行使用;通过toString方法转成字符串。
2,该容器和数组不一样,数组是固定长度的,而且只能添加同一类型;而StringBuffer长度是可变的,可以添加不同类型。
类型一致的数据,可以使用数组,也可以StringBuffer。
但是数组添加元素,可以保证数据的类型不变;而StringBuffer添加完数据,全变成字符串。
3,StringBuffer可以对字符串进行修改。
其实StringBuffer之所以可以存储数据,就是因为底层封装是一个字符数组。
B.StringBuffer都具备的常见功能:
1,添加。
StringBuffer append():可以将基本数据类型数据和引用类型数据添加到缓冲区。注意:不可以直接操作short byte. 将数据添加到缓冲区的末尾,数据追加;这个方法返回来的还是原来的缓冲区对象。
2,删除。
StringBuffer delete(start,end);
StringBuffer deleteCharAt(index):
3,获取字符串的出现的位置。
int lastIndexOf(str);
int indexOf(str);
4,替换:
StringBuffer replace(start,end,string);
5,修改:
void setCharAt(index,char);
6,反转:
StringBuffer reverse();
classStringBufferDemo {
public static void main(String[] args) {
method_3();
}
public static void method_3(){
StringBuffer sb = newStringBuffer("abcde");
sb.replace(1,4,"haha");//替换
sb.setCharAt(2,'k');//修改
sb.setLength(3);//设置字符串的长度
System.out.println(sb);
}
public static void method_2(){
StringBuffer sb = newStringBuffer("abcde");
sb.insert(1,"ak");//将字符串插入到此字符序列中
sb.delete(1,3);//从指定位置删除
//清空缓冲区。
sb.delete(0,sb.length());
sb.deleteCharAt(3);//删除指定位置的元素
System.out.println(sb);
}
public static void method_1(){
StringBuffer sb = newStringBuffer();
sb.append(34).append("haha").append('k').append(true);//方法调用链
System.out.println(sb.toString());
}
}
C.JDK1.5版本出现了一个新对象StringBuilder
该对象功能和StringBuffer一致。
区别:
StringBuffer:是线程安全的。
StringBuilder:是线程不安全的。
开发时常用的是:StringBuilder.因为一般都是单线程;主线程在运行。如果真的有了多线程,那么建议使用StringBuffer.
StringBuilder的出现,是为了提高了效率。
classStringBuilderDemo {
public static void main(String[] args) {
StringBuilder s1 = newStringBuilder("java");
StringBuilder s2 = newStringBuilder("haha");
show(s1,s2);
System.out.println(s1+"....."+s2);
}
public static void show(StringBuilder s1,StringBuilder s2)
{
s1.append(s2);
s1 = s2;
}
}
classStringBuilderTest {
public static void main(String[] args) {
int[] arr = {3,1,5,6,2};
method_2(arr);
}
D.String和StringBuilder的区别?
对数据相连接变成新的字符串;StringBuilder比String效率高些。
String一旦被初始化不可以被改变;StringBuilder,可以对字符串进行修改。
在将int数组变成字符串时建议使用method_2();
因为method_1,在运行时,会在内存中产生过多的字符串对象;而在method_2中只有一个StringBuilder对象。
举例:将一个int数组变成字符串。
public static void method_1(int[] arr){
String s = "[";
for(int x=0; x<arr.length;x++){
if(x!=arr.length-1)
s+=arr[x]+",";
else
s+=arr[x]+"]";
}
System.out.println(s);
}
public static void method_2(int[] arr){
StringBuilder sb = newStringBuilder();
sb.append("[");
for(int x = 0 ; x<arr.length;x++){
if(x!=arr.length-1)
sb.append(arr[x]+"-");
else
sb.append(arr[x]+"]");
}
System.out.println(sb);
}
}
------- android培训、java培训、期待与您交流! ---------- 详细请查看:http://edu.csdn.net/heima/