String底层分析与常用方法

131 阅读2分钟

String 底层分析与常用方法

String

  1. final修饰的类,不可变字符串,如果进行赋值,会创建新的对象

  2. 一个字符串一旦被分配,其内容是不可变的

    例如:

    String str = "a" + "b"; 这里是创建了3个对象,“a”, "b" , "ab"(假设常量池为空)

String字符串拼接的底层原理

  1. 会先判断常量池中是否存在相加的对象,底层是创建了StringBuilder进行拼接,直接了append方法,如果相加对象在常量池中存在,那么会直接调用append方法,如果不存在会先创建相加的对象再进行append拼接

    // 底层调用
    StringBuilder sb = new StringBuilder();
    sb.append();
    

    字符串相加内存分析

字符串相加内存分析.png

String a = "a";
String b = "b";
String c = a + b;
String d = "ab";
System.out.println(c==d); // 结果是false
  1. String 在JVM的内存分布图

String的内存分布图.png

  1. String的继承与接口实现图

    继承了Object类,实现了CharSequence Serializable Comparable接口

String的继承与实现.png

  1. String的常用方法

    1. equals 字符串比较区分大小写
    2. equalsIgnoreCase 字符串比较不区分大小写
    3. length 获取字符串长度
    4. indexOf
    5. lastIndexOf 后去字符串第一次出现的索引,从后面开始获取,输出的顺序还是从左到右
    6. substring 分割
    7. trim 消除前后空格
    8. charAt 或者某个字符
    9. toUpperCase 全部转大写
    10. toLowerCase 全部转小写
    11. concat 拼接
    12. replace 替换
    13. split 分割
    14. compareTo比较连个字符串的大小
    15. toCahrArray 转换成字符数组
    16. 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);