String类, StringBuffer类, Stringbuilder类

String类:

     String 类介绍:


    ①该类对象用于保存字符串, 即一组字符序列, 用英文双引号("")包起来;
    ②实现了 Serializable接口, 可以进行序列化;
    ③实现了 Comparable接口, 可以进行比大小
    ④private final char value[], 用于存储字符串内容, value是一个final类型, 不可修改, 单个字符一旦修改就创建一个新的对象


String构造器:


    ①String()
    ②String(String original)
    ③String(byte[] bytes)
    ④String(char[] value)
    ⑤String(StringBuffer buffer)
    ⑥String(StringBuilder builder)


String对象创建方式:


    ①直接赋值, 例如: String str = "字符串";
    先查看字符串池中是否存在该字符串, 如果存在直接指向该字符串, 如果不存在, 则创建然后指向这个字符串
    ②调用构造器, 例如: String str = new String("字符串");
    在堆中创建一个String对象, 该对象指向字符串常量池: 如果字符串常量池中存在该字符串, 则直接指向    字符串常量池中这个字符串常量的地址空间, 如不存在则在字符串常量池中创建该字符串并指向这个字    符串空间地址

String类方法:


    1.intern() 返回这个字符串在常量池中的地址
    2.equals(String str) 判断这个字符串内容是否与str内容相同, 会区分大小写
    3.equalsIgnoreCase(String str) 判断这个字符串内容是否与str内容相同, 不区分大小写
    4.length() 返回字符串长度
    5.indexOf(String str) 获取str在字符串中第一次出现的索引, 如果找不到返回-1
    6.lastIndexOf(String str) 获取str在字符串中最后一次出现的索引, 如果找不到返回-1
    7.substring(int beginIndex, int endIndex) 截取指定范围内的子字符串
    8.trim() 删除字符串前后的空格
    9.charAt(int index) 获取指定索引的字符
    10.concat(String str) 拼接字符串
    11.toUpperCase() 字母转换为大写字母
    12.toLowerCase() 字母转换为小写字母
    13.replace(char oldChar, char newChar) 替换字符串中的字符
    14.split(String regex)  分割字符串
    15.toCharArray() 将字符串转换成字符型数组
    16.compareTo(String str) 比较两个字符串的大小, 如果str大返回负数, 如果str小返回正数, 如果相同返回0
    17.format 格式化字符串
        %s, %d, %.2f, %c为 占位符
        占位符由后面的变量来替换
        %s 表示由字符串替换
        %d 整数替换
        %.2f 小数(float类型)替换, 替换后保留两位小数(四舍五入)
        %c 字符替换
        代码举例
        int num = 10;
            String format = String.format("%d", num);

代码示例:

public class StringDemo {
    public static void main(String[] args) {
        // 常用的两种构造方式
        String str1 = "abcabc";
        String str2 = new String("ABCABC");

        // 1.equals 判断字符串内容是否相等, 区分大小写
        System.out.println("equals比较结果: " + str1.equals(str2));

        // 2.equalsIgnoreCase 判断字符串内容是否相等, 忽略大小写
        System.out.println("equalsIgnoreCase比较结果: " + str1.equalsIgnoreCase(str2));

        // 3.length 获取字符串长度
        System.out.println("str1长度: " + str1.length());

        // 4.indexOf 获取指定字符在字符串中出现的第一次索引
        System.out.println("str1中c第一次出现的索引: " + str1.indexOf('c'));

        // 5.lastIndexOf 获取指定字符在字符串中出现的最后一次索引
        System.out.println("str1中c最后一次出现的索引: " + str1.lastIndexOf('c'));

        // 6.substring 获取指定索引范围内子字符串
        System.out.println("获取str1索引从2到4的子字符串: " + str1.substring(2, 4));// 不包括索引为4的字符

        String s1 = "   abc   abc   ";
        // 7.trim 删除字符串前后的空格
        System.out.println("s1删除前后空格后: " + s1.trim());// 不删除中间的空格

        // 8.charAt 获取字符串指定索引位置的字符
        System.out.println("str1中索引为3的字符是: " + str1.charAt(3));

        // 9.concat 拼接字符串
        System.out.println("str1和str2拼接后: " + str1.concat(str2));

        // 10.toUpperCase 将字母转换为大写
        System.out.println("str1字母转化为大写: " + str1.toUpperCase());

        // 11.toLowerCase 将字母转换为小写
        System.out.println("str2字母转换为小写: " + str2.toLowerCase());

        // 12.replace 替换字符串中的字符
        System.out.println("str1中c字母使用z替换: " + str1.replace('c', 'z'));

        // 13.spilt 分割字符串
        String[] split = str1.split("b");
        System.out.print("str1通过字符b分割后: ");
        for (String s : split) {
            System.out.print(s + ";");
        }
        System.out.println();

        // 14.toCharArray 将字符串转换为字符型数组
        char[] chars = str1.toCharArray();
        System.out.print("str1转换为char数组: ");
        for (int i = 0; i < chars.length; i++) {
            System.out.print(chars[i] + ";");
        }
        System.out.println();

        // 15.compareTo 比较两个字符串大小
        System.out.println("str1与str2进行比较: " + str1.compareTo(str2));// 比较结果32是因为ASCII表中a - A = 32

        // 16.format 格式化字符串
        int a = 10;
        char b = 'A';
        String c = "xyz";
        float d = 0.567f;
        String format = String.format("format = %d, %c, %s, %.2f", a, b, c, d);
        System.out.println(format);// 会发现最后的d被四舍五入为0.57

    }
}

StringBuilder 和StringBuffer类:

为什么需要StringBuilder 和StringBuffer这两个类:

String类的对象内部由 private final char value[]; 在内部被final修饰, 可见每创建一个对象内容都是不可变的, 一旦对一个数组进行改变就会重新生成一个对象, 有时我们并不需要继续使用之前创建的对象, 会出现没有变量指向该对象的情况, 但是在计算机内部仍然保存该对象. 虽然java含有自动回收机制, 但也不是实时关注并且回收垃圾, 这样的话工作量将非常大, 所以java开发者为我们提供了StringBuilder 和StringBuffer两个类

StringBuffer:

     StringBuffer 介绍:


    StringBuffer类中也有一个字符型数组来保存字符串, 
    ①StringBuffer是一个容器, 可以改变长度, 直接父类是 AbstractStringBuilder; 
    ②实现了 Serializable接口, 可以进行序列化;
    ③AbstractStringBuilder中有属性 char[] value;
    ④StringBuffer中的值可以进行修改, 每次更新会直接对内容那个修改而不是改变地址值, 所以效率更高;
    ⑤扩容机制: 在内部先创建一个一定大小(默认为16, 也可以传入参数给定一个初始数组大小). 在进行添加元素时如果数组容量不够会自动进行扩容, 扩容后的大小为原来大小的2倍加2

StringBuffer 构造器:


    ①StringBuffer() 创建一个大小为16的char数组用于存放字符串内容
    ②StringBuffer(int capacity) 创建一个指定大小的char数组
    ③StringBuffer(String str) String转StringBuffer


StringBuffer 方法:


    StringBuffer中为我们提供了许多方法, 在这里介绍几个方法, 更多的方法参考javaAPI文档
    1.增 append()
    2.删 delete(start, end) 删除从start开始到end(不包含end)的元素
    3.改 replace(start, end, string) 从start开始到end(不包含end)用string替换
    4.查 indexOf(string) 返回string所在索引, 若果没有返回-1
    5.插入 insert(num, string) 在索引为num处把string插入, 后面的元素向后移
    6.长度 length 返回字符串长度
    7.逆序 reverse

代码示例:

public class StringBufferDemo {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer();
        s.append("abc");
        s.append("def");
        s.append("ghi");
        System.out.println("原字符串: " + s);// abcdefghi

        s.insert(2, "678");
        System.out.println("在索引为2的地方插入\"678\": " + s);// ab678cdefghi 指定索引位置开始插入字符

        System.out.println("删除索引为1的元素: " + s.deleteCharAt(1));// a678cdefghi 删除指定索引的字符

        System.out.println("删除索引从0到2的元素: " + s.delete(0, 2));// 78cdefghi 删除从指定位置开始到指定位置结束, 不包含结束索引

        System.out.println("用\"he\"替换索引从0到2的元素: " + s.replace(0, 2, "he"));// hecdefghi 替换, 范围同上

        System.out.println("逆序的结果: " + s.reverse());// ihgfedceh 字符串逆序

        // 以上代码均对原字符串内容进行操作并返回的均为原字符串地址, 因为StringBuffer中字符数组存储方式不是final型

        System.out.println("获取字符串索引为从0到5的子字符串: " + s.substring(0, 5));// ihgfe 返回一个指定范围的子字符串, 返回的是一个新的对象, 原字符串不变
    }
}

StringBuilder:

    StringBuilder 介绍:


    ①StringBuilder也是一个可变字符序列, 与StringBuffer的方法基本相同, 用于StringBuffer的简易替换, 如果可以优先使用该类, 执行效率比StringBuffer更快
    ②继承AbstractStringBuilder类
    ③实现了Serializable接口, 说明该类可以被序列化
    ④底层也是由一个char数组存储元素
    ⑤方法基本和StringBuffer相同, 对于上述StringBuffer类代码示例中进行字样替换即可

StringBuilder 和 StringBuffer 区别:


        StringBuffer中的方法都被一个关键字 synchronized 修饰, 一次只允许一个请求(线程)操作, 在多用户访问下的是安全的, StringBuilder中的方法没有被该关键字修饰, 在多用户访问下是不安全的, 只适用于单用户(线程)操作

String, StringBuffer, Stringbuilder比较:


    ①StringBuffer和Stringbuilder非常类似, 军代表可以变得字符序列, 方法也相同
    ②String代表的是不可变的字符序列, 效率低, 复用率高
    ③StringBuffer: 可变字符序列, 效率较高(增删), 线程安全
    ④Stringbuilder: 可变字符序列, 效率最高, 线程不安全
    ⑤运行效率比较: String<StringBuffer<Stringbuilder

String, StringBuffer, Stringbuilder的选择:


    ①如果字符串存在大量的修改操作, 一般使用StringBuilder或StringBuffer
    ②如果字符串存在大量的修改操作, 且在单线程情况下使用, 使用Stringbuilder
    ③如果字符串存在大量的修改操作, 且在多线程情况下使用, 使用StringBuffer
    ④如果字符串很少修改, 被多个对象引用, 使用String

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Black—slience

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

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

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

打赏作者

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

抵扣说明:

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

余额充值