常用类(4-2):StringBuffer类的练习以及面试题

常用类(4-2):StringBuffer类的练习以及面试题

一、练习题

1、String类与StringBuffer类之间 的转换

(1)将String类型转换为StringBuffer类型
public class StringBufferDemo7 {
    public static void main(String[] args) {
        //定义一个String变量
        String s = "hello";
        //将String类型转为StringBuffer类型
        /*
            直接赋值会报错
            StringBuffer sb1 = s;//报错
            StringBuffer sb1 = "hello";//报错
            不兼容的类型: java.lang.String无法转换为java.lang.StringBuffer
         */

        //方式1:通过构造方法转换
        //new StringBuffer().var,括号内可以传String类型的参数
        //创建StringBuffer对象
        StringBuffer sb1 = new StringBuffer(s);
        System.out.println(s);//hello
        System.out.println(sb1);//hello

        //方式2:通过append方法
        //创建StringBuffer对象
        StringBuffer sb2 = new StringBuffer();
        //将String类型添加到StringBuffer
        sb2.append(s);
        System.out.println(s);//hello
        System.out.println(sb2);//hello
    }
}
(2)将StringBuffer类型转换为String类型
public class StringBufferDemo7 {
    public static void main(String[] args) {
        //创建StringBuffer对象,传入参数bigdata
        StringBuffer sb = new StringBuffer("bigdata");

        //方式1:这个方法前面未提到
        //使用StringBuffer中的toString()方法会返回String类型
        String s1 = sb.toString();
        System.out.println(s1);//bigdata
        System.out.println(sb);//bigdata

        //方式2:使用StringBuffer中的截取功能substring()
        String s2 = sb.substring(0);//从索引0开始截取出来
        System.out.println(s2);//bigdata
        System.out.println(sb);//bigdata
        
        //方式3:使用String的构造方法:String(StringBuffer buffer)
        //分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列
        //创建String类对象,将StringBuffer类型传入进去
        String s3 = new String(sb);
        System.out.println(s3);//bigdata
        System.out.println(sb);//bigdata
    }
}

2、把数组拼接成一个字符串(用StringBuffer实现)

public class StringBufferDemo8 {
    public static void main(String[] args) {
    	//创建一个数组
        char[] chars = {'a','b','c','d'};
        //创建一个空的StringBuffer对象
        StringBuffer sb = new StringBuffer();

        //遍历数组获取到每一个字符
        for(int i=0;i<chars.length;i++){
            sb.append(chars[i]);
        }

        //将StringBuffer转换成字符串
        String s = sb.toString();
        System.out.println(s);//abcd
    }
}

3、 把字符串反转(键盘录入字符串)

import java.util.Scanner;
public class StringBufferDemo9 {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String stringLine = sc.next();

        //方式1:使用String的方式
        String s = "";
        //将输入的字符串转成字符数组
        char[] chars = stringLine.toCharArray();
        //倒着遍历字符数组
        for (int i = chars.length - 1; i >= 0; i--) {
            s += chars[i];
        }
        System.out.println(stringLine + "反转之后的字符串为:" + s);

        System.out.println("***************************************");

        //方式2:利用StringBuffer中的reverse()方法实现反转
        //将输入的字符串转换成StringBuffer类型
        StringBuffer sb = new StringBuffer(stringLine);
        //调用StringBuffer中的reverse()方法
        sb.reverse();
        String s2 = sb.toString();
        System.out.println(stringLine + "反转之后的字符串为:" + s2);
        System.out.println("链式编程:");
        System.out.println(stringLine + "反转之后的字符串为:" + new StringBuffer(stringLine).reverse().toString());
    }
}

        执行结果如下:
                    请输入字符串:
                    liyuweiwoaini
                    liyuweiwoaini反转之后的字符串为:iniaowiewuyil
                    ***************************************
                    liyuweiwoaini反转之后的字符串为:iniaowiewuyil
                    链式编程:
                    liyuweiwoaini反转之后的字符串为:iniaowiewuyil

                    Process finished with exit code 0

4、判断一个键盘录入的字符串是否是对称字符串(键盘录入字符串)

/*
        例如"abc"不是对称字符串,"aba"、"abba"、"aaa"、"mnanm"是对称字符串

        分析:
            1、第1个字符与最后一个字符进行比较
            2、第2个字符与倒数第2个字符进行比较
            3、...
            比较的次数:字符串的长度(length())/2
 */

import java.util.Scanner;
public class StringBufferDemo10 {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您想要判断的字符串:");
        String stringLine = sc.next();

        //方式1:一个一个的去比较
        //将字符串转换成字符数组
        char[] chars = stringLine.toCharArray();
        boolean flag = true;
        for(int start=0,end=chars.length-1;start<=end;start++,end--){
            if(chars[start]!=chars[end]){
                System.out.println("该字符串不是对称字符串!");
                flag = false;
                break;
            }
        }
        if(flag){
            System.out.println("该字符串是对称字符串!");
        }

        System.out.println("*********************************************");

        //方式2:利用StringBuffer中reverse()方法,将反转后与反转前进行比较
        //将输入的字符串转换成StringBuffer类型
        StringBuffer sb = new StringBuffer(stringLine);
        StringBuffer reverse = sb.reverse();
        //再将反转后的StringBuffer类型转换回String类型
        String s = reverse.toString();
        if(s.equals(stringLine)){
            System.out.println("该字符串是对称字符串!");
        }else {
            System.out.println("该字符串不是对称字符串!");
        }
    }
}
        执行结果1如下:
                    请输入您想要判断的字符串:
                    666伟爷牛逼666
                    该字符串不是对称字符串!
                    *********************************************
                    该字符串不是对称字符串!

                    Process finished with exit code 0
            
        执行结果2如下:
                    请输入您想要判断的字符串:
                    666伟666
                    该字符串是对称字符串!
                    *********************************************
                    该字符串是对称字符串!

                    Process finished with exit code 0

二、面试题

1、String,StringBuffer,StringBuilder之间的区别

(1)StringBuffer是线程同步安全的,数据安全,效率低
    StringBuilder不是线程同步安全的,数据不安全,效率高
(2)String的内容是不可变的,StringBuffer和StringBuilder是可变的
(3)StringBuffer中的方法是由synchronized关键字修饰的(后面多线程会说到)

2、StringBuffer和数组的区别

它们都可以被看作是一个容器,装一些数据;
但是呢,StringBuffer里面的数据都是一个一个的字符
数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据

3、探究探究String与StringBuffer分别作为方法的参数传递的区别

posted @ 2021-12-19 17:10  阿伟宝座  阅读(269)  评论(0)    收藏  举报