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)
浙公网安备 33010602011771号