String 类的理解和创建对象
1)String 对象用于保存字符串,也就是一组字符序列
2)字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"luck"等
3)字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
4)String 类较常用构造方法(其他看手册):
- String s1 = new String(); //
- String s2 = new String(String original);
- String s3 = new String(char[] a);
- String s4 = new String(char[] a,int startIndex,int count)
java
package com.heima.Hello.String_;
public class String01 {
public static void main(String[] args) {
/*
1.String 对象用于保存字符串,也就是一组字符序列
2.字符串常量对象是用双引号括起的字符序列。例如:"你好"、"12.97"、"luck"等
3.字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节
4.String 类较常用构造方法(其他看手册):
String s1 = new String(); //
String s2 = new String(String original);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count)
String s5 = new String(byte[] b)
5.String 类实现了接口 Serializable [String 可以串行化: 可以在网络传输]
接口 Comparable [String 对象可以比较大小]
6.String 是 final类,不能被其他的类继承
7.String 有属性 private final char value[]; 用于存放字符串内容
8.一定要注意: value 是一个final类型,不可以修改(需要功力):
即value不能指向新的地址,但是单个字符内容是可以变化的
*/
String name = "jack";
name = "Tom";
final char[] value ={'a','b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H'; // 单独的修改不会报错
// value = v2; 不可以修改 value 地址
}
}
两种创建 String 对象的区别
方式一:直接赋值 String s = "edu";
先从常量池查看是否有"edu"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s 最终指向的是常量池的空间地址
方式二:调用构造器 String s2 = new String("edu");
先在堆中创建空间,里面维护了value属性,指向常量池的edu空间。如果常量池没有"edu",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
字符串的特性
1)String是一个 final 类,代表不可变的字符序列
2)字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的

以上语句创建了两个对象,首先创建了一个 "hello" 对象,运行第二条语句时,会看常量池是否有 "haha",没有则会创建,指向hello的 s1 指向haha

只创建了一个对象,String a = "hello" + "abc"; // ==> 优化等价 String a = "helloabc";编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向

java
package com.heima.Hello.String_;
public class StringExercise01 {
public static void main(String[] args) {
String a = "hello"; // 创建 a 对象
String b = "abc"; // 创建 b 对象
String c = a + b;
// 解读
//1. 先创建一个 StringBuilder sb = StringBilider()
//2. 执行 sb.append("hello")
//3. sb.append("abc")
//4. String c = sb.toString()
//最后其实是 c 指向堆中的对象(String) value[] -> 池中 "helloabc"
}
}
答:一共有三个对象
String类的常见方法
说明
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率极低,因此,java设计者还提供了 StringBuilder 和 StringBuffer 来增强String的功能,并提高效率。
常用方法举例
equals // 区分大小写,判断内容是否相等
java
package com.heima.Hello.String_;
public class StringMethod01 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "Hello";
System.out.println(s1.equals(s2)); // 运行结果为 false ,说明区分大小写
}
}
equalsgnoreCase //忽略大小写的判断内容是否相等
java
package com.heima.Hello.String_;
public class StringMethod01 {
public static void main(String[] args) {
// 忽略大小写的判断内容是否相等
String username = "john";
if ("John".equalsIgnoreCase(username)) {
System.out.println("Success");
} else {
System.out.println("Fail");
}
}
}
length //获取字符的个数,字符串的长度
java
package com.heima.Hello.String_;
public class StringMethod01 {
public static void main(String[] args) {
String str1 = "abcdefg";
System.out.println(str1.length()); // 返回字符串长度
}
}
indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回 -1
java
package com.heima.Hello.String_;
public class StringMethod01 {
public static void main(String[] args) {
// 忽略大小写的判断内容是否相等
String str1 = "abcdefg";
System.out.println(str1.length()); // 返回字符串长度
}
}
lastIndexOf //获取字符在字符串中最后一次出现的索引,索引从0开始,如找不到,返回 -1
java
package com.heima.Hello.String_;
public class StringMethod01 {
public static void main(String[] args) {
String s2 = "wer@ter@gmail@2";
int index = s2.lastIndexOf('@');
System.out.println("字符@在字符中最后一次出现的索引位置: " + index);
}
}
substring //截取指定范围的字串
java
package com.heima.Hello.String_;
public class StringMethod01 {
public static void main(String[] args) {
String name = "hello,张三";
System.out.println(name.substring(6));// 截取后面的字符
System.out.println(name.substring(0,5)); // 从索引0开始,截取到索引为5的位置,不包括5
}
}
trim // 去前后空格
charAt //获取某索引处的字符,注意不能使用 Str[index] 这种方式
例:String str = "hello" //要取其中的字符 "h"
// String[0] 这种方式不对
// str.charAt(0) => h 这种方式才对
toUpperCase // 转换成大写,如果字符里本身就有大写字符,还是保持大写
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
String s = "hello";
System.out.println(s.toUpperCase()); // HELLO
}
}
toLowerCase // 转换成小写,如果字符里本身就有小写字符,还是保持小写
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
String s = "HELLO";
System.out.println(s.toLowerCase()); // hello
}
}
concat // 拼接字符串
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
String s1 = "宝玉";
s1 = s1.concat("林黛玉").concat("薛宝钗").concat("together");
System.out.println(s1);
}
}
replace // 替换字符串中的字串(s1.replace() 方法执行后,返回的结果才是替换过的,注意:对s1没有任何影响,下面示例代码有影响是因为又用s1接收了一下)
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
String s1 = "宝玉 and 林黛玉 林黛玉 林黛玉";
s1 = s1.replace("林黛玉","薛宝钗"); // 把原来字符串里的"林黛玉"替换为"薛宝钗"
System.out.println(s1); // 结果: 宝玉 and 薛宝钗 薛宝钗 薛宝钗
}
}
split // 分割字符串,对于某些分割字符,我们需要转义,比如 | \\ 等
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
String poem1 = "锄禾日当午,汗滴禾下土,谁之盘中餐,粒粒皆辛苦";
String poem2 = "E:\\aaa\\bbb";
// 1.以,为标准对poem进行分割,返回一个数组
// 2.在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
String[] split = poem1.split(",");
System.out.println("===分割后的诗句===");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
System.out.println("========================");
String[] split2 = poem2.split("\\\\"); // \ 前加一个 转义字符 \ ,才能表示 \
for (int j = 0; j < split2.length; j++) {
System.out.println(split2[j]);
}
}
}
compareTo // 比较两个字符串的大小
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
// compareTo 比较两个字符串的大小,如果前者大
// 则返回正数,后者大,则返回负数,如果相等,返回0
String a = "jcck";
String b = "jack";
System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2 的值
}
}
toCharArray // 转换成字符数组
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
// compareTo 比较两个字符串的大小,如果前者大
// 则返回正数,后者大,则返回负数,如果相等,返回0
// (1) 如果长度相同,并且每个字符也相同,就返回 0
// (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
// 就返回 if (c1 != c2) {
// return c1 - c2;
// }
// (3) 如果前面的部分都相同,就返回 str1 - str2
String a = "jcck";
String b = "jack";
System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2 的值
}
}
format // 格式字符串,%s 字符串 %c字符串 %d 整型 %.2f 浮点型
java
package com.heima.Hello.String_;
public class StringMethod02 {
public static void main(String[] args) {
String name = "Henry";
int age = 22;
double score = 95.5;
char gender = '男';
// 将所有的信息都拼接在一个字符串
String info =
"我的姓名是" + name + ",年龄是" + ",成绩是" + score + ",性别是" + gender + "。希望大家喜欢我!";
System.out.println(info);
// 1. %s , %d , %.2f , %c 称为占位符
// 2. 这些占位符由后面变量来替换
// 3. %s 表示后面由字符串来替换
// 4. %d 是整数来替换
// 5. %.2f 表示使用小数来替换,替换后,只会保留小数点后两位,并且进行四舍五入的处理
// 6. %c 使用char 类型来替换
String formatStr = "我的姓名是%s 年龄是%d, 成绩是%.2f 性别是%c。希望大家喜欢我!";
String info2 = String.format(formatStr, name, age, score, gender);
System.out.println("info2 = " + info2);
}
}