1 String
1.1 String对象介绍
- String类: 代表字符串。Java程序中的所有字符串字面值(如:“abc”)都作为此类的实例实现。
- String是一个final类,代表不可变的字符序列。
- 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
- String对象的字符内容是存储在一个字符数组value[]中的。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
产生字符串
String str = "hello";
//本质上this.value = new char[0];
String s1 = new String();
//this.value = original.value;
String s2 = new String(String original);
//this.value = Arrays.copyOf(value, value.length);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count);
1.2 String的内存结构
情况1:
情况2:
情况3:
情况4:
1.3 字符串的拼接
案例一:
@Test
public void test2() {
String s1 = "hello";
String s2 = "world";
String s3 = "hello" + "world";
String s4 = s1 + "world";
String s5 = s1 + s2;
String s6 = (s1 + s2).intern();
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s4 == s5);
System.out.println(s3 == s6);
}
案例二:
@Test
public void test3(){
String s = "0";
for(int i = 1; i <= 5;i++){
s += i;
}
System.out.println(s);
}
1.4 常用方法
- int length(): 返回字符串的长度: return value.length
- char charAt(int index): 返回某索引处的字符return value[index]
- boolean isEmpty(): 判断是否是空字符串: return value.length == 0
- String toLowerCase(): 使用默认语言环境, 将 String 中的所有字符转换为小写
- String toUpperCase(): 使用默认语言环境, 将 String 中的所有字符转换为大写
- String trim(): 返回字符串的副本, 忽略前导空白和尾部空白
- boolean equals(Object obj): 比较字符串的内容是否相同
- boolean equalsIgnoreCase(String anotherString): 与equals方法类似, 忽略大小写
- String concat(String str): 将指定字符串连接到此字符串的结尾。 等价于用“+”
- int compareTo(String anotherString): 比较两个字符串的大小
- String substring(int beginIndex): 返回一个新的字符串, 它是此字符串的从beginIndex开始截取到最后的一个子字符串。
- String substring(int beginIndex, int endIndex) : 返回一个新字符串, 它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
- boolean contains(CharSequence s): 当且仅当此字符串包含指定的 char 值序列时,返回 true
- int indexOf(String str): 返回指定子字符串在此字符串中第一次出现处的索引
- int indexOf(String str, int fromIndex): 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
- int lastIndexOf(String str): 返回指定子字符串在此字符串中最右边出现处的索引
- int lastIndexOf(String str, int fromIndex): 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索注: indexOf和lastIndexOf方法如果未找到都是返回-1
- boolean endsWith(String suffix): 测试此字符串是否以指定的后缀结束
- boolean startsWith(String prefix): 测试此字符串是否以指定的前缀开始
- boolean startsWith(String prefix, int toffset): 测试此字符串从指定索引开始的子字符串是否以指定前缀开始
- String replace(char oldChar, char newChar): 返回一个新的字符串, 它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
- String replace(CharSequence target, CharSequence replacement): 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
- String replaceAll(String regex, String replacement) : 使 用 给 定 的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
- String replaceFirst(String regex, String replacement) : 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
- boolean matches(String regex): 告知此字符串是否匹配给定的正则表达式。
- String[] split(String regex): 根据给定正则表达式的匹配拆分此字符串。
- String[] split(String regex, int limit): 根据匹配给定的正则表达式来拆分此字符串, 最多不超过limit个, 如果超过了, 剩下的全部都放到最后一个元素中。
@Test
public void test4() {
// 定义一个字符串对象
String s = "helloworld";
// int length():获取字符串的长度。
System.out.println("s.length:" + s.length());
System.out.println("----------------------");
// char charAt(int index):获取指定索引位置的字符
System.out.println("charAt:" + s.charAt(0));
System.out.println("----------------------");
// int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
System.out.println("indexOf:" + s.indexOf('l'));
System.out.println("----------------------");
// int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
System.out.println("indexOf:" + s.indexOf("owo"));
System.out.println("----------------------");
// int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
System.out.println("indexOf:" + s.indexOf('l', 4));
System.out.println("indexOf:" + s.indexOf('k', 4)); // -1
System.out.println("indexOf:" + s.indexOf('l', 40)); // -1
System.out.println("----------------------");
// 自己练习:int indexOf(String str,int
// fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
// String substring(int start):从指定位置开始截取字符串,默认到末尾。包含start这个索引
System.out.println("substring:" + s.substring(5));
System.out.println("substring:" + s.substring(5,7)); //开始时5,结束是7,不包括7
System.out.println("substring:" + s.substring(0));
System.out.println("----------------------");
// String substring(int start,int
// end):从指定位置开始到指定位置结束截取字符串。包括start索引但是不包end索引
System.out.println("substring:" + s.substring(3, 8));
System.out.println("substring:" + s.substring(0, s.length()));
String s3 = " abc 123 ";
System.out.println(s3.trim().length()); //去掉前后两端的空格
String s4 = "a,b,c,d,e,123";
String[] s5 = s4.split(",");
for (int i = 0; i < s5.length; i++) {
System.out.println(s5[i]);
}
}
2 StringBuffer和StringBuilder
-
当append和insert时,如果原来value数组长度不够,可扩容。
-
如上这些方法支持方法链操作。
-
解决了string拼接的性能问题。
2.1 常用方法
- StringBuffer append(xxx): 提供了很多的append()方法, 用于进行字符串拼接
- StringBuffer delete(int start,int end): 删除指定位置的内容
- StringBuffer replace(int start, int end, String str): 把[start,end)位置替换为str
- StringBuffer insert(int offset, xxx): 在指定位置插入xxx
- StringBuffer reverse() : 把当前字符序列逆转
- public int indexOf(String str): 查找指定子字符串的索引位置,返回第一次出现该子字符串的索引值
- public String substring(int start,int end): 从字符串中提取子字符串,返回从 start 索引位置开始(包含 start)到 end 索引位置结束(不包含 end)的子字符串
- public int length(): 获取字符串长度
- public char charAt(int n ): 获取指定位置字符
- public void setCharAt(int n ,char ch): 修改指定位置字符
2.3 StringBuffer和StringBuilder类
- StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列, 而且提供相关功能的方法也一样
- 对比String、 StringBuffer、 StringBuilder
- String(JDK1.0): 不可变字符序列 final value[]
- StringBuffer(JDK1.0): 可变字符序列、效率低、线程安全(synchronized内置锁)
- StringBuilder(JDK 5.0):可变字符序列、效率高、 线程不安全
案例实现:
@Test
public void test1() {
//hello + world + java + python
StringBuffer sb = new StringBuffer();
sb.append("hello ").append("world ").append("java ").append("python ");
System.out.println(sb.toString());
}
/**
* 1697
*/
@Test
public void test2() {
String text = "";
long t1 = System.currentTimeMillis(); //时间戳:1970.1.1.0.0.0.0到现在的毫秒数
for (int i = 0; i < 20000; i++) {
text = text + i;
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}
@Test
public void test3() {
StringBuffer sb = new StringBuffer();
long t1 = System.currentTimeMillis(); //时间戳:1970.1.1.0.0.0.0到现在的毫秒数
for (int i = 0; i < 20000; i++) {
sb.append(i);
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}
@Test
public void test4() {
StringBuilder sb = new StringBuilder();
long t1 = System.currentTimeMillis(); //时间戳:1970.1.1.0.0.0.0到现在的毫秒数
for (int i = 0; i < 20000; i++) {
sb.append(i);
}
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}