复习3:String

String

  • 字符串是什么
  • 字符串的特点
  • 字符串的API
  • 字符串的常量池
  • 字符串的衍生类
  • StringBuilder的常用API
  • String与其衍生类的区别

字符串是什么

一种引用数据类型

  • 顾名思义,字符串是由字符组成的长串,所以字符串的实现原理是字符数组

字符串的特点

  • 不可变:字符串本质是字符数组,而数组是被final修饰的(即数组是不可变的)
    • 对字符串的操作:创建一个新的字符串,内容为源字符串进行操作后的结果,再将源字符串的引用指向新的字符串
  • 不可被继承:String类被final修饰,无法被继承
  • 直接赋值:字符串可以像基本数据类型一样直接赋值
    • String=“10”;
    • String=“字符串”;
  • 做加法:字符串的加法本质是字符串的拼接
    • 任何类型的数据与字符串做加法,运算结果都是字符串

字符串的API

以下是字符串的原生API

  • 构造方法:
    • 空参构造器:new String(),创建的字符串为空(不是null)
    • 有参构造器:String,int[],byte[],char[],StringBufferStringBuilder
  • 比较两个字符串:
    • int CompareTo(String s):按字典顺序比较两个字符串,参数大,返回正数;参数小,返回负数;完全相等,返回0(按位依次比较,返回值累加)
    • int CompareIgnoreCase(String s):按字典顺序比较两个字符串,不考虑大小写
  • boolean contains(String s):字符串是否包含指定字符串,若包含,则返回true;反之,则返回false
  • static String copyValueOf(char[ ] chars):将字符数组转成字符串
  • boolean endsWith(String s):若字符串以指定字符串结尾,则返回true;反之,返回false
    • 使用场景:判断邮箱后缀,例如是否以qq.com结尾
  • boolean startsWith(String s):若字符串以指定字符串开头,则返回true;反之,返回false
    • 使用场景:判断电话号码的区号、手机号码所属国家等
  • boolean startsWith(String s,int index):若从索引位置开始以指定字符串开头,则返回true;反之,返回false
  • boolean equals(Object o):字符串与任意类型的数据比较,若相等,则返回true;反之,则返回false
    • String中的equals()已被重写
  • boolean equalsIgnoreCase(String s):字符串与任意类型的数据比较,不考虑大小写
  • int indexOf():
    • indexOf(int ch):返回字符在此字符串中第一次出现的位置的索引
      • 需要注意的是:所需参数并非是完全意义上的整形,而是一个字符,ch为字符的Unicode码
    • indexOf(int ch,int fromIndex):返回从指定索引(包括指定索引)位置开始,字符第一次出现的位置的索引
    • indexOf(String s):返回字符串在此字符串中第一次出现的位置的索引
    • indexOf(String s,int fromIndex):返回从索引(包括索引)位置开始,字符串第一次出现的位置的索引
  • int laseIndexOf(…):返回[参数]在此字符串中最后一次出现的位置的索引
    • 重载方法与indexOf(…)类似
  • boolean isEmpty():判断字符串是否为"",若为空,则返回true;反之,返回false
  • String replace(char oldChar,char newChar):用新字符替换字符串中的旧字符
  • String subString(int beginIndex):从索引处开始截取字符串
  • String subString(int beginIndex,int endIndex):从[beginIndex]索引处开始截取字符串,到[endIndex]索引处结束
    • 注意:不包含[endIndex]索引处的字符
  • String toLowerCase():将字符串所有字母小写化
  • String toUpperCase():将字符串所有字母大写化
  • String trim():去除字符串前后的空格,不去除字符串内部的空格,常用于用户名验证
  • static String valueof(E e):将任意类型的数据转化为字符串

以下是字符串实现CharSequence的API

  • int length():返回字符串的字符个数
    • 双引号内的所有内容,包括字母、汉字、空格、标点符号、特殊符号
  • char charAt(int index)
    • 返回字符串中索引为[index]的字符,索引从0开始

字符串的常量池

  • 常量池范围:无限大

    • 与Integer常量池的区别:Integer常量池有范围(-128~127)
  • 一般进池方式:所有通过直接赋值方式创建的字符串都会进常量池

  • 特殊进池方式:

    • 通过字面量直接运算得到的字符串也会进常量池,例如:

      public static void main(String args[]){
          String s = "he"+"llo";
          //此时s会进入常量池
      }
      
    • 运算中存在变量时,运算得到的字符串不会进常量池,例如:

      public static void main(String args[]){
          String s1 = "he";
          String s = s1+"llo";
          //此时s不会进入常量池
      }
      

字符串的衍生类

String有两个衍生类:

  • StringBuffer
  • StringBuilder

它们出现的目的是改进字符串的缺点,改进有两方面组成:

  • 不可变—>可变
  • 线程不安全—> 线程安全(StringBuffer安全,StringBuilder不安全)

它们俩除了在线程安全方面有所差异,其它方面并无明显差别,所以接下来的API介绍会以StringBuilder为例


StringBuilder的常用API

  • 构造方法:

    • StringBuilder():创建一个空的StringBuilder,初始容量为16个字符
    • StringBuilder(int capacity):创建一个空的StringBuilder,长度由传入的参数控制
    • StringBuilder(CharSequence seq):传入字符
    • StringBuilder(String str):传入字符串
  • append():

    • append(E e):将任意类型的参数追加到序列末尾,有多种重载
    • append(char[],int start,int length):从数组的[start]位置开始,长度为length个元素追加到序列末尾
    • append(String str,int start,int end):从字符串的[start]位置开始,到[end]位置结束的字符都追加到序列末尾,不包括[end]位置的元素
  • delete(int start,int end):删除从[start]到[end]之间的所有字符串,不包括[end]处的字符

  • deleteCharAt(int index):删除指定索引处的字符

  • replace(int start,int end,String str):将[start]到[end]位置的内容替换为新字符串,不包括[end]处的字符

    • 与String的区别:String是单个字符的替换,StringBuffer是长串字符的替换
  • insert():

    • insert(int index,E e):将所有类型的参数插入字符串的指定位置
    • insert(int index,String str,int start,int end):截取[start]到[end]位置的字符串插入到[index]位置,不包括[end]位置的字符
    • insert(int index,CharSequence seq,int start,int end):截取[start]到[end]位置的元素插入到[index]位置,不包括[end]位置的字符
  • reverse():将字符串中的内容前后倒置

  • subSequence(int start,int end):与String的方法类似

  • 其它方法的使用方式均与String相同

以上方法的返回值均为StringBuffer对象本身


String与其衍生类的区别

String StringBuffer StringBuilder
是否可被继承 × × ×
是否可变 ×
是否线程安全 × ×

线程安全(StringBuffer)效率低,线程不安全(StringBuilder)效率高,单个线程时优先使用StringBuilder


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章