
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
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月21日 22时11分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
常量表达式
2019-03-06
POD类型
2019-03-06
const与常量,傻傻分不清楚~
2019-03-06
Head First设计模式——迭代器模式
2019-03-06
MongoDB版本及存储引擎区别
2019-03-06
shell echo单行和多行文字定向写入到文件中
2019-03-06
AtCoder Beginner Contest 100 题解
2019-03-06
【数据结构】可持久化线段树初步
2019-03-06
Java高性能编程之CAS与ABA及解决方法
2019-03-06
从BIO到Netty的演变
2019-03-06
《算法导论》第二章笔记
2019-03-06
HTML节点操作
2019-03-06
HTML5新特性
2019-03-06
cmp命令
2019-03-06
一次编辑
2019-03-06
JavaScript中的链式调用
2019-03-06
day-04-列表
2019-03-06
Linux 磁盘管理(df fu fdisk mkfs mount)
2019-03-06
第一类曲面积分
2019-03-06
MySQL锁机制
2019-03-06