Java String - zhongjiajie/zhongjiajie.github.com GitHub Wiki

Java-string

一个字符串就是一个字符序列,字符串被广泛应用于 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

format方法

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中有%不想呀格式化,应该使用%%,这里

String常用方法的比较

  • 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

format方法的formatter

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

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 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的截取

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

StringBuffer

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 用法比较
    • String、StringBuilder、StringBuffer都在 java/lang/ 目录下
      • String: 字符串常量
      • StringBuffer: 字符串变量(线程安全)
      • StringBuilder: 字符串变量(非线程安全,JDK 5.0(1.5.0) 后支持)
  • 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");

FAQ

找到字符串中第二个字符出现的位置

int secondIndex = a.indexOf('{', a.indexOf('{')+1);

equal与==的区别

两个字符串变量指向的字符序列内容完全一样,equals()返回true;如果两个字符串变量指向同一个对象,==返回true

判断字符串是否为空

// 原始的方法
null == s || "".equals(s)

// 直接调用的方法
import org.apache.commons.lang.StringUtils;
StringUtils.isEmpty(pkId)

字符串实现pad功能

[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(' ', '*');

⚠️ **GitHub.com Fallback** ⚠️