Java String - zhongjiajie/zhongjiajie.github.com GitHub Wiki
一个字符串就是一个字符序列,字符串被广泛应用于 Java 编程.Java语言将字符串作为String类型的对象进行处理.
// str1的值为null,表示没有指向任何字符串对象
String str1;
// str2已经指向了一个字符串对象,这个对象的字符序列内容为空
String str2 = "";
// str3是显式地调用构造函数创建字符串对象,该对象的字符序列内容为空,与第二行代码是基本一样的
String str3 = new String();
String str1 = "abc";
String str2 = str1 + "def";
str1 += "def";
// shustr
String str = "123456";
str.substring(3); // 从下标3(注意下标从0开始)开始截取一个子字符串
System.out.println(str); // str本身不可变,所以打印出来依然是123456
String str2 = str.substring(3); // 将产生的新对象赋值给一个新的引用变量
System.out.println(str2); // str2的内容为456
String name = "David";
int age = 18;
String hobby = "篮球";
String formatString = "我的名字是%s,我今年%d岁,我的爱好是%s";
String output = String.format(formatString, name, age, hobby);
// 方法一
System.out.println(output);
// 方法二
System.out.format(formatString, name, age, hobby);
如果String.format
中有%
不想呀格式化,应该使用%%
,这里
-
boolean equals(Object anObject)
: 判断内容是否相同 -
boolean equalsIgnoreCase()
: 判断内容是否相同,在比较时忽略字母大小写 -
int compareTo(String anotherString)
: 比较两个字符串的字典顺序 -
int compareToIgnoreCase(String anotherString)
: 比较两个字符串的字典顺序,在比较时忽略字母大小写 -
==
: 比较两个引用,是否指向同一个String对象 -
charAt(int index)
: 查看字符串中index值指定的char
-
indexOf(int ch)
: 返回字符串中第一个出现char字符的index
字符 | 用以格式化的数据类型 |
---|---|
d | 整数型(10进制 ) |
c | Unicode字符 |
b | Boolean值 |
s | String |
f | 浮点数(10进制) |
e | 浮点数(科学计数) |
x | 整数(16进制) |
方法 | 功能 |
---|---|
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 replace(char oldChar,char newChar) | 把原来的oldChar字符替换为newChar字符,返回新串 |
String replace(CharSequence target,CharSequence replacement) | 把原来的target子序列替换为replacement序列,返回新串 |
String str1 = "abcabcabcxyz";
String str2 = str1.replace("abc", "x");
// xxxxyz
方法 | 功能 |
---|---|
String substring(int beginIndex) |
返回一个新的字符串,它是此字符串的一个子字符串 |
String substring(int beginIndex,int endIndex) |
返回一个新的字符串,它从下标beginIndex开始到endIndex-1的子串 |
String trim() |
把字符串前后的空格都删除,返回新串 |
StringBuffer
表示可变长的和可修改的字符序列.我们可以StringBuffer进行插入或者追加字符序列、翻转字符序列等操作
StringBuffer必须通过构造函数进行初始化,它有三个构造方法
-
StringBuffer()
: 默认的构造方法预留16个字符的空间 -
StringBuffer(int size)
: 第二种形式接收一个整数参数,显示的设置缓冲区的大小 -
StringBuffer(String str)
: 第三种形式接收一个String参数,设置StringBuffer对象的初始内容,同时多预留16个字符的空间
方法 | 功能 |
---|---|
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对象中的字符串反转 |
StringBuffer sb = new StringBuffer();
sb.append("abc");
sb.append("123");
sb.append("xyz");
sb.reverse();
System.out.println(sb.toString());
sb.setCharAt(2, 'X'); // setCharAt 要用单引号,不能用双引号
-
String、StringBuilder、StringBuffer 用法比较
- String、StringBuilder、StringBuffer都在 java/lang/ 目录下
- String: 字符串常量
- StringBuffer: 字符串变量(线程安全)
- StringBuilder: 字符串变量(非线程安全,JDK 5.0(1.5.0) 后支持)
- String、StringBuilder、StringBuffer都在 java/lang/ 目录下
-
String
: 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的. -
StringBuffer
: StringBuffer 每次对对象本身进行操作,而不是生成新的对象,再改变对象引用.所以在一般情况下我们推荐使用 StringBuffer,特别是字符串对象经常改变的情况下.主要操作是 append 和 insert 方法.常用的方法有append appendFormat insert remove replace
-
StringBuilder
: java.lang.StringBuilder一个可变的字符序列是5.0新增的.此类提供一个与 StringBuffer 兼容的 API,但不同步.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍).如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快.两者的方法基本相同. - StringBuffer 和 StringBuilder 都继承于 AbstractStringBuilder 父类,实现了java.io.Serializable, CharSequence.在大部分情况下,三者的效率如下:
StringBuilde > StringBuffer > String
// StringBuffer 比 String 快,应该是第一句比第二句慢,事实上却是第一句快
String S1 = "This is only a” + " simple" + " test”; // 这个在JVM来说等同于 String S1 = "This is only a simple test";
StringBuffer Sb = new StringBuilder("This is only a").append(" simple”).append(" test");
int secondIndex = a.indexOf('{', a.indexOf('{')+1);
两个字符串变量指向的字符序列内容完全一样,equals()返回true;如果两个字符串变量指向同一个对象,==返回true
// 原始的方法
null == s || "".equals(s)
// 直接调用的方法
import org.apache.commons.lang.StringUtils;
StringUtils.isEmpty(pkId)
[org.apache.commons.lang.StringUtils.leftPad][16]
//String.format方法
// 如果替换前的是字符串类型
String.format("%10s", "foo").replace(' ', '*'); // *******foo
String.format("%-10s", "bar").replace(' ', '*'); // bar*******
// 如果替换前的是数字类型
int i = 10
String.format("%010d", i);
// 最通用的方式 StringUtils.leftPad StringUtils.rightPad
import org.apache.commons.lang.StringUtils;
StringUtils.leftPad(String str, int size);
// StringUtils.leftPad("bat", 5) = " bat"
// StringUtils.leftPad("bat", 1) = "bat"
StringUtils.leftPad(String str, int size, char padChar)
// StringUtils.leftPad("bat", 5, 'z') = "zzbat"
// StringUtils.leftPad("bat", 1, 'z') = "bat"
隐藏敏感信息如密码等
// 与 字符串实现sql的pad功能 的实现方式类似
String password = "secret123";
String padded = String.format("%" + password.length() + "s", "").replace(' ', '*');