• 第十二节:String类【java】


    目录

    📘1.1 字符串构造方法

    📒1.2 String对象怎样比较

    📜1.2.1 引用类型 == 比较的是引用中的地址。

    📄1.2.2 boolean equals(Object anObject) 方法:比较怕两个引用所指的对象当中的内容是否一致

    📑1.2.3 int compareTo(String s) 方法(比较两个字符串大小的关系)

    📃1.2.4 int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较

    📗1.3 字符串查找

    📕1.4 字符串的转换

    ⌨1.4.1 数字和字符串转换(.valueOf——数字转字符串     .parse___(类型)—— 字符串转数字)

    📃1.4.2 字母大小写的相互转换(.toUpperCase()——小写转大写     .toLowerCase() ——大写转小写)

    🥎1.4.3 字符串转数组(toCharArray();)

    🍀1.4.4 格式化输出

    📙1.5 字符串的替换

    📁1.5.1 替换不改变字符串本身(.replace)

    📁1.5.2 替换所有的指定内容(.replaceAll)

    📁1.5.3 替换第一个所指的内容(.replaceFirst)

    📒1.6 字符串拆分

    🥂1.6.1 String[] split(String regex) —— 将字符串全部拆分

    🥂1.6.2 String[] split(String regex, int limit)—— 将字符串以指定的格式,拆分为limit组

    🥂1.6.3 拆分IP地址

    📘1.7 字符串截取(substring)

    🏹1.7.1 String substring(int beginIndex)——从指定索引截取到结尾

    🏹1.7.2 String substring(int beginIndex, int endIndex) ——截取部分内容 ——左闭右开,索引从0开始

    📗1.8 String trim()、String toUpperCase()、String toLowerCase()

    🎎1.8.1 String trim()——去掉字符串中的左右空格,保留中间空格

    🎎1.8.2 String toUpperCase()——字符串转大写

    🎎1.8.3 String toLowerCase()——字符串转小写

    📕1.9 字符串不可在原来位置进行修改

    📙1.10 字符串通过拼接对象进行修改

    🔥2.字符串的修改

    📒2.1 认识StringBuilder和StringBuffer

    ➕2.1.1 StringBuilder append(String str)——在尾部追加,相当于String的+=

    ➕2.1.2 StringBuilder reverse() ——反转字符串

    📗2.2 .String、StringBuffer、StringBuilder的区别

    📕2.3 一道面试题

    📙2.4 本章测试题


     

    🌈学习一个类的时候一定要从构造方法开始学习,类的最终目的是实例化对象,那么就一定会构造方法

    📘1.1 字符串构造方法

    ✨首先我们来看一段代码:

    1. public class Test {
    2. public static void main(String[] args) {
    3. // 使用常量串构造
    4. String str1 = "hello";
    5. // 直接newString对象
    6. String str2 = new String("hello");
    7. System.out.println(str1);//hello
    8. System.out.println(str2);//hello
    9. //字符数组,使用字符数字进行构造
    10. char[] values = {'a','b','c','d'};
    11. String str3 = new String(values);
    12. System.out.println(str3);//a b c d
    13. }
    14. }

    👉总结:

    常用的构造方法有三种:

    1️⃣使用常量串构造

    2️⃣直接newString对象

    3️⃣使用字符数字进行构造

    目前我们只需要掌握这三种即可,如果想要深入研究,可以打开idea,双击shift,搜索String,点击Classes就可以看到String的各种构造方法

    582c51ebd4014fa7a013669bc604ef71.png

    ➡️当我们定义了字符串之后,需要注意以下几点:

    1️⃣String是引用类型,内部并不存储字符串本身。String 有两个成员变量,不管是带参数的还是不带参数的,都会给 value 赋值

    6a8c6166a85f47d58d108dc5556dc8b6.png

     两个成员变量:value    hash

    3efb5c5e80e54b8387ed478093e28f46.png

    👆对于以上代码,我们通过调试发现:在java当中,字符串没有所谓的 \0 

    da5c982fe0504f7d83fa1afa59e00e8b.png

    String的内存布局135d0d7ee569462ab734437704ce10cd.png

     ➡️并且String 现在是一个类,那么有类就会有很多方法方法

     2️⃣String 类通过 .length() 可以输出字符串长度

    1. public static void main(String[] args) {
    2. String str1 = "hello";
    3. System.out.println(str1.length());//5
    4. }

    数组求长度:.length

    1. public static void main(String[] args) {
    2. int[] array = {1,2,3,4};
    3. System.out.println(array.length);//4
    4. }

    ✨在这里我们要区分:.length() 是一种方法,而 .length 仅仅是一种属性(注意何时加())

    3️⃣ .isEmpty() :如果字符串长度为0,返回true,否则返回false

    1. public class Test {
    2. String str2 = "";
    3. System.out.println(str2.length());//0
    4. System.out.println(str2.isEmpty());//true
    5. }

    ➡️拓展:

    String str3 = null

    str2.isEmpty() 代表它所指向的对象一个字符串都没有

    str3 :代表它不指向任何对象

    4️⃣在Java中“ ”引起来的也是String类型对象。

    1. // 打印"hello"字符串(String对象)的长度
    2. System.out.println("hello".length());//5

    📒1.2 String对象怎样比较

    字符串的比较会有两种场景:🕛相不相同🕠大小

    📜1.2.1 引用类型 == 比较的是引用中的地址

    1. public static void main(String[] args) {
    2. String str1 = new String("hello");
    3. String str2 = new String("hello");
    4. System.out.println(str1 == str2);//false:对于引用类型==比较的是引用中的地址。
    5. }

    📄1.2.2 boolean equals(Object anObject) 方法:比较怕两个引用所指的对象当中的内容是否一致

    1. public static void main(String[] args) {
    2. //比较怕两个引用所指的1对象当中的内容是否一致
    3. System.out.println(str1.equals(str2));//true:引用中的内容是一样的
    4. }

    📑1.2.3 int compareTo(String s) 方法(比较两个字符串大小的关系

    如果出现不等的字符,直接返回这两个字符的大小差值

    1. public static void main(String[] args) {
    2. //比较两个字符串大小的关系
    3. String str1 = new String("hello");
    4. String str2 = new String("healo");
    5. System.out.println(str1.compareTo(str2));//正数
    6. }

    当 str1 > str2,返回一个正数

    当 str1 < str2,返回一个负数

    当 str1 = str2,返回0

    如果前 k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
    1. public static void main(String[] args) {
    2. //比较两个字符串大小的关系
    3. String str3 = new String("helloabc");
    4. String str4 = new String("hello");
    5. System.out.println(str3.compareTo(str4));//3
    6. }

    📃1.2.4 int compareToIgnoreCase(String str) 方法compareTo方式相同,但是忽略大小写比较

    1. //比较两个字符串大小的关系
    2. String str5 = new String("Hello");
    3. String str6 = new String("hello");
    4. System.out.println(str5.compareToIgnoreCase(str6));//0

    📗1.3 字符串查找

    538238505b594e3681728a6fca937a72.png

    1. //字符串查找
    2. public static void main(String[] args) {
    3. String s = "aaabbbcccaaabbbccc";
    4. //char charAt(int index) 返回index位置上字符
    5. System.out.println(s.charAt(3)); // 'b'
    6. //int indexOf(int ch) 返回ch第一次出现的位置,没有返回-1
    7. System.out.println(s.indexOf('c')); // 6
    8. //int indexOf(int ch, int fromIndex) 从fromIndex位置开始找ch第一次出现的位置,没有
    9. //返回-1
    10. System.out.println(s.indexOf('c', 10)); // 15
    11. //int indexOf(String str) 返回str第一次出现的位置,没有返回-1
    12. System.out.println(s.indexOf("bbb")); // 3
    13. //int indexOf(String str, int fromIndex) 从fromIndex位置开始找str第一次出现的位置,
    14. //没有返回-1
    15. System.out.println(s.indexOf("bbb", 10)); // 12
    16. //int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1
    17. System.out.println(s.lastIndexOf('c')); // 17
    18. //int lastIndexOf(int ch, int fromIndex) 从fromIndex位置开始找,从后往前找ch第一次
    19. //出现的位置,没有返回-1
    20. System.out.println(s.lastIndexOf('c', 10)); // 8
    21. //int lastIndexOf(String str) 从后往前找,返回str第一次出现的位置,没有返回-1
    22. System.out.println(s.lastIndexOf("bbb")); // 12
    23. //int lastIndexOf(String str, int fromIndex) 从fromIndex位置开始找,从后往前找str
    24. //第一次出现的位置,没有返回-1
    25. System.out.println(s.lastIndexOf("bbb", 10)); // 3
    26. }

    📕1.4 字符串的转换

    ⌨1.4.1 数字和字符串转换(.valueOf——数字转字符串     .parse___(类型)—— 字符串转数字

    1. //字符串的转换
    2. public static void main(String[] args) {
    3. // 数字转字符串
    4. String str2 = String.valueOf(123);
    5. System.out.println(str2);//123
    6. // 字符串转数字
    7. String str1 = "123";
    8. Integer.parseInt(str1);
    9. System.out.println(str1);//123
    10. }

    📃1.4.2 字母大小写的相互转换(.toUpperCase()——小写转大写     .toLowerCase() ——大写转小写

    1. public static void main(String[] args) {
    2. String str3 = "abcd";
    3. String str4 = "ABCD";
    4. // 小写转大写
    5. System.out.println(str3.toUpperCase());//ABCD
    6. //大写转小写
    7. System.out.println(str4.toLowerCase());//abcd
    8. }

    🥎1.4.3 字符串转数组(toCharArray();

    1. //字符串转数组
    2. public static void main(String[] args) {
    3. String str5 = "abcdef";
    4. char[] array = str5.toCharArray();
    5. for (int i = 0; i < array.length; i++) {
    6. System.out.print(array[i]);
    7. }
    8. System.out.println();
    9. }

    🍀1.4.4 格式化输出

    1. //格式化
    2. public static void main(String[] args) {
    3. String s = String.format("%d-%d-%d", 2022,11,20);
    4. System.out.println(s);//2022-11-20
    5. }

    📙1.5 字符串的替换

    📁1.5.1 替换不改变字符串本身(.replace)

    1. public static void main(String[] args) {
    2. String str1 = "ababcabcabcd";
    3. String ret1 = str1.replace('a','p');//pbpbcpbcpbcd
    4. System.out.println(ret1);
    5. String ret2 = str1.replace('a','0');//0b0bc0bc0bcd
    6. System.out.println(ret2);
    7. }

    📁1.5.2 替换所有的指定内容(.replaceAll)

    1. public static void main(String[] args) {
    2. String str1 = "ababcabcabcd";
    3. //替换所有的指定内容(replaceAll)
    4. String ret3 = str1.replaceAll("ab","666");//666666c666c666cd
    5. System.out.println(ret3);
    6. }

    📁1.5.3 替换第一个所指的内容(.replaceFirst)

    1. public static void main(String[] args) {
    2. String str1 = "ababcabcabcd";
    3. //替换第一个所指的内容(.replaceFirst)
    4. String ret4 = str1.replaceFirst("ab","666");//666abcabcabcd
    5. System.out.println(ret4);
    6. }

    📒1.6 字符串拆分

    字符串的拆分分为以下两个方法:

    🥂1.6.1 String[] split(String regex) —— 将字符串全部拆分

    1. public static void main(String[] args) {
    2. String str1 = "hello little bitter ";
    3. String[] strs = str1.split(" ");
    4. for (int i = 0; i < strs.length; i++) {
    5. System.out.println(strs[i]);//hello little bitter
    6. }
    7. }

    🥂1.6.2 String[] split(String regex, int limit)—— 将字符串以指定的格式,拆分为limit组

    1. public static void main(String[] args) {
    2. String str1 = "hello little bitter ";
    3. String[] strs = str1.split(" ",2);
    4. for (int i = 0; i < strs.length; i++) {
    5. System.out.println(strs[i]);//hello little bitter
    6. }
    7. }

    🥂1.6.3 拆分IP地址

    1. public static void main(String[] args) {
    2. String str1 = "192.168.1.1";
    3. String[] strs = str1.split("\\.");
    4. for (int i = 0; i < strs.length; i++) {
    5. System.out.println(strs[i]);//192 168 1 1
    6. }
    7. }

    ➡️在这里我们是按照“ .  ”进行拆分的,为什么要加\\呢?此时不能够识别“ .  ”,必须进行转义

    1️⃣字符"|","*","+"都得加上转义字符,前面加上 "\\" .
    2️⃣而如果是 "\" ,那么就得写成 "\\\\" .
    3️⃣如果一个字符串中有多个分隔符,可以用"|"作为连字符.

    📘1.7 字符串截取(substring)

    🏹1.7.1 String substring(int beginIndex)——从指定索引截取到结尾

    1. public static void main(String[] args) {
    2. String str = "abcdefg";
    3. //String substring(int beginIndex)——从指定索引截取到结尾
    4. String s = str.substring(4);
    5. System.out.println(s);//efg
    6. }

    🏹1.7.2 String substring(int beginIndex, int endIndex) ——截取部分内容 ——左闭右开,索引从0开始

    1. public static void main(String[] args) {
    2. String str = "abcdefg";
    3. // String substring(int beginIndex, int endIndex) ——截取部分内容 ——左闭右开
    4. String str2 = str.substring(2,6);
    5. System.out.println(str2);//cdef-----[ )
    6. }

    📗1.8 String trim()、String toUpperCase()、String toLowerCase()

    🎎1.8.1 String trim()——去掉字符串中的左右空格,保留中间空格

    1. public static void main(String[] args) {
    2. String str = " hello ab ";
    3. System.out.println(str);// hello ab
    4. String ret = str.trim();
    5. System.out.println(ret);//hello ab
    6. }

    🎎1.8.2 String toUpperCase()——字符串转大写

    1. public static void main(String[] args) {
    2. String str = "abc";
    3. //String toUpperCase()——字符串转大写
    4. String ret = str.toUpperCase();
    5. System.out.println(ret);//ABC
    6. }

    🎎1.8.3 String toLowerCase()——字符串转小写

    1. public static void main(String[] args) {
    2. String str2 = "AAAABBBBB";
    3. //String toLowerCase()——字符串转小写
    4. String ret2 = str2.toLowerCase();
    5. System.out.println(ret2);//aaaabbbbb
    6. }

    📕1.9 字符串不可在原来位置进行修改

    ✨所有字面值双引号引起的都会放到常量池当中

    1. public static void main(String[] args) {
    2. String str1 = "abcd";
    3. String str2 = new String("abcd");
    4. System.out.println(str1 == str2);//false
    5. }

    如果常量池当中存放了“abcd”,就不会再将str2中的“abcd”放入,共用一个体,如果没有则放入

    ff5dfca8d89a4d9a955998463706f899.png

    👉总结:双引号 引起来的值就存在字符串常量池当中,如果有,就不存储,直接返回字符串常量池的对象即可

    📙1.10 字符串通过拼接对象进行修改

    1. //字符串如何修改
    2. public static void main(String[] args) {
    3. String str = "hello";
    4. str += "abc";
    5. System.out.println(str);//helloabc
    6. }

    在这里是两个对象拼接形成一个新的对象

    🔥2.字符串的修改

     ➡️StringBuffffer 和 StringBuilder 的是为了方便字符串的修改

    📒2.1 认识StringBuilder和StringBuffer

    ➡️StringBuilder和StringBuffffer这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法

    ➕2.1.1 StringBuilder append(String str)——在尾部追加,相当于String的+=

    1. public static void main(String[] args) {
    2. StringBuilder stringBuilder = new StringBuilder("abc");
    3. System.out.println(stringBuilder);
    4. //字符串拼接
    5. stringBuilder.append("123").append(10);
    6. stringBuilder.append(19.9);
    7. System.out.println(stringBuilder);
    8. }

    ➕2.1.2 StringBuilder reverse() ——反转字符串

    1. public static void main(String[] args) {
    2. StringBuilder stringBuilder = new StringBuilder("abc");
    3. System.out.println(stringBuilder);
    4. //字符串逆置
    5. stringBuilder.reverse();
    6. System.out.println(stringBuilder);//cba
    7. }

    📗2.2 .String、StringBuffer、StringBuilder的区别

    1️⃣String的内容无法修改,而StringBuilder、StringBuffer的内容可以修改

    2️⃣StringBuffffer与StringBuilder大部分功能是相似的

    3️⃣StringBuffffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

    4️⃣String变为StringBuilder: 利用StringBuilder的构造方法或append()方法

    5️⃣StringBuilder变为String: 调用toString()方法

    📕2.3 一道面试题

    🙈以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】
    1. String str = new String("ab"); // 会创建多少个对象
    2. String str = new String("a") + new String("b"); // 会创建多少个对象

    第一个代码:

    1️⃣双引号ab   2️⃣new String

    第二个代码:

    1️⃣双引号a    2️⃣双引号b    3️⃣字符串拼接会产生一个StringBuilder 对象    4️⃣赋值给str,调用ToString(),就会创建一个String对象

    9a143b7275954da596c62bb2ba5274dc.png 

    5️⃣new String    6️⃣第二个new String

    ✨但是题目问的是创建了多少个String对象,则不包括3️⃣字符串拼接会产生一个StringBuilder 对象 ,一共创建了5个String对象

    📙2.4 本章测试题

    1️⃣字符串中的第一个唯一字符

    2️⃣字符串最后一个单词的长度

    3️⃣验证回文串

     

     

     

     

     

  • 相关阅读:
    凯云科技 | 专业嵌入式测试软硬件整体解决方案供应商
    我的创作纪念日
    鸿蒙Ability Kit(程序框架服务)【UIAbility组件与UI的数据同步】
    【WPF系列】- System.Diagnostics命名空间
    如何获取QColorDialog.getColor()的取消事件
    npm nvm cnpm常见指令
    cookiecutter工具
    数据库防火墙技术展望【终章】
    大模型必备算力:CPU&GPU天梯图(2023年最新版)
    【Linux系列】计算机系统中的架构与发行版:理解与区分
  • 原文地址:https://blog.csdn.net/m0_72161237/article/details/127945340