字符串基础(JAVA笔记第十九期)

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解

选中代码后按ctrl+ait+t可以选择语句体包围这块代码

String类

String类表示字符串,java中所有的字符串文字都为此类的对象
字符串的内容是不会发生改变的,它的对象在创建后不能被更改!!!

String name = "张三";
name = "李四";

第二行代码是将李四代替了张三
如果拼接了两个字符串,则会产生一个新的字符串
由于String类在lang包里面,所以使用的时候不用导包

创建String对象的两种方式

  1. 直接赋值
String name = "张三";
  1. 使用构造方法来创建字符串
    以下为部分构造方法
    在这里插入图片描述
    以下为其使用方式及其应用场景
    public static void main(String[] args) {
        //第一种:使用直接赋值的方式来获取一个字符串对象
        String string1 = "abc";
        System.out.println(string1);
        //当使用双引号直接赋值的时候,系统会检查该字符串在串池中是否存在
        //不存在则创建新的;存在则复用

        //第二种:使用new的方式来获取一个字符串对象

        //比如空参构造就可以获得一个空白的字符串对象
        //没什么用
        String string2 = new String();
        System.out.println("→"+string2+"←");// “”

        //也可以传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
        //没什么用
        String string3 = new String("helloWorld");
        System.out.println(string3);

        //也可以传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
        char[] arr = {'a','b','c','d'};
        String string4 = new String(arr);
        System.out.println(string4);
        //作用:拼接字符数组的字符
        //应用场景:我们可以将一个字符串存储到字符数组中
        //通过改变字符数组的内容就可以间接改变字符串的内容


        //也可以传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
        byte[] bytes = new byte[]{97,98,99,100};
        String string5 = new String(bytes);
        System.out.println(string5);
        //作用:将字节数组中的数字经过ASCII码表转换成字符后在进行拼接
        //应用场景:以后在网络当中传输的数据其实都是字节信息
        //我们一般要把字节信息进行转换,转换成字符串,此时就要用到这个构造了
    }

字符串的比较

        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1==s2);

输出false
原因如下

如果==号比较的是基本数据类型,则实质上比较的是两个元素的数据值

如果==号比较的是引用数据类型,则实质上比较的是两个元素的地址值
而上述的s2是new出来的新对象,因此其地址值自然与s1不同

又如下面这种情况

        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1==s2);

输出true

这是因为创建s1对象的时候将abc这一个字符串新增加在了串池里面,由于s2的字符串与s1一致,所以s2的地址值也就是s1的地址值,即abc的地址值

又如下面这种情况

        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(s1==s2);

输出false

这是因为s1、s2都是通过构造方法创建的,两个对象都是new出来的,因此二者对应的abc都存储在堆内存里,并且二者的地址值不停
只要是new出来的,都是在堆内存里开辟了一个小空间

要想比较字符串的内容,就必须要使用String里面的方法
如果只对字符串的内容进行比较的话我们可以使用以下方法

equals()方法

完全一样结果才为true,否则为false

格式

boolean 变量 = 字符串对象1.equals(字符串对象2);

equalsIgnoreCase()方法

忽略大小写的比较

boolean flag2 = s1.equalsIgnoreCase(s2);

字符串的遍历

字符串的遍历需要用到两个方法

charAt()方法

作用为根据索引返回字符

格式

char 变量 = 字符串.charAt(字符串的索引);

length()方法

返回此字符串的长度

格式

int 变量 = 字符串.length();

注意
.
数组的长度: 数组.length
字符串的长度: 字符串.length()

举例

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入字符串");
        String string = scanner.next();

        //遍历
        for (int i = 0; i < string.length(); i++) {
            System.out.println(string.charAt(i));
        }
    }
}

这样就得到了字符串的每一个字符
通过遍历我们便可以对字符串进行统计字符次数、、字符串的拼接、字符串的反转等操作

字符串的截取

substring()方法

作用为根据索引截取字符串的一部分

格式

String 变量 = 字符串.substring(索引1,索引2);
//索引2可以不写,
//此时就是截取从索引1对应字符开始到最后一个字符

substring,翻译为子字符串

注意
包头不包尾、包左不包右
只有返回值才是截取的字符串
该方法并不会改变原来的字符串

字符转换为数字

利用ASCII码表进行转换

字符串的替换

replace()方法

格式

String 变量 = 字符串.replace(旧值,新值);

注意
只有返回值才是截取的字符串
该方法并不会改变原来的字符串

字符串的检测

contains() 方法

contains() 方法用于判断字符串中是否包含指定的字符或字符串。

格式

boolean 变量 = 字符串.contains(要判断的字符或字符串);

StringBuilder类

StringBuilder类是用来存储一串字符的容器

与String类不同的是,StringBuilder类对象的内容是可以更改的,可以看成一个长度可以变化的字符串(但不是字符串,因为字符串只要创建就不能改变了)
这个特点提高了字符串的操作效率

直接打印StringBuilder类输出的是对象的属性值

举例

        String s1 = "aaa";
        String s2 = "bbb";
        String s3 = "ccc";
        String s4 = "ddd";
        
        String s = s1 + s2 + s3 + s4;

如果这样拼接字符串的话每次进行一次拼接操作(即“+”)都会产生一个新的字符串
这种方式非常影响内存以及运行效率
而使用StringBuilder类则可以减少内存使用和提高运行效率

StringBuilder构造方法

  1. 空参构造(创建一个空白可变字符串,不含有任何内容)
    格式
        StringBuilder 变量 =new  StringBuilder();
  1. 有参构造(根据字符串的内容,来创建可变字符串的对象)
StringBuilder 变量 = new StringBuilder(参数);

StringBuilder成员方法

append()成员方法

在StringBuilder类对象后面添加相应的内容

格式

StringBuilder类变量.append(添加的内容);

也可以一次性添加多个内容

StringBuilder类变量.append("A").append(true).append(2).append(3.0);

reverse()成员方法

反转对象

格式

StringBuilder类变量.reverse();

length()成员方法

获取长度

格式

int 变量 = StringBuilder类变量.length();

toString()成员方法

返回一个字符串

格式

String 变量 =StringBuilder类变量.toString();

扩展:链式编程

内容:
当我们在调用一个方法时,不需要使用变量来接收方法的结果,可以继续调用其他方法
即依赖前一个方法的结果再去调用后面的方法

下面的代码即为一种链式编程

    public static void main(String[] args) {
    
    int len = getString().substring(1).replace("b","B").length();
    
        System.out.println(len);
    }
    
    public static String getString(){
        return "abc";
    }

这也是一种链式编程

StringBuilder类变量.append("A").append(true).append(2).append(3.0);

使用 StringBuilder类的时机及例题

  1. 字符串的拼接
  2. 字符串的反转

例题1

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        //键盘输入一个字符串,判断该字符串是否是对称字符串,并在控制台打印是或不是
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个字符串");

        String string = scanner.next();

        //反转字符串
        String string1 = new  StringBuilder().append(string).reverse().toString();
        if (string.equals(string1)){
            System.out.println("是");
        }
        else {
            System.out.println("不是");
        }
    }
}

例题2

package study.jichu3.zifuchuan.StringBuilder;

public class Test3 {
    public static void main(String[] args) {
        //定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回
        //调用该方法,并在控制台输出结果
        //例如
        //数组为 int[]arr = {1,2,3,4,5};
        //输出结果为:[1,2,3,4,5]
        int[]arr = new int[]{1,2,3,4,5};
        
        String string = arrToString(arr);
        
        System.out.println(string);
    }
    
    
    
    public static String arrToString(int[]arr){
        
        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]).append(",");
            }
        }
        
        sb.append("]");
        
        return sb.toString();
    }
}

StringJoiner类

StringBuilder类是用来存储一串字符的容器

与String类不同的是,StringBuilder类对象的内容是可以更改的,可以看成一个长度可以变化的字符串(但不是字符串,因为字符串只要创建就不能改变了)
这个特点提高了字符串的操作效率

StringJoiner构造方法

  1. 有参构造(创建一个StringJoiner对象,指定拼接时的间隔符号)
    格式
StringJoiner变量 =new  StringJoiner(间隔符号);

举例

        StringJoiner sj = new StringJoiner("---");     
        sj.add("aaa").add("bbb").add("ccc");
        System.out.println(sj);

输出结果为

aaa---bbb---ccc
  1. 有参构造(创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号)
StringJoiner变量 = new StringJoiner(间隔符号,开始符号,结束符号);

举例

        StringJoiner sj = new StringJoiner("---","[","]");
        sj.add("aaa").add("bbb").add("ccc");
        System.out.println(sj);

输出结果为

[aaa---bbb---ccc]

StringJoiner成员方法

add()成员方法

添加数据并返回对象本身

格式

StringJoiner类变量.add(添加的内容);

也可以一次性添加多个内容

StringJoiner类变量.add("A").add("true").add("2").add("3.0");

length()成员方法

获取长度

格式

int 变量 = StringJoiner类变量.length();

toString()成员方法

返回一个字符串

格式

String 变量 =StringJoiner类变量.toString();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值