第二十章 JavaSE专题之字符串常用类String、StringbBuffer、StringBuilder详述(图解+实测+面试题)

2022/2/13 9:44:57

本文主要是介绍第二十章 JavaSE专题之字符串常用类String、StringbBuffer、StringBuilder详述(图解+实测+面试题),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、String类概述

1.1、String介绍

(1)String对象用于保存字符串,也就是一组字符序列

(2)字符串常量对象是用双引号括起的字符序列

(3)字符串的字符使用Unicode字符编码,即一个字符(不区分字母还是汉字)占两个字节

(4)String类是final类,不能被继承;

(5)String字符串内容底层存储使用char数组存储,并且内存地址不可修改,而数组内容可修改

private final char value[];
1.2、String类的继承关系
  • 查看类图关系:继承一个父类,实现三个接口

在这里插入图片描述

(1)父类Object:所有类的基类

(2)接口Serializable:说明String对象可串行化,即该对象可在网络传输

(3)接口Comparable:说明String对象可相互比较大小

  • 注意事项:String有很多构造器,即
    在这里插入图片描述
1.3、String创建剖析

(1)直接赋值

String s1 = "taobao";
  • 创建步骤:

    • 查看常量池中是否有"taobao"数据空间
      • 如果有则直接指向;
      • 如果没有则重新创建,然后指向;
  • 内存剖析

在这里插入图片描述

(2)调用构造器

String s2 = new String("taobao");
  • 创建步骤

    • 先在堆中创建空间,里面维护了value属性,指向常量池的"taobao"内存地址
      • 如果常量池中有"taobao",直接通过value指向队中内存空间
      • 如果没有则创建后指向
  • 内存剖析

在这里插入图片描述

1.4、String对象特性

(1)面试题1:以下语句创建了几个对象?画出内存布局图

String s1 = "taobao";
s1 = "jingdng";
  • 创建对象个数:2个

    • ①taobao对象
    • ②jingdong对象
  • 内存剖析图

在这里插入图片描述

(2)面试题2:以下语句创建了几个对象?画出内存布局图

String s1 = "taobao"+".com"; // 优化等价于 String s1 = "taobao.com"
  • 创建对象个数:1个
    • ①taobao.com
  • 内存剖析图

在这里插入图片描述

(3)面试题3:以下语句创建了几个对象?画出内存布局图

String s1 = "taobao";
String s2 = ".com";
String s3 = s1 + s2;
String s4 = "taobao.com"; // s3和s4地址不相等,s3指向堆,s4指向常量池
  • 创建对象个数:
    • ①taobao
    • ②.com
    • ③taobao.com
  • 内存剖析图

在这里插入图片描述

  • 注意事项:关于s3的创建过程
    • ①先创建一个 StringBuilder sb = StringBuilder();
    • ②执行sb.append(“taobao”);
    • ③执行sb.append(".com");
    • ④String s3 = sb.toString();

(4)面试题4:以下语句创建了几个对象?

String s1 = new String("hello") + new String("world");
  • 创建对象个数:6个
    • ①new StringBuilder
    • ②堆中new String(“hello”)
    • ③常量池中的"hello"
    • ④堆中new String(“world”)
    • ⑤常量池中的"world"
    • ⑥new String (“hello world”)
1.5、String常用方法
方法名称方法描述范例
equals区分大小写,判断内容是否相等
equalsIgnoreCase忽略大小写的判断内容是否相等
length获取字符串的长度,即字符个数
indexOf获取字符在字符串中第一次出现的索引,索引从0开始,找不到则返回-1
lastindexOf获取字符在字符串中最后一次出现的索引,索引从0开始,找不到则返回-1
substring截取指定范围的子串
trim去前后空格
charAt获取某处索引的字符

2、StringBuffer类

2.1、StringBuffer介绍
  • 定义:StringBuffer是一个容器,代表可变的字符序列,可以对字符串内容进行增删

(1)StringBuffer的直接父类:AbstractStringBuilder

(2)SringBuffer实现了Serializable,即StringBuffer的对象可串行化

(3)在父类AbstractStringBuilder有属性char数组不是final修饰,该数组存放字符串类型(真正存放位置在堆中

char[] value;

(4)StringBuffer是一个final类,不能被继承

2.2、StringBuffer类的继承关系
  • 查看类图关系:

在这里插入图片描述

(1)直接父类AbstractStringBuilder:

①父类Object:所有子类的基类

②接口Appendable:

③接口CharSequence:

(2)接口Serializable:说明String对象可串行化,即该对象可在网络传输

2.3、StringBuffer和Sring区别

(1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低

  • value:指向字符串常量池
private final char value[];
  • 内存剖析图

在这里插入图片描述

(2)StringBuffer保存的是字符串变量,里面的值可以更改,其更新实际上可以更新内容,不用更新地址,效率较高

  • value:指向堆中
char[] value;
  • 内存剖析图

在这里插入图片描述

  • 注意事项:只有当空间大小不够的时候,才会进行地址更改
2.4、StringBuffer创建&转换

(1)StringBuffer创建

// 1、创建一个大小为16的char[],用于存放内容
StringBuffer stringBuffer1 = new StringBuffer();


// 2、创建一个指定char[]大小的stringbuffer
StringBuffer stringBuffer2 = new StringBuffer(100);

// 3、通过String创造stringbuffer,char[]大小就是str.ength()+16
StringBuffer stringBuffer3 = new StringBuffer("hello");

(2)String和StringBuffer转换

  • String转换为StringBuffer:对String没有影响
// String-->StringBuffer
String str1 = "hello";
// 1、构造器转换
StringBuffer stringBuffer1 = new StringBuffer(str1);

// 2、append转换
StringBuffer stringBuffer2 = new StringBuffer();
stringBuffer2.append(str1);
  • StringBuffer转换成String
2.5、StringBuffer常用方法
方法名称方法描述范例
append在后面增加字符串
delete删除索引从start到end的字符串
replace替换指定字符串
indexOf查找指定字串在字符串中第一次出现索引位置,没有则返回-1
insert在指定索引位置插入字符串
length获取长度

3、StringBuilder类

3.1、StringBuilder介绍

(1)一个可变的字符序列

(2)应用场景:用在字符串缓冲区被单个线程使用的时候

(3)主要方法:append、insert

3.2、StringBuilder继承关系
  • 同StringBuffer

在这里插入图片描述

3.3、String、Stringbuffer和StringBuilder区别

(1)String:不可变字符序列,效率低,但是复用率高

(2)StringBuffer:可变字符序列、效率较高、线程安全

(3)StringBuilder:可变字符序列、效率最高、线程不安全



这篇关于第二十章 JavaSE专题之字符串常用类String、StringbBuffer、StringBuilder详述(图解+实测+面试题)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程