String类、StringBuffer类、StringBuilder类

目录

一、String类

1.1 String类概述

1.2 String类的特点

1.3 String类的构造方法

1.4创建字符串对象两种方式的区别

2.5字符串的比较

二、StringBuffer类

三、StringBuilder类


一、String类

1.1 String类概述

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

1.2 String类的特点

  • String是一个final类,代表可变的字符序列
  • 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
  • String对象的字符内容是存储在一个字符数组value[]中的。

1.3 String类的构造方法

   常用的构造方法

    构造方法 

 

public class StringTest02 {
    public static void main(String[] args) {
        String s1 = "abc"; //引用abc字符串地址
        System.out.println(s1);//abc

        String s2 = new String();//创建一个空字符串
        System.out.println(s2);//

        String s3 = new String("xyz");//引用堆中的xyz字符串地址
        System.out.println(s3);//xyz

        byte[] bytes1 = {97,98,99,100,101};//byte的取值范围:-128 到 127
        String s4 = new String(bytes1);//把字节整数数组按照ASCII码表解析成字符串
        System.out.println(s4);//abcde

        byte[] bytes2 = {97,98,99,100,101,102};
        //bytes - 要解码为字符的 byte,offset - 要解码的第-个 byte 的索引,length -要解码的 byte数
        String s5 = new String(bytes2,2,2);//对bytes2数组从索引2开始解析2个长度
        System.out.println(s5);//cd

        char[] char1={'a','b','c','d','e'};
        String s6 = new String(char1);
        System.out.println(s6);//abcde

        char[] char2={'a','b','c','d','e'};
        String s7 = new String(char2);
        System.out.println(s7);//abcde

    }
}

方法

public class StringTest03 {
    public static void main(String[] args) {
        //方法调用三步 1.调用方法 对象.方法名(); 2.传入参数 3.接受方法的返回值
        String s1 = "abcdef";
        char c1 = s1.charAt(2);//获取字符串中指定索引位置的字符
        System.out.println(c1);//c

        String s2 = s1.concat("xzy");//将指定字符串连接到此字符串的结尾
        System.out.println(s2);//abcdefxzy

        boolean b1 = s1.contains("x");//当此字符串包含指定的值时,返回 true。
        boolean b2 = s2.contains("x");
        System.out.println(b1);//false
        System.out.println(b2);//true

        String s3 = "zhangsan.txt";
        boolean b3 = s3.endsWith(".txt");//判断此字符串是否以指定的后缀结束 一般用来做文件名的后缀的判断
        System.out.println(b3);//true

        byte[] bytes1 = s1.getBytes();//把字符串按照ASCII解析成byte数组 bytes1={97,98,99,100,101,102]
        

        String s4 = "abcdefghijklmnopq";
        int i1 = s4.indexOf('d');//返回指定字符在此字符串中第一次出现处的索引
        System.out.println(i1);//3

        int i2 = s4.indexOf("def");// 返回指定子字符串在此字符串中第一次出现处的索引
        System.out.println(i2);//3

        int i3 = s4.lastIndexOf("n");//返回指定子字符串在此字符串中最右边出现处的索引
        System.out.println(i3);//13

        String s5="bad weather fuck the weather";
        String s6 = s5.replace( "fuck","***");//  返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
        System.out.println(s6) ;//bad weather *** the weather

        String s7="app/code/java/day19";
        String[] split = s7.split( "/");//根据给定正则表达式的匹配拆分此字符串
        for (String s : split) {
            System.out.println(s);  //app
                                    //code
                                    //java
                                    //day19
        }

        String s8="abcdefgh";//返回一个新字符串,它是此字符串的一个子字符串
        String s9 = s8.substring(2,5);//从索引2开始截取不包括5
        System.out.println(s9);//cde

        String s10 = "    螺蛳粉      ";
        String s11 = s10.trim();//返回字符串的副本,忽略前导空白和尾部空白
        System.out.println(s11);//螺蛳粉 

        String s12 = "sccnaJNNCJLjsso";
        String s13 = s12.toLowerCase();//使用默认语言环境的规则将此 String 中的所有字符都转换为小写
        System.out.println(s13);//sccnajnncjljsso

        String s14 = s12.toUpperCase();//使用默认语言环境的规则将此 String 中的所有字符都转换为大写
        System.out.println(s14);//SCCNAJNNCJLJSSO


    }
}

1.4创建字符串对象两种方式的区别

  • 通过构造方法创建

    通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同。

  • 直接赋值方式创建

    以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护。

2.5字符串的比较

2.5.1  ==号的作用

  • 比较基本数据类型:比较的是具体的值

  • 比较引用数据类型:比较的是对象地址值

2.5.2  equals方法的作用

方法介绍

public boolean equals(String s)     比较两个字符串内容是否相同、区分大小写

示例代码:

    public static void main(String[] args) {
        //构造方法的方式得到对象
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);

        //直接赋值的方式得到对象
        String s3 = "abc";
        String s4 = "abc";

        //比较字符串对象地址是否相同
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s3 == s4);
        System.out.println("--------");

        //比较字符串内容是否相同
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println(s3.equals(s4));
    }

 运行如下:

二、StringBuffer类

  • java.lang.StringBuffer代表可变的字符序列JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
  • 很多方法与String相同。
  • 作为参数传递时,方法内部可以改变值。

  • StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:
  • StringBuffer():初始容量为16的字符串缓冲区
  • StringBuffer(int size):构造指定容量的字符串缓冲区
  • StringBuffer(String str):将内容初始化为指定字符串内容
常用方法
StringBuffer append (xxx) :提供了很多的 append() 方法,用于进行字符串拼接
StringBuffer delete (int start,int end) :删除指定位置的内容
StringBuffer replace (int start, int end, String str) :把 [start,end) 位置替换为 str
StringBuffer insert (int offset, xxx) :在指定位置插入 xxx
StringBuffer reverse () :把当前字符序列逆转
public int indexOf (String str)
public String substring (int start,int end)
public int length ()
public char charAt (int n )
public void setCharAt (int n ,char ch)

三、StringBuilder类

  • StringBuilder StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样。
package com.hp.test1;

/**
 * String类定义出来的字符串具有不变性          一般不做经常变化字符串的使用,
 * StringBuffer 线程安全的可变字符串序列
 * StringBuilder 是线程不安全的可变字符序列
 *
 *      StringBuffer和 StringBuilder都是操作的字符串本身
 */
public class StringBuilderTest {
    public static void main(String[] args) {
    //如下代码会在内存中出现三个字符串,HeLLo、WorLd、HeLLoWorLd
    // String类在做字符串值变化的时候,非常浪费内存
        String s = "Hello";
        s += "World";
        System.out.println(s);

        StringBuilder sb = new StringBuilder("Hello");
        sb.append("world");//对字符串后面进行追加内容
        System.out.println(sb);
        sb.insert(4,"x");//在字符串指定索引位置插入一个新的字符串
        System.out.println(sb);

        StringBuilder sb2 = sb.reverse();//字符串的倒叙输出,反转
        System.out.println(sb2);

        StringBuilder sb4 = new StringBuilder("Helloyiyangqianxi");
        StringBuilder sb3 = sb4.delete(0,5);//删除起始位置(含)到结尾位置(不含)之间的字符串
        System.out.println(sb3);

        sb4.setCharAt(7,'w');//将第 i 个代码单元设置为 c(可以理解为替换)
        System.out.println(sb4);

    }
}

运行结果如下: 

 自己可以动动小手把方法都试一下

面试题:

String、StringBuilder、StringBuffer的区别?

相同点:

  • 都可以储存和操作字符串
  • 都使用 final修饰,不能被继承
  • 提供的 API相似

区别:

  • String 是只读字符串,String 对象内容是不能被改变的
  • StringBuffer 和 StringBuilder 的字符串对象可以对字符串内容进行修改,在修改后的内存地址不会发生改变
  • StringBuilder 线程不安全; StringBuffer 线程安全
  • 方法体内没有对字符串的并发操作,且存在大量字符串拼接操作,建议使用 StringBuilder,效率较高。

猜你喜欢

转载自blog.csdn.net/weixin_67224308/article/details/128103782
今日推荐