String 底层分析与常用方法
String
-
final修饰的类,不可变字符串,如果进行赋值,会创建新的对象
-
一个字符串一旦被分配,其内容是不可变的
例如:
String str = "a" + "b"; 这里是创建了3个对象,“a”, "b" , "ab"(假设常量池为空)
String字符串拼接的底层原理
-
会先判断常量池中是否存在相加的对象,底层是创建了StringBuilder进行拼接,直接了append方法,如果相加对象在常量池中存在,那么会直接调用append方法,如果不存在会先创建相加的对象再进行append拼接
// 底层调用 StringBuilder sb = new StringBuilder(); sb.append();字符串相加内存分析
String a = "a";
String b = "b";
String c = a + b;
String d = "ab";
System.out.println(c==d); // 结果是false
- String 在JVM的内存分布图
-
String的继承与接口实现图
继承了Object类,实现了CharSequence Serializable Comparable接口
-
String的常用方法
- equals 字符串比较区分大小写
- equalsIgnoreCase 字符串比较不区分大小写
- length 获取字符串长度
- indexOf
- lastIndexOf 后去字符串第一次出现的索引,从后面开始获取,输出的顺序还是从左到右
- substring 分割
- trim 消除前后空格
- charAt 或者某个字符
- toUpperCase 全部转大写
- toLowerCase 全部转小写
- concat 拼接
- replace 替换
- split 分割
- compareTo比较连个字符串的大小
- toCahrArray 转换成字符数组
- format 格式化输出
CompareTo()方法:
1.对于单个字符,返还两个字符的asc码的差值。
如果参数字符串等于此字符串,则返回值 0;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
String str1="a";
String str2="b"; System.out.println(str1.compareTo(str2));
________________________________________
结果:-1。
2.参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值 。
String str1="aa";
String str2="ak";
System.out.println(str1.compareTo(str2));
_________________________________________
结果:-10
3.两字符串长度不一,参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值 。
String str5="ag";
String str6="dvwed";
System.out.println(str5.compareTo(str6));
—————————————————————————————————————————
结果:-3
substring方法的使用
String str= "asjfdoasjfoias";
String substring = str.substring(2, 6); // 截取四个,左闭右开 [2,6)
System.out.println(substring); // 结果jfdo
// 如果是从0开始的话,也是一样的
String substring = str.substring(0, 6); // 截取6个,位置是在第五个
测试结果:asjfdo
format的使用
// %c 标识字符
int age = 18;
String name = "张三";
String sex= "男";
double avg = 98.1238412;
String str1 = String.format("我的姓名是%s,年龄是%d岁,性别是%s,平均成绩
是%.2f",name,age,sex,avg);
System.out.println(str1);