Java课堂篇9_String、StringBuilder、StringBuffer简单理解
发布日期:2021-05-07 20:40:29 浏览次数:27 分类:原创文章

本文共 2756 字,大约阅读时间需要 9 分钟。

写在前面




String 类 是 Oracle 公司写好的一个 final类,不可以被继承,不可以被修改,详细的可以自行看源码


查看源码有利于理解底层,巩固基础,更好的使用


除了对字符串处理的String类,还有StringBuilder、StringBuffer类


目录





  • String

  • StringBuffer

  • StringBuilder


开始


一、String


先看源码有哪些信息


在这里插入图片描述



  • 底层是字节数组

  • 一个字符串对象(由" "引起来的),对象内部包含很多成员变量,成员方法," "内部的为该字符串 对象 的 value 成员属性,并且一个对象的value 属性的值是不可以改的(这里的并不是 指不能 修改字符串对象变量)

  • 有成员属性hashCode,这个设计字符串对象 之间 的比价,先简单理解为两个字符串对象之间 == 比较的时候,先比较hashCode,先后equals()


看API文档


在这里插入图片描述


需要明白 String s = "xiaosi" 等效于 char data[] = {'x','i','a','o','s','i'}; String s = new String(data)


这也就是涉及字符串常量池的相关概念,参考往期博客:



String s = new String("xiaosi");,是新创建了一个副本,那么多个副本之间的关系是什么?
在这里插入图片描述



  • 看代码


public class TestStringPool {
public static void main(String[] args) {
String s1 = new String("xiaosi"); String s2 = new String("xiaosi"); String s3 = "xiaosi"; String s4 = "xiaosi"; System.out.println("======================="); System.out.println("s1 == s2?" + (s1 == s2)); System.out.println("s3 == s4?" + (s3 == s4)); System.out.println("s1 == s3?" + (s1 == s3)); /* * ======================= s1 == s2?false s3 == s4?true s1 == s3?false ========================= */ System.out.println("========================="); System.out.println( "s1.equals(s2)?" + s1.equals(s2)); System.out.println( "s3.equals(s4)?" + s3.equals(s4)); System.out.println( "s1.equals(s3)?" + s1.equals(s3)); /* * ========================= s1.equals(s2)?true s3.equals(s4)?true s1.equals(s3)?true ========================= */ System.out.println("========================="); System.out.println( "s1.hashCode() = " + s1.hashCode()); System.out.println( "s2.hashCode() = " + s2.hashCode()); System.out.println( "s3.hashCode() = " + s3.hashCode()); System.out.println( "s4.hashCode() = " + s4.hashCode()); /* * ========================= s1.hashCode() = -759499403 s2.hashCode() = -759499403 s3.hashCode() = -759499403 s4.hashCode() = -759499403 */ }}

可以看出:



  • 只要是字符串的值相同,hashCode 就相等

  • 对于多个字符串对象的副本,有此构造参数初始化的字符串 String(String original) ,之间 并不共享 常量池,可以理解为 就没有使用字节数组value[]来构造,不会共享


二、StringBuffer


在这里插入图片描述


看API文档


在这里插入图片描述
简单理解:



  • 和String不同,支持修改某StringBuffer对象 的 内容值

  • 和StringBuilder类似,但不同的是StringBuffer支持多线程,StringBuilder只支持单线程,速度更快

  • 和String 之间可以相互转换


在这里插入图片描述


具体的构造方法的 常用方法查阅API文档即可,这里不再描述


三、StringBuilder


在这里插入图片描述


看API文档


在这里插入图片描述


单线程对字符串的处理很普遍,建议使用StringBuilder,速度较StringBuffer更快


更多方法自行查看API文档
在这里插入图片描述


测试


		StringBuffer sbf = new StringBuffer("xiaosi");		StringBuilder sbd = new StringBuilder("xiaosi");		System.out.println( " sbf.toString() == sbd.toString()?" + (sbf.toString() == sbd.toString()));// sbf.toString() == sbd.toString()?false		System.out.println( "sbf.equals(sbd)?" + sbf.equals(sbd));//sbf.equals(sbd)?false		System.out.println( "sbf.toString().equals(sbd.toString()?" + sbf.toString().equals(sbd.toString()));//sbf.toString().equals(sbd.toString()?true
上一篇:数据结构实验9_图的遍历(无向邻接矩阵图的构建、递归DFS、非递归DFS、非递归BFS)
下一篇:BZ4_排序4_希尔排序、大量数据下和插入排序效率对比

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月21日 22时11分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章