String类

1.String类

  1. String是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。
  2. Java程序中的所有字符串文字(例如"abcdefg" )。都被实为此类的对象。
  3. 字符串不可变,它们的值在创建后不能被更改。虽然 String 的值是不可变的,但是它们可以被共享
  4. 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

1.1创建String对象的两种方式

  1. 直接赋值:

    String name = "张三";
    
  2. 常用的构造方法

    构造方法说明
    public String()创建空白字符串,不含任何内容
    public String(String original)根据传入的字符串,创建字符串对象
    public string(char[] chs)根据字符数组,创建字符串对象
    public string(byte[] chs )根据字节数组,创建字符串对象
public class StringDemo1 {
    public static void main(String[] args) {
        // 1.使用直接赋值的方式获取一个字符串对象
        String s1 = "abc";
        System.out.println(s1);

        // 2.使用new的方式来获取一个字符串对象
        // 空参构造:可以获取一个空白的字符串对象
        String s2 = new String();
        System.out.println(s2);

        // 传递一个字符串,根据传递的字符串内容再创建- -个新的字符串对象
        String s3 = new String("abc");
        System.out.println(s3);

        // 传递一个字符数组,根据字符数组的内容再创建- - 个新的字符串对象
        // 需求:我要修改字符串的内容。abcQbc//abc -->{'a','b','c'} -->{'Q','b','c'} --> "Qbc"
        char[] chs = {'a', 'b', 'd'};
        String s4 = new String(chs);
        System.out.println(s4);// abcd

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

1.2String类的内存模型

当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。

  • 不存在:创建新的
  • 存在:复用
public class StringDemo {
    public static void main(String[ ] args) {
        String s1 = "abc";
        String s2 = "abc";
    }
}
// s1与s2指向同一个地址

1.3String类中字符串的比较

1.3.1==号的作用

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

    int a = 10;
    int b = 20;
    System.out.println(a == b);//false
    
  • 引用数据类型:引用数据类型比较的是地址值

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

1.3.2equals方法的作用

    1. 方法介绍
    public boolean equals(String s)     
    //比较两个字符串内容是否相同、区分大小写
    
  • 示例代码

    public class StringDemo02 {
      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));
      }
    }
    
    1. 方法介绍
    public boolean equalslgnoreCase(String s)     //忽略大小写的比较
    

1.4遍历字符串

  • 常用的构造类型

    构造方法构造说明
    public char charAt(int index)根据索引返回字符
    public int length()返回此字符串的长
    • 成员方法
    方法名说明
    String substring(int beginIndex, int endIndex) 截取注意点:包头不包尾,包左不包右 。只有返回值才是截取的小串
    String substring(int beginIndex)截取到末尾
    String replace(旧值,新值) 替换注意点:只有返回值才是替换之后的结果

1.5StringBuilder

1.5.1概述

StringBuilder可以看成是一个容器, 创建之后里面的内容是可变的。当我们在拼接字符串和反转字符串的时候会使用到

1.5.2作用

提高字符串的操作效率

1.5.3构造方法

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

1.5.4常用方法

方法名说明
public StringBuilder append (任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()返回长度(字符出现的个数)
public String toString()通过toString()就可以实现把StringBuilder转换为String

1.5.5基本使用

public class StringBuilderDemo {
    public static void main(String[] args) {
        // 使用StringBuilder的场景:
        // 1.字符串的拼接
        // 2.字符串的反转
        
        //1.创建对象
        StringBuilder sb = new StringBuilder("abc");

        //2.添加元素
        /*sb.append(1);
        sb.append(2.3);
        sb.append(true);*/

        //反转
        sb.reverse();
        
        //获取长度
        int len = sb.length();
        System.out.println(len);
        
        //打印
        //普及:
        //因为StringBuilder是Java已经写好的类
        //java在底层对他做了一些特殊处理。
        //打印对象不是地址值而是属性值。
        System.out.println(sb);
    }
}

1.5.6链式编程

public class StringBuilderDemo4 {
    public static void main(String[] args) {
        //链式编程:
		//当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

        //1.创建对象
        StringBuilder sb = new StringBuilder();

        //2.添加字符串
        sb.append("aaa").append("bbb").append("ccc").append("ddd");

        System.out.println(sb);//aaabbbcccddd

        //3.再把StringBuilder变回字符串
        String str = sb.toString();
        System.out.println(str);//aaabbbcccddd

    }
}

1.6StringJoiner

1.6.1概述

  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
  • 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
  • JDK8出现的

1.6.2构造方法

构造方法构造说明
public StringJoiner (间隔符号)创建一个StringJoiner对象, 指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号)创建一个StringJoiner对象, 指定拼接时的间隔符号、开始符号、结束符号

1.6.3成员方法

方法名说明
public StringJoiner add (添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串(该字符串就是拼接之后的结果)

1.7小结

  1. String
    • 表示字符串的类,定义了很多操作字符串的方法
  2. StringBuilder
    • 一个可变的操作字符串的容器。
    • 可以高效的拼接字符串,还可以将容器里面的内容反转。
  3. StringJoiner
    • JDK8出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。
    • 在拼接的时候,可以指定间隔符号,开始符号,结束符号。

1.8字符串小拓展

1.8.1字符串存储的内存原理

String s = “abc”;直接赋值

特点:

此时字符串abc是存在字符串常量池中的。

先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。

如果没有abc,才会创建一个新的。

所以,直接赋值的方式,代码简单,而且节约内存。

1.8.2new出来的字符串

看到new关键字,一定是在堆里面开辟了一个小空间。

String s1 = new String(“abc”);

String s2 = “abc”;

s1记录的是new出来的,在堆里面的地址值。

s2是直接赋值的,所以记录的是字符串常量池中的地址值。

1.8.3==号比较的到底是什么?

  • 如果比较的是基本数据类型:比的是具体的数值是否相等。

  • 如果比较的是引用数据类型:比的是地址值是否相等。

结论:==只能用于比较基本数据类型。不能比较引用数据类型。

1.8.4StringBuilder源码分析

  • 默认创建一个长度为16的字节数组
  • 添加的内容长度小于16,直接存
  • 添加的内容大于16会扩容(原来的容量*2+2)
  • 如果扩容之后还不够, 以实际长度为准
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值