String 与StringBuilder 的学习

概述【理解】

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的

StringBuilder类和String类的区别【理解】

  • String类:内容是不可变

  • StringBuilder类:内容是可变

String类的特点【理解】

  • 字符串不可变,它们的值在创建后不能被更改

  • 虽然 String 的值是不可变的,但是它们可以被共享

  • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

String类的构造方法【记忆】

  常用的构造方法

方法说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(byte[] bys)根据字节数组的内容,来创建字符串对象
String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc

StringBuilder类的构造方法【记忆】

  常用的构造方法

方法说明
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

 String的常用方法

charAt(int index)                      返回指定索引处的char值

length()                                    返回此字符串的长度

equals(Object anObject)         将此字符串与指定对象进行比较

equalsIgnoreCase(String anotherString)           将此String与另一个String比较,忽略案例注意事项(如忽略大小写)

indexOf(String str)                  返回指定子字符串第一次出现在字符串内的索引

startsWith(String prefix)         测试此字符串是否以指定的前缀开头

substring(int beginIndex)       返回一个字符串,该字符串时此字符串的子字符串

valueOf(int i)                          返回int参数的字符串表示形式

toLowerCase()                       将所有字符转换为小写

StringBuilder类常用方法

添加和反转方法

方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()返回相反的字符序列

StringBuilder和String相互转换

  •      StringBuilder转换为String

public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String

  •     String转换为StringBuilder

public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

案例1:随机数类Random相关API、可变的字符序列StringBuilder相关API

注:使用String的equalsIgnoreCase方法比较生成的验证码和用户输入,因为不区分大小写。

在登录注册页面中,除了用户名和密码外,通常也会包含验证码。验证码是用来区分用户是计算机还是人,防止恶意破解密码、刷票、灌水等行为。在判断验证码时一般不区分大小写。请编写程序模拟验证码的判断过程,如果输入正确,给出提示,结束程序。如果输入错误,给出提示,验证码刷新,重新输入,直至正确为止。

生成4位随机验证码的功能在之前的题目中已经完成,可以直接使用。《定义方法,获取一个包含4个字符的验证码,每一位字符是随机选择的字母和数字,可包含a-z,A-Z,0-9。》

运行效果如下:

生成的验证码为:BkhD
请输入验证码
abcd
输入错误,请重新输入...
生成的验证码为:n1wX
请输入验证码
aaaa
输入错误,请重新输入...
生成的验证码为:Fm1a
请输入验证码
fm1a
输入正确

package Test.Test2;

import java.util.Random;
import java.util.Scanner;

public class Verification {
    //主方法
    public static void main(String[] args) {
        //键盘录入对象
        Scanner sc = new Scanner(System.in);
        while(true){  //不清楚输入多少次,定义死循环,输入正确时跳出循环即可
            String code = getRandomCode();
            System.out.println("生成的验证码为:" + code);

            System.out.println("请输入验证码");
            String s = sc.nextLine();

            //使用String的equalsIgnoreCase方法比较生成的验证码和用户输入,因为不区分大小写
            if(s.equalsIgnoreCase(code)) {  //不区分大小写比较是否相等
                System.out.println("输入正确");
                break;//跳出循环,结束程序
            } else {
                System.out.println("输入错误,请重新输入...");
            }

        }


    }

    //定义获取验证码方法
    public static String getRandomCode() {
        //定义StringBuilder对象,将可选择的字符都放到StringBuilder对象中
        StringBuilder sb = new StringBuilder();
        //定义循环从a-z,使用StringBuilder的append方法依次添加所有小写字母
        for (char ch = 'a'; ch <= 'z'; ch++) {
            sb.append(ch);
        }
        //定义循环从A-Z,使用StringBuilder的append方法依次添加所有大写字母
        for (char ch = 'A'; ch <= 'Z'; ch++) {
            sb.append(ch);
        }
        //定义循环从0-9,使用StringBuilder的append方法依次添加所有数字字符
        for (char ch = '0'; ch <= '9'; ch++) {
            sb.append(ch);
        }

        //创建Random对象
        Random r = new Random();
        //定义一个空字符串用于保存验证码
        String code = "";

        //定义一个执行4次的循环,用于获取4个字符
        for (int i = 0; i < 4; i++) {
            //在循环中,使用Random的nextInt方法,随机获取一个从索引0(包含)到字符串的长度(不包含)的索引
            int index = r.nextInt(sb.length());
            //使用StringBuilder的charAt方法,获取该索引上的字符,将其拼接到验证码字符串中
            code += sb.charAt(index);
        }
        return code;
    }



}


案例2:字符串的反转功能,判断是否相等功能

注:将字符串转换为StringBuilder类型,调用StringBuilder的reverse()方法将字符串反转。

请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。例如:"abcba"、"上海自来水来自海上"均为对称字符串。

package Test.Test5;

public class Test {
    public static void main(String[] args) {
        String line = "上海自来水来自海上";
        System.out.println(isSym(line));

    }


    public static boolean isSym(String line){
        //为了程序的健壮,如果传递的是空值,返回false(一开始没想到这个)
        if(line == null){
            return false;
        }
        //将String 转换为 StringBuilder
        StringBuilder sb = new StringBuilder(line);
        //反转, 再转成String
        String reLine = sb.reverse().toString();

        //比较反转前的字符串与反转后的字符串是否相等
        //相等返回true,不相等返回false
        return reLine.equals(line);


    }
}

案例3:升级版的字符串的拼接

注:拼接字符串必然涉及到频繁改变,该采用可变的字符序列StringBuilder比较好;

       StringBuilder和String相互转换、append()方法的使用。

定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。

要求:

1、如果传递的参数为空,返回null

2、如果传递的数组元素个数为0,返回[]

3、如果数组为int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

//升级版
package Test.Test7;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        System.out.println(arrayToString(arr));

    }

    //字符串拼接
    public static String arrayToString(int[] arr) {
        //健壮性判断(避免空指针异常)
        if(arr == null){
            return null;
        }

        //创建StringBuilder对象
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for(int i = 0; i< arr.length; i++){
            if(i == arr.length-1){
                sb.append(arr[i]);
            }else {
                sb.append(arr[i] + ",");
            }
        }
        sb.append("]");
        //将StringBuilder对象转化为String
        return sb.toString();


    }
}

案例4:String类API的灵活使用

在String类的API中,有如下两个方法:

// 查找参数字符串str在调用方法的字符串中第一次出现的索引,如果不存在,返回-1
public int indexOf(String str)
​
// 截取字符串,从索引beginIndex(包含)开始到字符串的结尾
public String substring(int beginIndex)

请仔细阅读API中这两个方法的解释,完成如下需求。

现有如下文本:"Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的"。请编写程序,统计该文本中"Java"一词出现的次数。

思路:

1、要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。

2、如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置再加上子串的长度。

3、以此类推,通过循环完成查找,如果找不到就是-1,每次找到用计数器记录次数。

package Test.Test8;

public class Test {
    public static void main(String[] args) {
        String str = "Java语言是面向对象的,Java语言是健壮的,Java语言是安全的,Java是高性能的,Java语言是跨平台的";
        String tar = "Java";//目标子串
        //调用方法并输出
        System.out.println(Search(str,tar));

    }

    //定义统计字符串出现次数的方法
    public static int Search(String str,String tar){
        //定义统计变量表示次数
        int count = 0;
        //定义索引变量,表示每次找到子串出现的索引
        int index = -1;
        //定义循环,判断条件为在字符串中找到了目标子串
        while((index = str.indexOf(tar)) != -1){
            count++;
            //把查找过的部分剪切掉,从找到的索引+子串长度的位置开始截取
            str = str.substring(index + tar.length());

        }
        return count;
    }
}

String、StringBuffer、StringBuilder的区别:

StringStringBufferStringBuilder
执行速度最差其次最高
线程安全线程安全线程安全线程不安全
使用场景少量字符串操作多线程环境下的大量操作单线程环境下的大量操作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值