java12_String类
String类相关
(一)继承关系:
接口解释:
Serializable:说明String可以串行化,可以在网络传输。
Comparable:说明String可以进行比较。
CharSequence:字符序列接口。
Constable, ConstantDesc:暂时还没有碰到,遇见再说(挖坑:1)。
部分源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
@Stable
private final byte[] value;
... ...
}
- String类是一个final类,不能被继承。
- 内部维护了一个被final修饰的字符数组(指向地址不可修改,但内部保存的值可以更改)。
(二)举例说明:
2.1 ==与equals()在String类中的使用情况
String str1 = "123";
String str2 = "123";
String str3 = new String("123");
String str4 = new String("123");
System.out.println(str1 == str2 );
System.out.println(str3 == str4 );
System.out.println(str1 == str4.intern() );//intern():返回常量池中的地址
System.out.println(str1.equals(str2) );
System.out.println(str1.equals(str2) );
true
false
true
true
true
2.2 查看String类的构造器
//显示构造器个数
Class aclass = String.class;
Constructor[] declaredConstructors = aclass.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println("String 第"+num+" 个构造器"+declaredConstructor);
num++;
}
String 第1 个构造器public java.lang.String(java.lang.StringBuffer)
String 第2 个构造器public java.lang.String(java.lang.StringBuilder)
String 第3 个构造器java.lang.String(char[],int,int,java.lang.Void)
String 第4 个构造器java.lang.String(java.lang.AbstractStringBuilder,java.lang.Void)
String 第5 个构造器public java.lang.String(byte[],int,int,java.nio.charset.Charset)
String 第6 个构造器public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
String 第7 个构造器public java.lang.String(byte[],java.nio.charset.Charset)
String 第8 个构造器public java.lang.String(byte[],int,int)
String 第9 个构造器public java.lang.String(byte[])
String 第10 个构造器java.lang.String(byte[],byte)
String 第11 个构造器public java.lang.String(char[],int,int)
String 第12 个构造器public java.lang.String(char[])
String 第13 个构造器public java.lang.String(java.lang.String)
String 第14 个构造器public java.lang.String()
String 第15 个构造器public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
String 第16 个构造器public java.lang.String(byte[],int)
String 第17 个构造器public java.lang.String(byte[],int,int,int)
String 第18 个构造器public java.lang.String(int[],int,int)
(三)字符串特性:
3.1 问创建了几个对象?
①:
String s1 = "hello";
s1 ="haha";
两个:
②:
String s2 = "hello" + "abc";
一个:
编译器会将其优化为s2 = "helloabc",只创建一个对象。
③:
String a ="hello";
String b ="abc";
String c = a+ b;
三个:
实现方式为:
- 创建a 指向常量池中的"hello";
- 创建b 指向常量池中的"abc";
- 创建一个StringBulider,执行它的append方法,将a与b的值,追加到它自身;
- 通过toString方法,让c指向字符串"helloabc"。
(四)String类常用方法:
变量和类型 | 方法 | 描述 |
---|---|---|
boolean | equals(Object anObject) | 将此字符串与指定的对象进行比较。 |
boolean | equalsIgnoreCase(String anotherString) | 将此 String与另一个 String比较,忽略了大小写。 |
int | length() | 返回此字符串的长度。 |
int | indexOf(String str) | 返回指定子字符串第一次出现的字符串中的索引。 |
int | lastIndexOf(int ch) | 返回指定字符最后一次出现的字符串中的索引。 |
String | substring(int beginIndex) substring(int beginIndex, int endIndex) | 返回一个字符串,该字符串是此字符串的子字符串。 |
String | toUpperCase() toLowerCase() | 使用默认语言环境的规则将此 String所有字符转换为大写。 使用默认语言环境的规则将此 String所有字符转换为小写。 |
String | concat(String str) | 将指定的字符串连接到此字符串的末尾。 |
boolean | contains(CharSequence s) | 当且仅当此字符串包含指定的char值序列时,才返回true。 |
String | replace(char oldChar, char newChar) | 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。 |
String[] | split(String regex) | 将此字符串拆分为给定 regular expression的匹配项 。 |
char[] | toCharArray() | 将此字符串转换为新的字符数组。 |
int | compareTo(String anotherString) | 按字典顺序比较两个字符串。(前大为正,后大为负,相等为零) |
- format——格式化字符串
public static void main(String[] args) { String num1 ="123"; int num2 = 456; double num3 = 789; char num4 ='A'; String num5="num1:%s,num2:%d,num3:%.2f,num4:%c"; System.out.println(String.format(num5,num1,num2,num3,num4)); } 运行结果: num1:123,num2:456,num3:789.00,num4:A
(五)StringBuffer与StringBuilder:
String类是保存字符串常量的。每次更新都需要开辟新的空间,效率很低。因此Java设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
StringBuffer:
- java.lang.StringBuffer代表可变长的字符序列,可以对字符串内容进行增删。
- 很多方法都和String相同,但是StringBuffer是可变长的。
- StringBuffer是一个容器。
部分源码:
public final class StringBuffer
extends AbstractStringBuilder
implements Serializable, Comparable<StringBuffer>, CharSequence
{
... ...
}
-
StringBuffer是一个final类,无法被继承。
-
其中需要注意的是:jdk9将String的底层实现由char[]改成了byte[]
在StringBuffer的抽象父类中:
abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ byte[] value; ... ... }
大致可以理解为,我们在使用String的时候,内部存储的基本都是数字和字母,这些字符使用byte数组存储就足够了,没必要使用char数组来浪费存储空间,改成byte[]之后,简单的字符占有的空间会缩减,汉字还按原来的大小存储,有效减少空间浪费。
具体介绍:
构造方法:
构造器 | 描述 |
---|---|
StringBuffer() | 构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。 |
StringBuffer(int capacity) | 构造一个字符串缓冲区,其中没有字符和指定的初始容量。 |
StringBuffer(CharSequence seq) | 构造一个字符串缓冲区,其中包含与指定的 CharSequence相同的字符。 |
StringBuffer(String str) | 构造一个初始化为指定字符串内容的字符串缓冲区,初始容量str.length()+16。 |
常用方法:
方法 | 方法描述 |
---|---|
1 | public StringBuffer append(String s) 将指定的字符串追加到此字符序列。 |
2 | public StringBuffer reverse() 将此字符序列用其反转形式取代。 |
3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
4 | public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。 |
5 | insert(int offset, String str) 将 str 参数的字符串插入此序列中。 |
6 | replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
7 | int indexOf(String str)返回第一次出现的指定子字符串在该字符串中的索引。 |
相互转换:
String转StringBuffer | StringBuffer转String |
---|---|
new StringBuffer(String str) | new String(StringBuffer sbf) |
sbf.append(String str); | String str = sbf.toString(); |
StringBuilder:
一个可变的字符序列。 此类提供与StringBuffer兼容的API,但不保证同步。 此类设计用作StringBuffer替代品,用于单个线程使用字符串缓冲区的位置(通常情况下)。 在可能的情况下,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。
StringBuilder上的主要操作是append和insert方法,它们被重载以便接受任何类型的数据。 每个都有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中。 append方法始终在构建器的末尾添加这些字符; insert方法在指定点添加字符。
SringBuffer 与StringBuilder的扩容机制:
两者一致,以StringBuffer为例。
无参构造 | |
---|---|
有参构造 | |
---|---|
无参有参,它们初始化出来的StringBuffer实例的扩容机制一致,都是 原来容量*2+2 。
文理双修:
4.《鹧鸪天 送人》宋朝·辛弃疾
唱彻《阳关》泪未干,功名馀事且加餐。浮天水送无穷树,带雨云埋一半山。
今古恨,几千般,只应离合是悲欢?江头未是风波恶,别有人间行路难!
译文:
唱完了《阳关》曲泪却未干,视功名为馀事(志不在功名)而劝加餐。水天相连,好像将两岸的树木送向无穷的远方,乌云挟带着雨水,把重重的高山掩埋了一半。
古往今来使人愤恨的事情,何止千件万般,难道只有离别使人悲伤,聚会才使人欢颜?江头风高浪急,还不是十分险恶,而人间行路却是更艰难。