✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】

String对象用于保存字符串,也就是一组字符序列。
字符串常量对象是用双引号括起的字符序列。
字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。
String类较常用构造器:


【举个栗子】
package com.dingjiaxiong.string_;
/**
* ClassName: String01
* date: 2022/9/4 15:47
*
* @author DingJiaxiong
*/
public class String01 {
public static void main(String[] args) {
// 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 s = “Dingjiaxiong”;】
方式一:先从常量池查看是否有"Dingjiaxiong”数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
【方式二 调用构造器 String s = new String(“Dingjiaxiong”);】
方式二:先在堆中创建空间,里面维护了value属性,指向常量池的Dingjiaxiong空间。如果常量池没有"Dingjiaxiong",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
【两种方式的内存分布图】

String是一个final类,代表不可变的字符序列
字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的.
【举个栗子】
String s1 = "hello";
s1 = "haha";
【上述语句创建了2个对象】
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,
因此java设计者还提供了StringBuilder和 StringBuffer 来增强String的功能,并提高效率。
【举个栗子】
package com.dingjiaxiong.string_;
/**
* ClassName: StringMethod01
* date: 2022/9/4 16:03
*
* @author DingJiaxiong
*/
public class StringMethod01 {
public static void main(String[] args) {
//1. equals,因为重写过,所以是比较内容是否相同,区分大小写
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));
//2.equalsIgnoreCase 忽略大小写的判断内容是否相等
String username = "johN";
if ("john".equalsIgnoreCase(username)){
System.out.println("成功");
}else{
System.out.println("失败");
}
// 3.length 获取字符的个数,字符串的长度
System.out.println("韩老师666".length());
// 4.indexOf 获取字符在字符串对象中第一次出现的索引,索引从 0 开始,如果找不到,返回-1
String s1 = "wer@terwe@g";
int index = s1.indexOf('@');
System.out.println(index);
System.out.println("weIndex = "+ s1.indexOf("we"));
// 5.lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从 0 开始,如果找不到,返回-1
s1 = "wer@terwe@g@";
index = s1.lastIndexOf('@');
System.out.println(index);
System.out.println("ter的位置 = " + s1.lastIndexOf("ter"));
/// 6.substring 截取指定范围的子串
String name = "Hello , 张三";
System.out.println(name.substring(6));
System.out.println(name.substring(2,5));
}
}
运行结果

【还有一些String 相关方法】
package com.dingjiaxiong.string_;
import javax.lang.model.element.NestingKind;
/**
* ClassName: StringMethod02
* date: 2022/9/4 16:09
*
* @author DingJiaxiong
*/
public class StringMethod02 {
public static void main(String[] args) {
// 1.toUpperCase 转换成大写
String s = "heLLo";
System.out.println(s.toUpperCase());
// 2.toLowerCase 转换成小写
System.out.println(s.toLowerCase());
// 3.concat 拼接字符串
String s1 = "宝玉";
s1 = s1.concat("林黛玉").concat("孙悟空").concat("JavaJava");
System.out.println(s1);
// 4.replace 替换字符串中的字符
s1 = "宝玉 and 林黛玉 林黛玉 林黛玉";
String s11 = s1.replace("宝玉","Jack");
System.out.println(s1);
System.out.println(s11);
//对s1没有影响
// 5.split 分割字符串
String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
String[] split = poem.split(",");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
poem = "E:\\aaa\\bbb";
split = poem.split("\\\\");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
// 6.toCharArray 转换成字符数组
s = "happy";
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
System.out.print(chs[i] + " ");
}
System.out.println();
// 7.compareTo 比较两个字符串的大小,如果前者大,
// 则返回正数,后者大,则返回负数,如果相等,返回0
//韩老师解读
// (1) 如果长度相同,并且每个字符也相同,就返回 0
// (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
// 就返回 if (c1 != c2) {
// return c1 - c2;
// }
// (3) 如果前面的部分都相同,就返回 str1.len - str2.len
String a = "jcck";
String b = "jack";
System.out.println(a.compareTo(b)); //返回 'c' - 'a' = 2
// 8.format 格式字符串
//占位符
// * %s 字符串 %c 字符 %d 整型 %.2f 浮点型
String name = "john";
int age = 10;
double score = 56.789;
char gender = '男';
String formatStr = "我的姓名是%s 年龄是%d 成绩是 %.2f 性别是 %c ";
String info = String.format(formatStr,name,age,score,gender);
System.out.println(info);
}
}
运行结果
