Java---String类
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)
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";编译器不傻,做一个优化,判断创建的常量池对象,是否有引用指向

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 // 区分大小写,判断内容是否相等
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 //忽略大小写的判断内容是否相等
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 //获取字符的个数,字符串的长度
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
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
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 //截取指定范围的字串
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 // 转换成大写,如果字符里本身就有大写字符,还是保持大写
package com.heima.Hello.String_;public class StringMethod02 {public static void main(String[] args) {String s = "hello";System.out.println(s.toUpperCase()); // HELLO}
}
toLowerCase // 转换成小写,如果字符里本身就有小写字符,还是保持小写
package com.heima.Hello.String_;public class StringMethod02 {public static void main(String[] args) {String s = "HELLO";System.out.println(s.toLowerCase()); // hello}
}
concat // 拼接字符串
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接收了一下)
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 // 分割字符串,对于某些分割字符,我们需要转义,比如 | \\ 等
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 // 比较两个字符串的大小
package com.heima.Hello.String_;public class StringMethod02 {public static void main(String[] args) {// compareTo 比较两个字符串的大小,如果前者大// 则返回正数,后者大,则返回负数,如果相等,返回0String a = "jcck";String b = "jack";System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2 的值}
}
toCharArray // 转换成字符数组
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 - str2String a = "jcck";String b = "jack";System.out.println(a.compareTo(b)); // 返回值是 'c' - 'a' = 2 的值}
}
format // 格式字符串,%s 字符串 %c字符串 %d 整型 %.2f 浮点型
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);}
}