1、简单介绍
java中的String类定义为final类型,不支持扩展,即该类不存在子类。
由上图的源码可以看出,底层使用final数组存储数据,且String类实现了Serializable,和Comparable接口,分别使其具有可序列化和可比较大小的特性,后文将详细描述。
2、字符串的声明和使用
字符串声明可分为两种方式,通过字面量直接赋值,此时的字符串常量存储在方法区的常量池中,且常量池中不存储相同的常量。
String str1="abc";
借助new关键字创建对象,new创建的对象在堆中分配内存空间,对象的引用变量(str1、str2)存储在栈中,保存对象在堆中的地址。
String str2=new String("DEF");
声明方式不同,在内存空间中的分配的区域不同,具体见下图。这里主要设计堆、栈和方法区三个内存区域,关于堆、栈存储的内容见文章:java基础-数组_ITsOK6的博客-优快云博客。
同时还可以得出,使用new关键字创建字符串对象时,通常情况下会在堆和方法区中各创建一个对象,特别的,当字符串存储的数据已经在常量池中存在时,只在堆中创建一个对象,该对象指向常量池中的常量。
3、String类的常用方法
-
public int length();返回字符串的长度(字符数);
-
public char charAt(int index);返回字符串在指定位置index上的字符
-
public boolean isEmpty();判断当前字符串是否为空
-
public String toLowerCase() ;字符转为小写
-
public String toUpperCase();字符转为大写
-
public String trim():去除前导空白和尾部空白字符之后返回字符串副本
-
public boolean equals(Object anObject) ;比较两对象内容是否相同
-
public boolean equalsIgnoreCase(String anotherString) ;忽略大小写比较内容
-
public String concat(String str) ;将指定字符串str连接到当前字符串后面并生成新的字符串返回
-
public String substring(int beginIndex);从beginIndex索引开始截取字符串并生成新的字符串返回
-
public String substring(int beginIndex, int endIndex) ;截取索引在[startIndex,endIndex)区间内的字符串并返回(重新创建字符串,不改变原字符串的值)。
方框内的参数含义如下:
@param value Array that is the source of characters//原字符串
@param offset The initial offset//截取开始索引
@param count The length//截取的字符个数
方框内的参数含义如下:
original – the array from which a range is to be copied//待复制的数据
from – the initial index of the range to be copied, inclusive//开始索引
to – the final index of the range to be copied, exclusive. (This index may lie outside the array.//结束索引
-
public int compareTo(String anotherString); 比较两个字符串的大小,返回结果为0,两字符串相等;返回结果大于0,当前字符串大于annotherString;返回结果小于0,当前字符串小于annotherString。实现逻辑是依次比较两个字符串中的每一个字符,若不相同,返回两个字符的差值,若在循环范围内所有字符相同,则结果为两字符串长度的差值。源码如下:
-
public int indexOf(int ch)/public int indexOf(String str);返回字符串中字符ch或字符串str首次出现的位置。
4、String、StringBuilder和StringBuffer之间的关系
三者都是常用的字符串类,主要区别体现在可变性、性能和线程安全性方面,详细见文章String、StringBuffer、StringBuilder区别_ITsOK6的博客-优快云博客