String类
String类
此系列笔记来源于
BiliBili韩顺平老师的Java基础课
String的类图
String类的理解和创建对象
1、字符串常量对象是用双引号括起的字符序列
2、字符串的字符是用Unicode字符编码,一个字符占两个字节
3、String类有很多构造器‘
常用:
4、String类 实现了接口 Serializable,即String 可以串行化(可以在网络传输)
5、String类 实现了接口 Comparable,即String对象可以比较大小
6、String类是final类,即不能被继承
7、String 有属性 private final char value[],用于存放字符串内容
8、value是一个final类型,value的地址不可以修改,但是地址内部的数据可以修改
创建String对象的两种方式
1、直接复制 String s = “wuhu”;
方式一:会先从常量池查看是否有”wuhu“数据空间,如果有直接指向,如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址
栈--->方法区的常量池中的“wuhu”
2、调用构造器 String s = new String(“wuhu”);
方式二:现在堆中创建空间,里面维护了value属性,指向常量池的”wuhu“空间。如果常量池没有”wuhu”,则重新创建,如果有就直接通过value指向。最终s指向的是队中的空间地址
栈--->堆,堆中wuhu的value---> 方法区的常量池中的“wuhu”
PS:String的intern()方法返回的是常量池的地址
字符串的特性
1、String 是一个final类,代表不可变的字符序列
2、字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。
练习:
1、
String a = “hello, ” + “world”; 创建了几个对象?
答:一个,编译器会优化,等价于String a = “hello, world”;
2、
String a = “1”, b = “2”;
String c = a + b;
创建了几个对象?
答:三个字符串常量对象,一个String类对象
1、先创建一个 StringBuilder t = StringBuilder();
2、执行 t.append(“a”);
3、t.append(“b”);
4、String c = t.toString(); //toString()会return t的地址
String类的常见方法
1、String的compareTo 会依次比较每个字符,如果相同则比较下一个,如果不同则直接return 第一个字符串该位置的字符 - 第二个字符串该位置的字符。 如果一个字符串是另一个字符串的从第一个字符开始组成的子串,则直接返回第一个字符串的length - 第二个字符串的length(看源码)
2、format:
String s = String.format(“…%s….%c…..%d…..%.2f”, “wuhu”, ‘c’, 123, 1.25);
%.2f会进行四舍五入
StringBuffer
StringBuffer代表可变的字符序列,可以对字符串内容进行删减。
StringBuffer是一个容器,很多方法和Stirng一样。
说明:
1、StringBuffer 的直接父类是AbstractStringBuilder
2、StringBuffer 实现了Serializable,其对象可以串行化
3、在父类AbstractStringBuilder有属性 char[] value,不是final。该 value数组存放字符串内容,因此存放在堆中。
4、StringBuffer 是一个final类,不能被继承
StringBuffer的构造器
PS:利用string来创建StringBuffer,char[]的大小是 str.length() + 16
String 和 StringBuffer的转换
String s = "a";
//StringBuffer -> String
//方式一
StringBuffer sb = new StringBuffer(s);
//方式二
StringBuffer sb = new StringBuffer();
sb = sb.append(s);
//String -> StringBuffer
StringBuffer sb = new StringBuffer("a");
//方式一
String s = sb.toString();
//方式二
String s = new String(sb);
StringBuffer类常见方法
StringBuilder
介绍
1、一个可变的字符序列。此类提供一个和StringBuffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类。因为在大多数实现中,它比StringBuffer 要快
2、在 StringBuilder 上的主要操作是 append 和 insert方法,可重载这些方法,以接受任意类型的数据
说明
1、StringBuild 的直接父类是AbstractStringBuilder
2、StringBuild 实现了Serializable,其对象可以串行化
3、在父类AbstractStringBuilder有属性 char[] value,不是final。该 value数组存放字符串内容,因此存放在堆中。
4、StringBuild 是一个final类,不能被继承
5、StringBuilder 的方法,没有做互斥的处理,即没有synchronized关键字,因此在单线程的情况下使用StringBuilder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?