一、String
- Java 程序中的所有字符串字面值(如
"abc"
)都作为此类的实例实现,也就是说程序出现的字符串"abc"都是String类的对象;- 字符串是常量,它们的值在创建之后不能更改。
- String 类包括的方法可用于检查序列的
单个字符
、比较
字符串、搜索
字符串、提取
子字符串、创建字符串副本
并将所有字符全部转换
为大写或小写。
private static void show1() {
String name = "张三";// name就是String类的对象
// name所代表的"张三"在内存是常量
name.toString();// 对象可以调用方法
name = "李四";// 这样,只是name这个变量不再引用"张三",而是引用"李四"
}
1.1 构造方法
提供了很多种构造方法,以供使用各种方式创建字符对象.
- String() // 创建一个空字符,是"",不是null
- String(byte[] bytes)
- String(char[] chars)
- String(String original)
private static void show2() {
// 无参构造
String s = new String( );
// String s2 = ""; // 于上方等价
System.out.println(s );
// 将字节数组,转为字符串
byte[] bytes = {65,66,67};
String s3 = new String(bytes);
System.out.println(s3 );
// 一般会用在数据传输(IO) 网络通信
// 将字符数组转字符串
char[] chars = {'a','b','c'};
String s4 = new String(chars);
System.out.println(s4 );
// 创建一个字符串副本
// String s5 = new String("java");
// 总结: 最常见的创建字符串的方式
String s6 = "java";
}
1.2 方法[重点]
查找类的方法
- char charAt(int index) 返回指定索引处的 char 值。
- int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。其实有很多重载的方法,可以传字符串
- int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。
private static void show3() {
// - char charAt(int index) 返回指定索引处的 char 值。
// 根据下标找字符
char c = "java".charAt(0);
System.out.println(c );
// - int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。
// 其实有很多重载的方法,可以传字符串
// 找不到返回-1
// 根据字符找下标
// 场景: 可以用来判断是否包含
int a = "java".indexOf('a');
int a2 = "java".indexOf("cv");
System.out.println(a2 );
// - int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。
System.out.println("java".lastIndexOf("a") );
// 思考题: 找javaava中,第2个a,利用indexOf(String s,int fromIndex)方法
}
判断类的方法
- boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true
- boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。
- boolean startsWith(String prefix) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
- boolean equals(Object anObject) 将此字符串与指定的对象比较。
- boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。
- boolean isEmpty() 当且仅当 length() 为 0 时返回 true。
private static void show4() {
// - boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true
System.out.println("java".contains("cv") );
// - boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。
System.out.println("java".endsWith("a"));
// 场景: 用来判断文件格式
System.out.println("a.txt".endsWith("txt"));
// - boolean startsWith(String prefix) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
System.out.println("a.txt".startsWith("a") );
// - boolean equals(Object anObject) 将此字符串与指定的对象比较。
String a = "a";
String a2 = "a";
System.out.println(a.equals(a2) );
// - boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。
System.out.println("JAVA".equals("java") );
System.out.println("JAVA".equalsIgnoreCase("java") );
// - boolean isEmpty() 当且仅当 length() 为 0 时返回 true。
System.out.println("".isEmpty( ));
System.out.println("java".isEmpty( ));
}
转换类
- byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
- char[] toCharArray() 将此字符串转换为一个新的字符数组。
- String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写
- String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
static
String valueOf(boolean b) 返回 boolean 参数的字符串表示形式。
private static void show6() {
// - byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
byte[] bytes = "java".getBytes( );
// - char[] toCharArray() 将此字符串转换为一个新的字符数组。
char[] chars = "java".toCharArray( );
// - String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写
System.out.println("JAVA".toLowerCase() );
// - String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
System.out.println("java".toUpperCase() );
// - static String valueOf(boolean b)
// 返回 boolean 参数的字符串表示形式。
// 提供了多个重载方法,可以将大部分类型都转换成String
// 注意,该方法是静态的
String.valueOf(new Object());
}
字符截取
- String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
- String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。
字符替换
- String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
- String replaceAll(String regex, String replacement)
private static void show7() {
// String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
String s = "java".substring(1);
System.out.println(s );
// String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。
// endIndex 后面的下标不包含
String s2 = "java".substring(1,3);
// String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
System.out.println("jav,av,av,a".replace("av","AV") );
// String replaceAll(String regex, String replacement)
}
其他方法
- String concat(String str) 将指定字符串连接到此字符串的结尾。
- int length() 返回此字符串的长度。
- String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
- String trim() 返回字符串的副本,忽略前导空白和尾部空白。
public static void main(String[] args) {
// - String concat(String str) 将指定字符串连接到此字符串的结尾。
System.out.println("java".concat("bigdata") );
// - int length() 返回此字符串的长度。
System.out.println("java".length() );
// - String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
String[] split = "java".split("");
System.out.println(Arrays.toString(split));
String[] split1 = "j-a-v-a".split("-");
System.out.println(Arrays.toString(split1));
// .是正则表达式的运算符,需要转义成字符.
String[] split2 = "java从入门到精通.doc".split("\\.");
System.out.println(Arrays.toString(split2));
// 题目: 获得文件的后缀
// - String trim() 返回字符串的副本,忽略前导空白和尾部空白。
System.out.println(" java ".trim( ));
}
常用的
char charAt(int index)
int indexOf(int ch)
boolean equals(Object anObject)
String substring(int beginIndex)
int length()
String[] split(String regex)
二、StringBuffer&StringBuilder
2.1 StringBuffer
StringBuffer是字符串缓冲区,一个
线程安全
的,字符的可变序列
该类提供了一些方法可以改变字符串的长度和内容.
构造方法
- StringBuffer() 构造一个没有字符的字符串缓冲区,并构造了16个字符的初始容量。
- StringBuffer(CharSequence seq) 构建一个包含指定的 CharSequence相同字符的字符串缓冲区。
- StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区,并构造指定的初始容量。
- StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
ps: 场景将来通过构造方法用于和String之间来回转换
// 以指定字符串创建StringBuffer
StringBuffer sb = new StringBuffer("java");
System.out.println(sb );
方法
StringBuffer append(boolean b) 追加的 boolean参数序列的字符串表示形式
ps: 有很多append的重载方法,用于追加大多数类型StringBuffer delete(int start, int end) 删除的字符在字符串序列分析。
StringBuffer deleteCharAt(int index) 删除 char在指定的位置在这个序列。
StringBuffer insert(int offset, boolean b) 插入的 boolean参数的字符串表示形式进入这个序列。 ps: 参数2支持大部分类型
StringBuffer replace(int start, int end, String str) 在一个字符串中替换指定的 String字符这个序列的特征。
StringBuffer reverse() 使这个字符序列被序列的反转所取代。
void setCharAt(int index, char ch) 指定索引处的字符设置为 ch。
总结: 其实以上方法就是对字符串的CRUD…
public static void main(String[] args) {
// 以指定字符串创建StringBuffer
StringBuffer sb = new StringBuffer("java");
System.out.println(sb );
// - StringBuffer append(boolean b) 追加的 boolean参数序列的字符串表示形式
// ps: 有很多append的重载方法,用于追加大多数类型
StringBuffer sb2 = sb.append("bigdata");
System.out.println(sb );
System.out.println(sb2 );
// javabigdata
// - StringBuffer delete(int start, int end) 删除的字符在字符串序列分析。
sb.delete(4,7);
System.out.println(sb );
// javadata
// - StringBuffer deleteCharAt(int index) 删除 char在指定的位置在这个序列。
sb.deleteCharAt(4);
System.out.println(sb );
// javaata
// - StringBuffer insert(int offset, boolean b) 插入的 boolean参数的字符串表示形式进入这个序列。 ps: 参数2支持大部分类型
// ps: insert方法有10+多个重载的方法,可以插入大部分数据类型的数据
// offset 偏移量
sb.insert(4,"d");
System.out.println(sb );
// javadata
// - StringBuffer replace(int start, int end, String str) 在一个字符串中替换指定的 String字符这个序列的特征。
sb.replace(1,4,"AVA");
System.out.println(sb );
// jAVAdata
// - void setCharAt(int index, char ch) 指定索引处的字符设置为 ch。
sb.setCharAt(4,'D');
System.out.println(sb );
// StringBuffer reverse() 使这个字符序列被序列的反转所取代。
StringBuffer buffer = new StringBuffer("java");
buffer.reverse();
System.out.println(buffer );
// 练习
int num = 12345;
String s = String.valueOf(num);
StringBuffer sb3 = new StringBuffer(s);
sb3.reverse();
String s1 = String.valueOf(sb3);
int i = Integer.parseInt(s1);
System.out.println(i );
}
2.2 StringBuilder
StringBuilder 是
可变
字符序列,但是不保证线程安全
.建议在单线程情况下使用,如果没有线程安全的要求,建议优先使用StringBuilder,因为操作字符串更快!!常用的方法与StringBuffer中的效果完全一致,所以…
方法自行演示…
String | StringBuffer | StringBuilder | |
---|---|---|---|
字符串是否可变 | 不可以 | 可以 | 可以 |
线程安全 | 安全 | 安全 | 不保证安全 |
字符串拼接效率 | 最慢 | 慢 | 快 |
版本 | 1.0 | 1.0 | 1.5 |
public static void main(String[] args) {
long begin = System.currentTimeMillis( );// 可以当前系统毫秒值
// StringBuilder sb = new StringBuilder("");
// StringBuffer sb = new StringBuffer("");
String sb = "";
for (int i = 0; i < 100000; i++) {
//sb.append("1");
sb += "1";
}
long end = System.currentTimeMillis( );// 可以当前系统毫秒值
System.out.println(end - begin );
}