String类

String类

此系列笔记来源于

BiliBili韩顺平老师的Java基础课


String的类图

image-20220330142656656

String类的理解和创建对象

1、字符串常量对象是用双引号括起的字符序列

2、字符串的字符是用Unicode字符编码,一个字符占两个字节

3、String类有很多构造器‘

常用:

image-20220330142939971

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类的常见方法

image-20220330162930532

image-20220330163500838

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类,不能被继承

image-20220330232331672

StringBuffer的构造器

image-20220330232802256PS:利用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类常见方法

image-20220330233403436

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

String、StringBuffer、StringBuilder的比较

image-20220330234907220

String、StringBuffer、StringBuilder的选择

image-20220330235148006

posted @   Yra  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示