字符串
字符串定义:
1.用 " 字符串内容 " 引起来的内容
2.用 三个 " " " 多行内容 " " "定义多行字符串(JDK-13新特性)
3.new String() 来构建字符串
字符串注意事项:
- 通过字面量(" "双引号)定义的字符串对象 ,来自于 字符串的 串池
- new String 构建的对象 来自于 堆空间
new代表新建,每次通过new构建对象,地址都不相同
字符串串池:
JVM会在串池里放一些常用的字符串,当使用String s1 = “常用字符串”; 会自动加载串池中的字符串,而不是在堆空间中new一个新对象
这里找了个串池详解:
https://www.cnblogs.com/fangfuhai/p/5500065.html
转载自原作者:风中程序猿
转载,如有侵权,本人会自行删除
前面学运算符中 的 == 的作用:
- 对于基本数据类型而言,就是比较两个值是否相等
- 对于引用数据类型而言, 使用来比较两个变量 指向的地址是否相等
String s1 = "hello word\n";
//JDK-13的新特性
String s2 = """
hello word
""";
String s3 = new String();
String s4 = "";
String s5 = new String("hello word");
String s6 = new String("hello word");
System.out.println(s1 == s2);//s2有换行符
System.out.println(s3 == s4);//
System.out.println(s5 == s1);
System.out.println(s5 == s6);//内容相同 地址值不同
字符串的拼接(使用 +):
1.字符串 是不可改变的
2.两个字符串字面量相加,编译器会直接将其合并,从串池中获取
3.字符串(包含变量)相加,每次拼接 编译器会构建StringBuilder 进行 append
一般情况下 + 也可以,但在循环中,或需要频繁拼接字符串是,其会产生很多对象,性能低不推荐使用 +
推荐使用StringBuilder
因为 + 的底层也是使用StringBuilder的append来实现的。但是如果是循环拼接,那么系统会在循环体内部创建StringBUilder,这样会造成空间浪费
String的常见方法:
★ charAt(index)
获取指定索引位置的字符
isEmpty(index)
字符串是否长度为 0
isBlank(index)
字符串是否为空(包含空白字符)
codePointAt(index)——JDK15新特性
获取指定索引位置的字符码
getBytes(charset)
将字符串按指定编码转为流
★ equals(obj)/equalsIgonreCase(str)
判断两个字符串 内容 是否相同
第二个是,忽略大小写 判断
- 比较两个字符串的时候,其中有一个 字符串时字面量时 推荐使用 字面量 去和 变量比较
因为变量可能是null,null代表 什么都没有,不能调用方法(非静态方法)因为会产生空指针异常
compareTo(str)
判断字符串的大小
- 逐个字符进行Unicode编码的比较
返回 > 0 ,前者比后者大
返回 0 ,前者、后者一样大
返回 < 0 ,前者比后者小
startsWith(str)/ endsWith(str)
判断字符串是否以 … 开头/结尾
contains(str)
是否包含某个指定的子串
indexOf(str) / lastIndexof(str)
搜索 str 在字符串中的索引位置
- 从前找 / 从后找 指定搜索内容,只返回第一次检索到内容时,其对应的角标;
返回 -1 代表没有找到
substring(offset , endIndex)
从字符串指定位置截取字符串,截取到指定位置不包含endIndex 对应的字符
- 若不传入endIndex,默认截取到最后
- 截取时 前包后不包 例如:截取前三位 [0,3) 代表截 0,1,2位
replace(oldstr , newstr)
replaceAll(regex, newstr)
替换全部满足条件字符串
replaceFirst(regex, newstr)
替换第一个匹配的字符串
matches(regex) JDK14
是否匹配某个正则
split(regex , max=0)
拆分字符串, max允许拆分的最大次数,如果不设置,或者设置为 <=0 代表 全部拆分
- 返回值是数组 String[]
- 下图,拆分时可能误拆,这时可以设置拆分次数
toLowerCase() / toUpperCase()
字符串 转为 小写/大写
trim()
strip() JDK11
trim()方法移除字符串两侧的空白字符(空格、tab键、换行符)
trim()方法无法删除掉Unicode空白字符,
但用Character.isWhitespace©方法可以判断出来
strip() 可以去掉 Unicode空白字符
toCharArray()
转为字符数组
repeat(n) JDK11
重复 N次
format
格式化字符串
String str=String.format(“这天:%s叫%s去打%s”,“老李”,“老王”,“老张”);