字符串

文章内容输出来源:拉勾教育大数据开发高薪训练营 

一、String类

1.1 String类的概念:

a. java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描述,如:"abc"

b. 该类由final关键字修饰,表示该类不能被继承,不能改变。

c. 从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间。

d. 该类描述的字符串内容是个常量不可更改,因此可以被共享使用

      比如:String  str  =  “123”;

                 str  =  “abc”;   // "123", "abc" 都是不可改变的常量

      str首先保存的是“123”这个字符串的地址,因此str指向“123”这个字符串;

      后面str保存的是“abc”这个字符串的地址,因此str改变了原来的指向,变成了指向“123”,但原来“123”的值并没有改变;

String的常考点: 

public class StringExamTest {

    public static void main(String[] args) {

        // 1.请问下面的代码会创建几个对象?分别存放在什么地方?
        //String str1 = "hello";  // 1个对象  存放在常量池中
        //String str1 = new String("helo"); // 2个对象  1个在常量池中,1个在堆区

        // 2.常量池和堆区对象的比较
        String str1 = "hello";  // 常量池
        String str2 = "hello";  // 常量池
        String str3 = new String("hello"); // 堆区
        String str4 = new String("hello"); // 堆区

        System.out.println(str1 == str2);       // 比较地址  true
        System.out.println(str1.equals(str2));  // 比较内容  true
        System.out.println(str3 == str4);       // 比较地址  false
        System.out.println(str3.equals(str4));  // 比较内容  true
        System.out.println(str2 == str4);       // 比较地址  false
        System.out.println(str2.equals(str4));  // 比较内容 true

        System.out.println("------------------------------------------------------------");
        // 3.常量有优化机制,变量没有
        String str5 = "abcd";
        String str6 = "ab" + "cd";  // 常量优化机制  "abcd"
        System.out.println(str5 == str6); // 比较地址  true

        String str7 = "ab";
        String str8 = str7 + "cd"; // 没有常量优化
        System.out.println(str5 == str8); // 比较地址 false


    }
}

 


二、StringBuilder可变字符串

1. 基本概念:

a. 由于String类描述的字符串内容是个常量不可改变,当需要在Java代码中描述大量类似的字符串时,只能单独申请和存储,此时会造成内存空间的浪费。

b. 为了解决上述问题,可以使用java.lang.StringBuilder类和java.lang.StringBuffffer类来描述字符序列可以改变的字符串。

c. StringBuffer类是从jdk1.0开始存在,属于线程安全的类,因此效率比较低。

d. StringBuilder类是从jdk1.5开始存在,属于非线程安全的类,效率比较高。

String 中的字符串拼接问题:

由于String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:

public class StringDemo {

    public static void main(String[] args) { 

        String s = "Hello"; 

        s += "World"; 

        System.out.println(s); 

    }

}

在API中对String类有这样的描述:字符串是常量,它们的值在创建后不能被更改。

根据这句话分析我们的代码,其实总共产生了三个字符串,即“Hello”"World""HelloWorld"。引用变量s首先指向Hello对象,最终指向拼接出来的新字符串对象,即“HelloWorld”

由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。为了解决这一问题,可以使用java.lang.StringBuilder类。

2. 常用构造方法与成员方法:

构造方法
方法声明功能介绍
StringBuilder()
使用无参方式构造对象, 默认容量为16
StringBuilder(int capacity)
根据参数指定的容量来构造对象,容量为参数指定大小
StringBuilder(String str)
根据参数指定的字符串来构造对象, 容量为:16+字符串长度
成员方法
方法声明功能介绍
int capacity()
用于返回调用对象的容量
int length()
用于返回字符串的长度,也就是字符的个数
StringBuilder insert(int offset, String str)
插入字符串并返回调用对象的引用,就是自己(this)。
StringBuilder append(String str)
追加字符串
StringBuilder deleteCharAt(int index)
将当前字符串中下标为 index 位置的单个字符删除
StringBuilder delete(int start int end)
删除字符串
StringBuilder replace(int start int end,String str)
替换字符串
StringBuilder reverse()
字符串反转
String toString()将此序列返回字符串格式

注意:作为参数传递的话,方法内部String不会改变其值,StringBufferStringBuilder会改变其值。

3. 返回值的设定:

a. StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this;

b. 由此可见,这些方法在对StringBuilder所封装的字符序列进行改变后又返回了该对象的引用。这样设计在于可以连续调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值