java12_String类

发布时间 2023-04-18 16:42:01作者: 猪无名

String类相关

(一)继承关系:

接口解释:

Serializable:说明String可以串行化,可以在网络传输。

Comparable:说明String可以进行比较。

CharSequence:字符序列接口。

Constable, ConstantDesc:暂时还没有碰到,遇见再说(挖坑:1)

部分源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {

    @Stable
    private final byte[] value;
                   
         ... ...          
    }
  • String类是一个final类,不能被继承。
  • 内部维护了一个被final修饰的字符数组(指向地址不可修改,但内部保存的值可以更改)。

(二)举例说明:

2.1 ==与equals()在String类中的使用情况

        String str1 = "123";
        String str2 = "123";

        String str3 = new String("123");
        String str4 = new String("123");

        System.out.println(str1 == str2 );
        System.out.println(str3 == str4 );
        System.out.println(str1 == str4.intern() );//intern():返回常量池中的地址
        System.out.println(str1.equals(str2) );
        System.out.println(str1.equals(str2) );

true
false
true
true
true

2.2 查看String类的构造器

//显示构造器个数
Class aclass = String.class;
Constructor[] declaredConstructors = aclass.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
    System.out.println("String 第"+num+" 个构造器"+declaredConstructor);
    num++;
}

String 第1 个构造器public java.lang.String(java.lang.StringBuffer)
String 第2 个构造器public java.lang.String(java.lang.StringBuilder)
String 第3 个构造器java.lang.String(char[],int,int,java.lang.Void)
String 第4 个构造器java.lang.String(java.lang.AbstractStringBuilder,java.lang.Void)
String 第5 个构造器public java.lang.String(byte[],int,int,java.nio.charset.Charset)
String 第6 个构造器public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
String 第7 个构造器public java.lang.String(byte[],java.nio.charset.Charset)
String 第8 个构造器public java.lang.String(byte[],int,int)
String 第9 个构造器public java.lang.String(byte[])
String 第10 个构造器java.lang.String(byte[],byte)
String 第11 个构造器public java.lang.String(char[],int,int)
String 第12 个构造器public java.lang.String(char[])
String 第13 个构造器public java.lang.String(java.lang.String)
String 第14 个构造器public java.lang.String()
String 第15 个构造器public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
String 第16 个构造器public java.lang.String(byte[],int)
String 第17 个构造器public java.lang.String(byte[],int,int,int)
String 第18 个构造器public java.lang.String(int[],int,int)

(三)字符串特性:

3.1 问创建了几个对象?

①:

String s1 = "hello";
s1 ="haha";

两个:

②:

String s2 = "hello" + "abc";

一个:

编译器会将其优化为s2 = "helloabc",只创建一个对象。

③:

String a ="hello";
String b ="abc";
String c = a+ b;

三个:

实现方式为:

  1. 创建a 指向常量池中的"hello";
  2. 创建b 指向常量池中的"abc";
  3. 创建一个StringBulider,执行它的append方法,将a与b的值,追加到它自身;
  4. 通过toString方法,让c指向字符串"helloabc"。

(四)String类常用方法:

String文档

变量和类型 方法 描述
boolean equals(Object anObject) 将此字符串与指定的对象进行比较。
boolean equalsIgnoreCase(String anotherString) 将此 String与另一个 String比较,忽略了大小写。
int length() 返回此字符串的长度。
int indexOf(String str) 返回指定子字符串第一次出现的字符串中的索引。
int lastIndexOf(int ch) 返回指定字符最后一次出现的字符串中的索引。
String substring(int beginIndex) substring(int beginIndex, int endIndex) 返回一个字符串,该字符串是此字符串的子字符串。
String toUpperCase() toLowerCase() 使用默认语言环境的规则将此 String所有字符转换为大写。 使用默认语言环境的规则将此 String所有字符转换为小写。
String concat(String str) 将指定的字符串连接到此字符串的末尾。
boolean contains(CharSequence s) 当且仅当此字符串包含指定的char值序列时,才返回true。
String replace(char oldChar, char newChar) 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
String[] split(String regex) 将此字符串拆分为给定 regular expression的匹配项 。
char[] toCharArray() 将此字符串转换为新的字符数组。
int compareTo(String anotherString) 按字典顺序比较两个字符串。(前大为正,后大为负,相等为零)
  • format——格式化字符串
    public static void main(String[] args) {
        String num1 ="123";
        int num2 = 456;
        double num3 = 789;
        char num4 ='A';
        String num5="num1:%s,num2:%d,num3:%.2f,num4:%c";
        System.out.println(String.format(num5,num1,num2,num3,num4));
    }
运行结果:
num1:123,num2:456,num3:789.00,num4:A

(五)StringBuffer与StringBuilder:

String类是保存字符串常量的。每次更新都需要开辟新的空间,效率很低。因此Java设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。

在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

img

StringBuffer:

  1. java.lang.StringBuffer代表可变长的字符序列,可以对字符串内容进行增删。
  2. 很多方法都和String相同,但是StringBuffer是可变长的。
  3. StringBuffer是一个容器。

部分源码:

 public final class StringBuffer
    extends AbstractStringBuilder
    implements Serializable, Comparable<StringBuffer>, CharSequence
{
     ... ...
 }
  • StringBuffer是一个final类,无法被继承。

  • 其中需要注意的是:jdk9将String的底层实现由char[]改成了byte[]

    在StringBuffer的抽象父类中:

    abstract class AbstractStringBuilder implements Appendable, CharSequence {
        /**
         * The value is used for character storage.
         */
        byte[] value;
    	... ...
    }
    

    大致可以理解为,我们在使用String的时候,内部存储的基本都是数字和字母,这些字符使用byte数组存储就足够了,没必要使用char数组来浪费存储空间,改成byte[]之后,简单的字符占有的空间会缩减,汉字还按原来的大小存储,有效减少空间浪费。

    具体介绍:

    [jdk9为何要将String的底层实现由char]改成了byte[]?

构造方法:

构造器 描述
StringBuffer() 构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。
StringBuffer(int capacity) 构造一个字符串缓冲区,其中没有字符和指定的初始容量。
StringBuffer(CharSequence seq) 构造一个字符串缓冲区,其中包含与指定的 CharSequence相同的字符。
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区,初始容量str.length()+16。

常用方法:

方法 方法描述
1 public StringBuffer append(String s) 将指定的字符串追加到此字符序列。
2 public StringBuffer reverse() 将此字符序列用其反转形式取代。
3 public delete(int start, int end) 移除此序列的子字符串中的字符。
4 public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。
5 insert(int offset, String str) 将 str 参数的字符串插入此序列中。
6 replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。
7 int indexOf(String str)返回第一次出现的指定子字符串在该字符串中的索引。

相互转换:

String转StringBuffer StringBuffer转String
new StringBuffer(String str) new String(StringBuffer sbf)
sbf.append(String str); String str = sbf.toString();

StringBuilder:

​ 一个可变的字符序列。 此类提供与StringBuffer兼容的API,但不保证同步。 此类设计用作StringBuffer替代品,用于单个线程使用字符串缓冲区的位置(通常情况下)。 在可能的情况下,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。
​ StringBuilder上的主要操作是append和insert方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中。 append方法始终在构建器的末尾添加这些字符; insert方法在指定点添加字符。

SringBuffer 与StringBuilder的扩容机制:

两者一致,以StringBuffer为例。

无参构造
有参构造

无参有参,它们初始化出来的StringBuffer实例的扩容机制一致,都是 原来容量*2+2 。





文理双修:

4.《鹧鸪天 送人》宋朝·辛弃疾
唱彻《阳关》泪未干,功名馀事且加餐。浮天水送无穷树,带雨云埋一半山。

今古恨,几千般,只应离合是悲欢?江头未是风波恶,别有人间行路难!

译文:

唱完了《阳关》曲泪却未干,视功名为馀事(志不在功名)而劝加餐。水天相连,好像将两岸的树木送向无穷的远方,乌云挟带着雨水,把重重的高山掩埋了一半。

古往今来使人愤恨的事情,何止千件万般,难道只有离别使人悲伤,聚会才使人欢颜?江头风高浪急,还不是十分险恶,而人间行路却是更艰难。