【JAVASE】String类的延伸(常用方法、StringBuffer 、StringBuilder)

九月 秋夜 满星 与你

在这里插入图片描述

大家好,这里是新一,请多关照🙈🙉🙊。在本篇博客中,新一将会为大家介绍JAVASE中的String中的常用的方法和类,干货满满哟。(以下结果均在IDEA中编译)希望在方便自己复习的同时也能帮助到大家。😜😜😜🥇🥈🥉

废话不多说,直接进入我们的文章。



一.🥇 字符、字节与字符串

1.1🥈 字符与字符串

上一篇博客关于String的介绍中,我们知道字符串内部包含一个字符数组,String 可以和 char[ ] 相互转换.
在这里插入图片描述

public static void main(String[] args) {
        //1.将字符转变为字符串
        char[] val1 = {'a','b','c','d','e'};
        String str1 = new String(val1);
        System.out.println(str1);

        //2.指定位置转为字符串
        char[] val2 = {'a','b','c','d','e'};
        String str2 = new String(val2,1,3);
        System.out.println(str2);

        //3.获取字符串中字符
        System.out.println("========");
        String str3 = "hello";
        char ch = str3.charAt(2);//获取2下标的字符
        System.out.println(ch);
        
        //4.字符串转化为字符数组
        char[] chars = str3.toCharArray();//把str3所指向的字符串对象转为字符数组
        System.out.println(Arrays.toString(chars));
    }

🚀 小练习: 判断字符串是否全部由数字所组成

这里我们直接使用方法 isDigit(ch)

public static boolean isNumberChar(String s){
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            /*if (ch < '0' || ch > '9'){
                return false;
            }*/
            if (!Character.isDigit(ch)){
                return false;
            }
        }
        return true;
    }
public static void main(String[] args) {
        String str = "123a567";
        System.out.println(isNumberChar(str));//false
    }

与之相似的方法:
static int compare(char x, char y) ——数值比较两个 char数值。
boolean equals(Object obj) ——将此对象与指定对象进行比较。
static boolean isLetter(char ch) ——确定指定的字符是否是一个字母。
static boolean isLetterOrDigit(char ch) ——确定指定的字符是字母还是数字。
static boolean isLowerCase(char ch) ——确定指定的字符是否是小写字符。
static boolean isUpperCase(char ch) ——确定指定的字符是否为大写字符。
static boolean isWhitespace(char ch) ——根据Java确定指定的字符是否为空格。
static String toString(char c) ——返回一个 String对象,表示指定的 char 。

1.2🥈 字符与字符串

字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[ ] 相互转换.
在这里插入图片描述

public static void main(String[] args) throws UnsupportedEncodingException {
        //字节数组变字符串
        byte[] bytes = {97,98,99,100};
        String str = new String(bytes,1,3);
        System.out.println(str);
        System.out.println("==========");
        
        //字符串变字节数组,并且可以换编码方式 utf-8
        String str2 = "张三";
        byte[] bytes1 = str2.getBytes("utf-8");
        System.out.println(Arrays.toString(bytes1));
    }

注意:上述编码方式不同,结果可能也不同

1.3🥈 字符数组与字节数组

我们既然学会了如何将字符串转换为这两种形式,那么我们该在什么情况下使用它们呢?

  1. byte[ ] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
  2. char[ ] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.

🚀 小科普:文本数据 VS二进制数据

一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容.如果看的懂, 就是文本数据(例如 .java 文件), 如果看不懂, 就是二进制数据(例如 .class 文件).

二.🥇 字符串常见操作

2.1🥈字符串比较

上面使用过String类提供的equals()方法,该方法本身是可以进行区分大小写的相等判断。除了这个方法之外,String类还提供有如下的比较操作:

在这里插入图片描述

public static void main(String[] args) {
        //不区分大小写的比较 - 返回值为int型
        String str1 = "Abcdef";
        String str2 = "abcdef";
        System.out.println(str1.equalsIgnoreCase(str2));//false

        //字符串比较,返回值为整数
        int ret = str1.compareTo(str2);
        System.out.println(ret);//-32 A - a ascii码值相减
    }

在String类中compareTo()方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:

1. 相等:返回0.
2. 小于:返回内容小于0.
3. 大于:返回内容大于0。

🚀 小练习

System.out.println("A".compareTo("a")); // -32 
System.out.println("a".compareTo("A")); // 32 
System.out.println("A".compareTo("A")); // 0 
System.out.println("AB".compareTo("AC")); // -1 
System.out.println("刘".compareTo("杨"));

compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一个字符的大小(根据 unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容

2.2🥈字符串查找

从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:
在这里插入图片描述

public static void main(String[] args) {
        String str1 = "ababcabcd";
        String tmp1 = "abc";

        //判断字段tmp是否存在于str中 - 类似于C中的strstr
        System.out.println(str1.contains(tmp1));
        System.out.println("========");

        //找到第一次出现tmp字段的位置 - 底层为KMP算法
        System.out.println(str1.indexOf(tmp1,3));

        String str2 = "ababcabcd";
        String tmp2 = "abc";

        //往前找到标记位置fromIndex- 正序匹配
        System.out.println(str2.lastIndexOf(tmp2,4));

        //判断首字段是否为所给字段
        System.out.println(str2.startsWith("c",4));

        //判断尾字段是否为所给字段
        System.out.println(str2.endsWith("cd"));
    }

使用查找方法时,例如indexof方法,如果内容重复,它只能返回查找的第一个位置

2.3🥈字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

在这里插入图片描述

public static void main(String[] args) {
        String str = "ababcabcdabcde";

        //将对应字符替换为新字符 - 假替换,产生新对象
        System.out.println(str.replace("ab", "pp"));

        //同等效果同上
        System.out.println(str.replaceAll("ab","pp"));

        //替换第一个匹配的字段
        System.out.println(str.replaceFirst("ab", "pp"));
    }

注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

2.4🥈字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
在这里插入图片描述

public static void main8(String[] args) {
        //以某个分隔符来分割字符串 - 返回值是个String 数组
        String str = "name=zhangsan&age=19";
        String[] strings = str.split("&");
        for (String s:strings
             ) {
            String[] ss  = s.split("=");//嵌套可实现以不同分隔符分割
            for (String str1:ss
                 ) {
                System.out.println(str1);
            }
        }
    }

那么有没有一劳永逸的方法呢,这样每次都需要嵌套才能实现多字符分割,当然有,在分割函数内部加入 | 隔开各标识符,即可实现多字符分割。

public static void main(String[] args) {
        // | 作为多个分隔符处理项
        String str = "Java30 12&21#hello";
        String[] strings = str.split(" |&|#");
        for (String s:strings
             ) {
            System.out.println(s);
        }

    }

我们再来看一组特殊用例

public static void main(String[] args) {
        // .号为特殊字符需要/来转义,但同时/也为特殊字符故需要//.即可
        String str = "192.168.1.1";
        String[] strings = str.split("\\.",2);//limit表示分割组数,此处最多为4组
        for (String s:strings
             ) {
            System.out.println(s);
        }
        System.out.println("=============");
        String str2 = "192\\168\\1\\1";
        String[] strings1 = str2.split("\\\\",7);
        for (String s:strings1
             ) {
            System.out.println(s);
        }
    }

注意:

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

因为HTML内置语法默认 \ 为转义字符,所以使用一些字符都需要在前面加 \ 来转义

2.5🥈字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:
在这里插入图片描述

public static void main(String[] args) {
        //字符串截取 - new了一个新对象
        String str = "abcdefgh";
        System.out.println(str.substring(2,4));//提取子串 cd
        //java里边一般是左闭右开
    }

注意:java里边substring方法是左闭右开区间

2.6🥈 其它操作方法

在这里插入图片描述

 public static void main(String[] args) {
        //去除字符串左右两边空格
        String str1 = "    abc    defg    ";
        System.out.println(str1.trim());
        System.out.println("=============");
        
        //大小写转换 - 其它字符不管
        String str2 = "abcdefBFRG123";
        System.out.println(str2.toUpperCase());//小写转大写
        System.out.println(str2.toLowerCase());//大写转小写
        
        //字符串入字符串常量池池操作
        str2.intern();

        //拼接字符串 - 拼接好的对象不会入池
        String str = "abcdef";//""才叫空,而null表示不指向任何对象
        System.out.println(str.concat("bit"));
        
        //求字符串长度
        System.out.println(str.length());//方法
        int[] array = {1,2,3,4,5};
        System.out.println(array.length);//属性
        
        //判空
        System.out.println(str.isEmpty());
    }

三.🥇 StringBuffer 和 StringBuilder

我们要知道String的底层就是实现的StringBuilder方法,我们先来回顾一下String方法:

  1. 任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
  2. 通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer和StringBuilder类。

3.1🥈 StringBuilder

我们先来看看它的实现:

//StringBuilder
    public static void main(String[] args) {
        /*StringBuilder stringBuilder = new StringBuilder("abcdef");
        System.out.println(stringBuilder);*/
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("abcdef");//调用super.方法,不会产生新的对象
        stringBuilder.append("123456");
        System.out.println(stringBuilder);
    }

我们再来看看以前的例子,字符串循环拼接

//如果在循环里边进行字符串的拼接,尽量不要用String,用StringBuilder和StringBuffer即可
    public static void main3(String[] args) {
         //每循环一次产生新对象 - 不推荐
        /*String str = "abcdef";
        for (int i = 0; i < 10; i++) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(str).append(i);
            str = stringBuilder.toString();
            //str += i;
        }
        System.out.println(str);*/
       
        //每循环一次只有字符串的拼接
        String str = "abcdef";
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(str);
        for (int i = 0; i < 10; i++) {
            stringBuilder.append(i);
        }
        str = stringBuilder.toString();.//调用toString方法实现类型转换
        System.out.println(str);
    }

这样的话就不用每次拼接都创建一个新对象,提高了效率

3.2🥈 StringBuffer

StringBuffer的用法跟StringBuilder差不多

public class Test{ 
 public static void main(String[] args) { 
 StringBuffer sb = new StringBuffer(); 
 sb.append("Hello").append("World"); 
 fun(sb); 
 System.out.println(sb); 
 } 
 public static void fun(StringBuffer temp) { 
 temp.append("\n").append("www.bit.com.cn"); 
 } 
}

String和StringBuffer最大的区别在于:String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的情况考虑使用StingBuffer。

注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
1. String变为StringBuffer:利用StringBuffer的构造方法或append()方法
2. StringBuffer变为String:调用toString()方法。

private static StringBuffer func() {
        String str = "abcdef";
        return new StringBuffer(str);//调用构造方法
    }

那么StringBuffer跟StringBuilder的区别在哪呢?我们来看看它们的底层

StringBuilder
在这里插入图片描述

StringBuffer
在这里插入图片描述
不难发现StringBuffer所实现的方法都加了synchronized,这个关键字叫做锁,可以用来维护线程安全,每次使用和结束需要关锁和开锁,因此时间会略高于StringBuilder
并且,这两种类中还有String没有的方法:

字符串反转

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.reverse());

字符串删除

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10));//删除5-10的数据

字符串插入

StringBuffer sb = new StringBuffer("helloworld"); 
System.out.println(sb.delete(5, 10).insert(0, "你好"));//删除后为hello,再从头插入“你好”,故输出为 你好hello

3.3🥈 三者区别

面试题:请解释String、StringBuffer、StringBuilder的区别:

1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
2. StringBuffer与StringBuilder大部分功能是相似的
3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
4. 故单线程通常用StringBuilder,多线程用StringBuffer

想对大家说的话

家人们,学到这里我们已经了解了JAVA字符串操作有关方法了,但需要记住还需要大家日复一日的练习🥳🥳🥳后续新一会持续更JAVA的有关内容,学习永无止境,技术宅,拯救世界!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Corwttaml

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

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

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

打赏作者

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

抵扣说明:

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

余额充值