一:String类的理解和创建对象

  1. String对象用于保存字符串,也就是一组字符序列
  2. 字符串常量对象是用双引号括起的字符序列。例如:”你好”、”12.97”、”boy”等

    1. String name = "Sakura";
  3. 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节

  4. String类较常用构造器:

image.png
常用的构造器:

  • String s1 = new String();
  • String s2 = new String(String original);
  • String s3 = new String(char [ ] a);
  • String s4 = new String(charl a , int startlndex , int count )
  • String s5 = new String (bytep [ ] b)

image.png :::danger String 实现了Serializable 接口,说明String对象可以串行化:
串行化(序列化):如果一个类实现了串行化,那就意味这个对象可以在网络上传输
String 实现了Comparable 接口,说明String对象可以比较大小 :::

  • String 是 final 类,不能被其他的类继承
  • String 有属性 private final char value [ ] ; 用于存放字符串内容

    • 注意:value 是一个 final 类型, 不可以修改:即 value 不能指向新的地址,但是单个字符内容是可以变化
      1. final char[] value = {'a','b','c'};
      2. char[] v2 = {'t','o','m'};
      3. value[0] = 'H';
      4. //value = v2; 不可以修改 value 地址

      二:创建String对象的两种方式

      1. //方式一:
      2. String s = "sakura";
      3. //方式二:
      4. String s = new String("sakura");

      1:区别

  • 方式一:

    • 先从常量池查看是否有”hsp”数据空间,如果有,直接指向 ; 如果没有则重新创建,然后指向。S最终指向的是常量池的空间地址
  • 方式二:
    • 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间如果常量池没有”hsp”,重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。

image.png

三:String类测试题

1:

image.png :::info 都是 True
创建b字符串的时候,因为在常量池中存在abc,所以直接指向。a和b地址一样 :::

2:image.png

:::info 最后一个:b指向的是堆,而b.intern ( ) 指向的是字符串
注意:
当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此 String对象的引用 :::

3:

image.png

4:

image.png

四:字符串的特性

1:

image.png

2:

image.png

3:

image.png :::info 一定要学会看源码!!!! :::

4:image.png

5:

image.pngimage.png

五:String常用方法

  1. package Date0823.Test01;
  2. /**
  3. * 作者:sakura
  4. * 日期:2022年08月23日 22:52
  5. */
  6. public class Test {
  7. public static void main(String[] args) {
  8. //1. equals 比较内容是否相同,区分大小写
  9. String str = "sakura";
  10. String str1 = "Sakura";
  11. System.out.println(str.equals(str1));
  12. //2. equalsIgnoreCase 忽略大小写的判断内容是否相等
  13. System.out.println(str.equalsIgnoreCase(str1));
  14. //3.length 获取字符的个数,字符串的长度
  15. System.out.println(str.length());
  16. //4.indexOf 获取字符在字符串对象中第一次出现的索引
  17. // 索引从 0 开始,如果找不到,返回-1
  18. System.out.println(str.indexOf("a"));
  19. System.out.println(str.indexOf("ra"));
  20. //5.lastIndexOf 获取字符在字符串中最后一次出现的索引,
  21. // 索引从 0 开始,如果找不到,返回-1
  22. String name = "sakufafa";
  23. System.out.println(name.lastIndexOf("fa"));
  24. //6.substring 截取指定范围的子串
  25. System.out.println(name.substring(1,4));//aku
  26. System.out.println(name.substring(4));//fafa
  27. //7.toUpperCase 转换成大写
  28. System.out.println(name.toUpperCase());
  29. //8.toLowerCase
  30. System.out.println(name.toLowerCase());
  31. //9.concat 拼接字符串
  32. String name1 = "Sakura";
  33. System.out.println(name1.concat("LF").concat("FFF"));
  34. //10.replace 替换字符串中的字符
  35. System.out.println(name1.replace("S","冷"));
  36. //11.split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
  37. String str11 = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
  38. // 1. 以 , 为标准对 poem 进行分割 , 返回一个数组
  39. // 2. 在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
  40. String[] spirit = str11.split(",");
  41. for (int i = 0; i < spirit.length; i++) {
  42. System.out.println(spirit[i]);
  43. }
  44. str11 = "E:\\aaa\\bbb";
  45. spirit= str11.split("\\\\");
  46. //12.toCharArray 转换成字符数组
  47. String name13 = "sakura";
  48. char[] name14 = name13.toCharArray();
  49. for (int i = 0; i < name14.length; i++) {
  50. System.out.println(name14[i]);
  51. }
  52. //13.compareTo 比较两个字符串的大小,如果前者大,
  53. String A = "sfk";
  54. String B = "sakura";
  55. //比较的是'f'-'a' = 5
  56. System.out.println(A.compareTo(B));
  57. //(1) 如果长度相同,并且每个字符也相同,就返回 0
  58. //(2)如果长度相同或者不相同,但是在进行比较时,可以区分大小 //
  59. // 就返回 if (c1 != c2) {
  60. // return c1 - c2;
  61. // }
  62. //(3) 如果前面的部分都相同,就返回 str1.len - str2.len
  63. String C = "sak";
  64. String D = "sakura";
  65. System.out.println(C.compareTo(D));
  66. //14. format 格式字符串
  67. String nameF = "john";
  68. int age = 10;
  69. double score = 56.857;
  70. char gender = '男';
  71. //1. %s , %d , %.2f%c 称为占位符
  72. //2. 这些占位符由后面变量来替换
  73. //3. %s 表示后面由 字符串来替换
  74. //4. %d 是整数来替换
  75. //5. %.2f 表示使用小数来替换,
  76. // 替换后,只会保留小数点两位, 并且进行四舍五入的处理
  77. //6. %c 使用 char 类型来替换
  78. String formatStr = "我的姓名是%s 年龄是%d,成绩是%.2f 性别是%c.希望大家喜欢我!";
  79. String info2 = String.format(formatStr, nameF, age, score, gender);
  80. System.out.println(info2);
  81. }
  82. }