Java高级编程--常用类之字符串相关类String、StringBuffer、StringBuilder

本文详细探讨了Java中的String类,包括其特性、不变性、创建方式以及常见操作。同时,文章介绍了字符串与不同类型数据的转换,如基本数据类型、字符数组和字节数组。此外,还分析了StringBuffer和StringBuilder类,讨论了它们的用法、执行效率以及与String的区别。最后,文章通过实例展示了字符串操作可能导致的效率问题及其解决方案。
摘要由CSDN通过智能技术生成

Java提供了丰富的API给使用者方便其快捷高效的进行开发工作,本篇博客将介绍常用类中字符串相关类的具体使用方法,包括String、StringBuffer、StringBuilder。


目录:

☍ String类

☍ String与其他类型数据的转换

☍ StringBuffer与StringBuilder


☍ String类

▴ String的特性

String类:代表 字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。

☄ String是一个final类,代表不可变的字符序列(String的不可变性),不可被继承。

☄ 字符串是常量,用双引号""引起来表示。它们的值在创建之后不能更改,即调用方法对原字符串的操作使字符串改变会创建新的字符串而不会影响到原字符串本身。

☄ String对象的字符内容底层是存储在一个字符数组final char value[]中的。

☄ String实现了Serializable接口:表示字符串是支持序列化的。

☄ String实现了Comparable接口:表示字符串可以比较大小。

☄ 过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中;通过new String()方式创建字符串,此时内容存储在堆空间中。

☄ 过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中;通过new String()方式创建字符串,此时内容存储在堆空间中。

String底层代码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
   
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
    ....
}

▴ String对象的创建

字面量的方式赋值

说明:此时字符串数据声明在方法区中的字符串常量池中

创建对象的方式赋值(调用不同String的构造器)

说明:此时字符串变量保存的是地址值,是数据在堆空间开辟内存空间后对应的地址值

☃ 空参构造器new String(); ---- 本质上为:this.value = new char[0];

☃ String字符串参数构造器new String(String original); ---- 本质上为:this.value = original.value;

☃ char字符数组参数构造器new String(String original); ---- 本质上为:this.value = Arrays.copyOf(value, value.length);

public void testString2(){
   
        //1、字面量的方式赋值
        String st1 = "hello world";
        //2、创建对象的方式赋值(不同String的构造器)
        /*2-1:空参构造器new String();
               本质上为this.value = new char[0];  定义长度为0的字符数组
        */
        String st2 = new String();
        System.out.println("new String():" + st2 + "length:" + st2.length()); //new String():length:0

        /*2-2:String字符串参数构造器new String(String original);
              本质上为this.value = original.value
        */
        String st3 = new String("serializable");  //
        System.out.println("new String(String original):" + st3 + " length:"+ st3.length());  //new String(String original):serializable length:12

        /*2-3:char字符数组参数构造器new String(String original);
        *     本质上为this.value = Arrays.copyOf(value,value.length);
        */
        String st4 = new String(new char[]{
   's', 'y', 'n', 'c', 'h', 'r', 'o', 'n', 'i', 'z', 'e', 'd'});
        System.out.println("new String(String original):" + st4 + " length:"+ st4.length());   //new String(String original):synchronized length:12

        //对比字面量赋值方式和String构造器方式实例化String的不同
        String t1 = "Java";
        String t2 = "Java";
        String t3 = new String("Java");
        String t4 = new String("Java");      //
        System.out.println("t1 == t2:" + (t1 == t2));   //true
        System.out.println("t3 == t4:" + (t3 == t4));   //false
        System.out.println("t1 == t3:" + (t1 == t3));   //false

        Person p1 = new Person(11,"Tom");
        Person p2 = new Person(11,"Tom");
        System.out.println("p1==p2:" + (p1 == p2));  //false   对象存储在堆中,开辟的内存空间地址不同
        System.out.println("p1.name==p2.name:" + (p1.name == p2.name));   //true,Person对象中name是以字面量的方式定义的,所以存储在方法区的字符串常量池中
}

class Person{
   
    int age;
    String name;

    public Person(int age, String name) {
   
        this.age = age;
        this.name = name;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值