09字符串操作

https://course.tianmaying.com/java-basic+data-types#7 基础知识


 

空字符串

1 String str1;
2 String str2 = "";
3 String str3 = new String();
  • str1的值为null,表示没有指向任何字符串对象
  • str2已经指向了一个字符串对象,这个对象的字符序列内容为空
  • str3是显式地调用构造函数创建字符串对象,该对象的字符序列内容为空,与第二行代码是基本一样的。

 

String和format方法

String有一个format方法,类似于C语言中printf()风格的格式化输出,这使得我们对输出格式的控制更加容易。

比如有三个变量:

String name = "David";
int age = 18;
String hobby = "篮球";

 

如果希望打印出这样一句话:

我的名字是David,我今年18岁,我的爱好是篮球

一种写法是:

String description = "我的名字是" + name;
description += ",我今年" + age + "岁";
description += ",我的爱好是" + "篮球";
System.out.println(description);

 

这样写不但比较麻烦,而且字符串的拼接效率也是非常低的,使用format方法可以这样写:

String formatString = "我的名字是%s,我今年%d岁,我的爱好是%s";
String output = String.format(formatString, name, age, hobby);
System.out.println(output);

 

你也可以直接使用System.out.format函数,参数签名和意义是完全一样的,所不同的是这个函数直接将格式化的字符串输出:

String formatString = "我的名字是%s,我今年%d岁,我的爱好是%s";
System.out.format(formatString, name, age, hobby);

 

其中的%s%d表示将会用字符串和整数的值来替代它们。其实都用%s也可以。

以下为常见的格式化字符

字符用以格式化的数据类型
d 整数型(10进制 )
c Unicode字符
b Boolean值
s String
f 浮点数(10进制)
e 浮点数(科学计数)
x 整数(16进制)

 


 String的常用方法

String的比较

equals()==的区别

如果两个字符串变量指向的字符序列内容完全一样,equals()返回true;如果两个字符串变量指向同一个对象,==返回true(如果是对象类型的话,==表示比较对象的地址是否相等

1 String str1 = new String("abc");
2 String str2 = new String("abc");
3 
4 System.out.println(str1 == str2);//false
5 System.out.println(str1.equals(str2));//true

 

以上代码,第一个输出为false,第二个输出为true

boolean equals(Object anObject) 判断内容是否相同
int compareTo(String anotherString) 比较两个字符串的字典顺序

String类下compareTo()方法
比较两个字符串,依次对比两个字符串中字符的ASC码,两个字符的ASC码相等则继续比较下两个字符直至比较出不同的两个字符跳出方法.方法返回值类型为整型.
例如
String a = "2345";
String b = "2322";

 a在b后
则a.compareTo(b)返回正数 2 a在b后
b.compareTo(a)返回负数 -2   返回的值是第一个不同的值的ASC差的值
如果两个字符串相等,则返回值为0

 

String的查找

方法功能
char charAt(int index) 返回指定索引index位置上的字符,索引范围从0开始
int indexOf(String str) 从字符串开始检索str,并返回第一次出现的位置,未出现返回-1
int indexOf(String str,int fromIndex) 从字符串的第fromIndex个字符开始检索str
int lastIndexOf(String str) 查找最后一次出现的位置
int lastIndexOf(String str,int fromIndex) 从字符串的第fromIndex个字符查找最后一次出现的位置
boolean startsWith(String prefix,int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束
boolean contains(String str) 测试此字符串是否包含指定的字符串

String的替换

String的替换涉及到String对象的修改。注意每一个修改String对象的操作,都会创建一个新的String对象,这个对象包含了修改后的字符串内容。最初的String对象则未发生任何变化

方法功能
String replace(char oldChar,char newChar) 把原来的oldChar字符替换为newChar字符,返回新串
String replace(CharSequence target,CharSequence replacement) 把原来的target子序列替换为replacement序列,返回新串
String a = "234676";
System.out.println(a.replace("34","233424"));//2233424676

注意这里的CharSequence类是String类的父类,我们可以传入String类型的参数:

String str1 = "abcabcabcxyz";
String str2 = str1.replace("abc", "x");

执行后,str2中的字符串内容为"xxxxyz"

String的截取

方法功能
String substring(int beginIndex)//从第beginIndex开始 返回一个新的字符串,它是此字符串的一个子字符串
String substring(int beginIndex,int endIndex) 返回一个新的字符串,它从下标beginIndex开始到endIndex-1的子串
String trim() 把字符串前后的空格都删除,返回新串

trim()方法对于清除额外的空字符非常有用:

String str1 = "   abc      ";
String str2 = str1.trim();

执行后,str2中的字符串内容为"abc"


StringBuffer

StringBuffer表示表示可变长的和可修改的字符序列。我们可以StringBuffer进行插入或者追加字符序列、翻转字符序列等操作。

StringBuffer必须通过构造函数进行初始化,它有三个构造方法:

  • StringBuffer():默认的构造方法预留16个字符的空间
  • StringBuffer(int size):第二种形式接收一个整数参数,显示的设置缓冲区的大小
  • StringBuffer(String str):第三种形式接收一个String参数,设置StringBuffer对象的初始内容,同时多预留16个字符的空间

StringBuffer的常用操作如下:

方法功能
int length() 得到当前StringBuffer的长度
int capacity() 得到总的分配容量
void ensureCapacity(int capacity) 为构造好的StringBuffer预分配空间,设置缓冲区的大小,在已知需要追加大量的字符的情况下很有用
void setLength(int len) StringBuffer对象内设置缓冲区的大小
char charAt(int index) StringBuffer对象中得到单个字符
void setCharAt(int index, char ch) StringBuffer的index位的字符置为ch
void getChars(int sourceStart, int sourceEnd, char target[], int targetStart) StringBuffer的子字符串复制给数组
StringBuffer append(Object obj) 将其他类型数据的字符串形式拼接到StringBuffer对象后面
StringBuffer append(String str) String类型的字符串拼接到StringBuffer对象后面
StringBuffer append(StringBuffer sb) StringBuffer类型的字符串拼接到StringBuffer对象后面
StringBuffer append(char[] str) 将字符数组类型的字符串拼接到StringBuffer对象后面
reverse() StringBuffer对象中的字符串反转

比如如下代码:

1 StringBuffer sb = new StringBuffer();
2 sb.append("abc");
3 sb.append("123");
4 sb.append("xyz");
5 sb.reverse();
6 System.out.println(sb.toString());

 

打印出来的字符串为:"zyx321cba"

StringBuffer还可以将某个字符串插入到特定位置(insert()系列方法),以及删除特定位置的字符串(delete()方法),参考文档。


 

String和StringBuffer的比较

String类型和StringBuffer类型的主要区别其实在于String是不可变的对象, 因此在每次对String对象进行改变的时候其实都会生成一个新的String对象。

使用StringBuffer类则会对StringBuffer对象本身进行操作,而不是生成新的对象。

我们也应该比较明确两者的使用场景了。

  • 使用String的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明少量的变量运算
  • 使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。(一般情况下我们推荐使用StringBuffer

 

 

posted on 2018-01-30 11:38  婴儿学步  阅读(172)  评论(0)    收藏  举报