【Java SE】(十) String类

一、String类

在C语言中要表示字符串只能使用字符数组或者字符指针,但java是一种面对对象的语言,所以Java语言中专门提供了一种string类。string类中有一些重要的字符串不同用法,比如String、StringBuff和StringBulider等。

  1. 我们要学习就是运用和区别这些用法
  2. 需要熟悉java中字符串的new 字符串的内部结构组成

二、字符串的相关用法

2.1 书写方式

public class demo1 {
    public static void main(String[] args) {
        //第一种
        String s1 = "xuexi";
        //第二种
        String s2 = new String("blue");
        //第三种
        char[] chars = {'a','b','c','d'};
        String s3 = new String(chars);
    }
}

图示分析String的内部结构组成
在这里插入图片描述

注意:在java中没有/0表示字符串,判断字符串是否结束根据字符串费长度进行判断 ,在这里插入图片描述


2.2 String对象比较

1.== 比较,String类是引用数据类型,对于这类数据类型这里比较的是引用中的地址,且Java中字符串是字符串常量,不能被修改;

public class demo1 {
   public static void main(String[] args) {
       String s1 = new String("blue");
       String s3 = new String("blue");
       String s2 = s1;
       System.out.println(s3 == s1);
       System.out.println(s2 == s1);

运行结果
在这里插入图片描述
而字符串s4所引用的对象指向的依旧是s2的引用对象,并没有new开辟新的空间
图例分析:
在这里插入图片描述
2. equals比较,String类中重写了equals()方法,这里比较的是字符串数组内的数据是否相同;
3. int compareTo(String s)比较;
4. int compareToIgnoreCase(String str)比较,这里的比较与第三同理,只是忽略了字母大小写来比较;

public class demo1 {
    public static void main(String[] args) {
        String s1 = new String("blue");
        String s3 = new String("blue");
        String s4 = new String("Blue");
        String s2 = s1;
        System.out.println(s3 == s1);
        System.out.println(s2 == s1);
        System.out.println(s3.equals(s1));
        System.out.println(s3.compareTo(s1));
        System.out.println(s4.compareToIgnoreCase(s4));
        }
    }    

运行结果
在这里插入图片描述


三、 字符串的各种方法

3.1 查找方法

  1. int indexOf(int ch) 返回ch第一次出现的位置,没有返回-1;
  2. int indexOf(String str) 返回str第一次出现的位置,没有返回-1;
  3. char charAt(int index) 返回index位置上字符,index为负数或越界则抛异常;
  4. int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1;
  5. int lastIndexOf(String str) 从后往前找,返回str第一次出现的位置,没有返回-1;
  6. int indexOf(int ch, int fromIndex) 从fromindex位置开始找ch第一次出现的位置,没有返回-1;
  7. int indexOf(String str, int fromIndex) 从fromIndex位置开始找str第一次出现的位置,没有返回-1;
  8. int lastIndexOf(int ch, int fromIndex) 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1;
  9. int lastIndexOf(String str, int fromIndex) 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1;
    代码示例
public class demo1 {
    public static void main(String[] args) {
        String str = "aaaabbbcccdedeffg";
        System.out.println(str.indexOf('c'));
        System.out.println(str.indexOf("ab"));
        System.out.println(str.charAt(10));
        System.out.println(str.lastIndexOf('f'));
        System.out.println(str.lastIndexOf("de"));
        System.out.println(str.indexOf('b',6));
        System.out.println(str.indexOf("de",3));
        System.out.println(str.lastIndexOf('c',4));
        System.out.println(str.lastIndexOf("ab",5));
    }
    }

运行结果
在这里插入图片描述


3.2 字符串转换、替换、拆分、截取

1、 转换

  1. 数值和字符转换 使用String.valueOf()进行转换,字符创装换成数字用包装类型.pare包装类型
public class demo2 {
    public static void main(String[] args) {
        //数值转化成字符串
        String str1 = String.valueOf(456);
        String str2 = String.valueOf(23.1);
        String str3 = String.valueOf(true);
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        //字符创转换成数字
        int d = Integer.parseInt("234");
        double c = Double.parseDouble("45.45");
        System.out.println(d);
        System.out.println(c);
    }
}
  1. 大小写转换
public class demo3 {
    public static void main(String[] args) {
        //大小写转换
        String str1 = "happy";
        String str2 = "HEPPY";
        System.out.println(str1.toUpperCase(Locale.ROOT));  //小写转换成大写
        System.out.println(str2.toLowerCase(Locale.ROOT)); //大写转换成小写
    }
    }
  1. 字符串转数组
public class demo4 {
    public static void main(String[] args) {
        String str = "happy";
        // 字符串转数组
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println();
        // 数组转字符串
        String str1 = new String(arr);
        System.out.println(str1);

    }
    }
  1. 字符串格式化
public class demo5 {
    public static void main(String[] args) {
        String s1 = String.format("%d-%d-%d", 2022,8,05);
        System.out.println(s1);
    }

2、 替换

public class demo2 {
    public static void main(String[] args) {
        String str = "tiantiankaixin";
        System.out.println(str.replaceFirst("i", "e")); //替换首个内容
        System.out.println(str.replaceAll("i", "e")); //替换所有内容

    }
  }

3、 拆分

public class demo2 {
    public static void main(String[] args) {
        String str = "tian_tian_kai_xin" ;
        String[] result = str.split("_",3); //按照自己设置的格式部分拆分
        for(String str1: result) {
            System.out.println(str1);
        }
        String[] result1 = str.split("_") ; // 全部拆分、按照空格拆分
        for(String str2: result1) {
            System.out.println(str2);
        }
    }
 }

注意事项:

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

4、 截取
在这里插入图片描述


四、字符串常量池

4.1 字符串常量池(StringTable)

StringTable相当于一个哈希表,只要是双引号括起来的元素都放在常量池中,且只有一份,在存放的时候,先检查常量池中是否有这个变量,当常量池没有时就手动入池。
为了节省存储空间,Java为八种数据类型和字符串都提供了常量池。并且引入了

  1. Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息;
  2. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份;
  3. 字符串常量池

4.2 字符串的修改

在描述字符串时就明确表示字符串是不能改变的,它们的内容在创建好了之后就是不能被修改的,因此字符串具有不可变性。
注意

  1. 被final修饰的String类表明该类不能被继承;
  2. 被final修饰的value表明value自身的值不能改变,虽然不能引用其它字符数组,但是其引用空间中的内容可以修改;
  3. . 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。
    尽量避免直接对String类型对象进行修改,如果需要修改,我们可以使用StringBuffer或者StringBuilder。

4.3 常用的gStringBuilder方法

StringBuilder和StringBuffer这两个类大部分功能是相同的,所以我们只要认识其中一个类的一些常用方法就可以了,如果想了解更多可以参考https://docs.oracle.com/javase/8/docs/api/

public class demo2 {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("haohaoxuexi");
        StringBuilder str1 = str;
        //1.尾部追加 在str后+=,可以是:boolean、char、char[]、
        // double、float、int、long、Object、String、StringBuff的变量
        str1.append("ch");
        str1.append(" ");
        str1.append(12);
        System.out.println(str1);
        System.out.println(str1 == str);
        // 2.获取指定位置长度
        System.out.println(str.charAt(3));
        // 获取字符串有效长度
        System.out.println(str.length());
        // 3.获取底层保存字符串空间总的大小
        System.out.println(str.capacity());
        // 4.返回str第一次出现的位置
        System.out.println(str.indexOf("ha"));
        // 5.从指定位置位置开始查找str第一次出现的位置
        System.out.println(str.indexOf("ha",4));
        // 6.返回最后一次出现str的位置
        System.out.println(str.lastIndexOf("xu"));
        // 从指定位置开始找str最后一次出现的位置
        System.out.println(str.lastIndexOf("ha",3));
        // 7.在指定的位置插入:八种基类类型 & String类型 & Object类型数据
        System.out.println(str.insert(1,"ch"));
        System.out.println(str.insert(2,1));
        // 8.删除指定位置字符
        System.out.println(str.deleteCharAt(5));
        // 9.删除[start, end)区间内的字符
        System.out.println(str.delete(3,5));
        // 10.将[start, end)位置的字符替换为str
        System.out.println(str.replace(4,6,"wc"));
        // 11.从start开始一直到末尾的字符以String的方式返回
        System.out.println(str.substring(5));
        // 12.将[start, end)范围内的字符以String的方式返回
        System.out.println(str.substring(2,5));
        // 13.反转字符串
        System.out.println(str.reverse());
        // 14.将所有字符按照String的方式返回
        System.out.println(str.toString());
    }
}

运行结果
在这里插入图片描述
结论
由上述结果我们可以知道String和StringBuilder的区别在于前者不能修改,后者可以修改,但两者之间不能直接转换。如果要想互相转换,可以采用如下原则:

  1. String——StringBuilder: 利用StringBuilder的构造方法或append()方法;
  2. StringBuilder——String: 调用toString()方法。

五、 总结

以上就是今天所学习的关于字符串的知识,在学习字符串的途中难免会有混淆字符串的时候,也认识到了String类和StringBuilder类的区别的相应的使用方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@澄夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值