String相关

一. 概述


  1. String为引用数据类型,是一个工具类,在java.long包中。声明如下:public final class String extends Object

    注:final修饰表示不能继承

  2. 关于字面值(直接量)

    • 数值型字面值:整数 浮点数
    • 字符型字面值:字符'a'
    • 布尔型字面值:true false
    • 字符串字面值:“abc”//可以为空

    注:java程序中所有用到的字面值,都是String的实例

  3. 字符串是常量:引用不能发生改变

    • String 引用=字符串字面值

    • String 引用=new String(“字面值”)

  4. 底层

    String中的属性:private final char value[]

    可以看出其本质是一个char数组

二. 关于字符串定义和引用


Ⅰ. value数组 由final修饰,不能修改,只能新建

String s1="abc";
s1="str"

Ⅱ. Java对于String,会查找常量池,而非直接新建堆

String s1="abc";
String s2="abc";

Ⅲ.

String s1 = new String("abc")

【注】

  1. string s1="abc";string s2="abc";

    在堆中只创建了一个对象

  2. String s1=new String(“abc”);String s2=new String("abc")

    在堆中创建了两个对象

  3. String s1=“ab”;String s2=‘a’+‘b’

    同地址。因为字符串的字面值,java编译会进行优化,编译后为:string s2="ab"

  4. String s="ab";String s1="a";String s2=s1+"b";Sout(s==s2)//false

    1.与③对比,s1不是字面值,无法优化编译

    2.顶层返回新的地址空间

三. 构造方法


  1. String()

    初始化一个新对象,表示一个空字符序列

  2. String(Char[] value)

    分配一个新的String,使其表示字符数组参数中当前包含的字符序列;将字符数组转化为字符串

  3. String(char[] value,int offset,int count)

    分配一个新的String,包含取自字符数组的一个子数组。其中:

    Int offset:起始的下标

    Int count:个数

    将字符数组中部分字符转为字符串

  4. String(byte[] bytes)

    通过使用平台的默认字符集解码指定的byte数组,构建一个新的String

  5. String(byte[] bytes,String charsetName)

    通过使用指定的charset解码指定的byte数组,构造一个新的String

四. String 常用方法


  1. char charAt(int index)

    返回指定索引处的char值,小心越界异常

  2. int length()

    返回字符串长度

  3. char[] toCharArray()

    将字符串转成一个新的字符数组,修改字符数组的元素的值不会影响原字符串的内容;

  4. int compareTo(String anotherString)

    按字典顺序比较

    1. 获取两个字符串长度最小的值,在此范围内依下标比较

    2. 如果相等则比较下一位,否则返回当前字符-参数字符

    3. 长度范围内都相等,最后返回当前字符串长度-参数字符串长度

      总结:返回0:相等;负数:当前小;正数:当前大

  5. Int compare TolgonreCase(String str)

    不分大小写进行字典序比较

  6. String concat(String s1)

    将指定字符串连接到此字符串的结尾

    效率比+高,但高不到哪里去,一般情况下用+就行了

  7. boolean contains(CharSequence s)

    当且仅当字符串中包含指定的char值序列时,返回true。

    注:CharSequnce是个接口,String已经默认实现了,这里也是向上造型

  8. boolean endsWith(String suffix)

    测试此字符串是否以指定的后缀结束

    应用场景:根据后缀判断文件类型

  9. boolean startsWith(String prefix)

    测试此字符串是否以指定的前缀开始

  10. boolean startsWith(String prefix,int toffset)

    测试此字符串从指定索引开始的字符串是否以指定前缀开始

  11. int infexOf(int ch)

    返回指定字符在此字符串中第一次出现的索引

    从0开始,如果没有则返回-1

  12. Int indexOf(int ch,int fromIndex)

    返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索,没有则返回-1

  13. Int indexOf(String str)

    返回指定子字符串在此字符串中第一次出现处的索引

  14. Int indexOf(String str,int fromIndex)

    返回指定字符串在此字符串中第一次出现处的索引。从指定的索引开始

  15. Int lastIndexOf(int ch)

    Int lastIndexOf(int ch,int fromIndex)

    Int lastIndexOf(String str)

    Int lastIndexOf(String str,int fromIndex)

  16. Boolean equals(Object anObject)

    将此字符串与指定的对象比较

    String重写了equals方法

  17. Boolean equalsIgnoreCase(string anotherString)

  18. byte[] getBytes()

    使用平台的默认字符集将此String 编码为byte(二进制)序列,并将结果存储到一个新的byte数组中

    字符转二进制:将字符映射到整数码

    码表不同,中文所占字节数不同

    GBK:1个字符占2个字节

    Utf-8:一个字符占3个字节

    注意:Idea中默认所有项目的编码都是UTF-8

    eclipse中默认的编码和平台便把一致--GBK

  19. byte[] getBytes(String charsetName)

    使用指定的字符集将此String编码为byte(二进制)序列,并将结果储存到一个新的byte数组中

  20. int hashCode()

    返回此字符串的哈希码

    \(S[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]*31^0\)

    空字符串的哈希值为0

  21. boolean isEmpty()

    当且仅当length()为0时返回true

  22. String replace(Char target,Char replacement)

    String replace(CharSequence target,CharSequence replacement)

    使用指定的字面值序列,替换此字符串中所有匹配的的字面值

  23. String substring(int beginIndex)

    返回一个新的字符串,是该字符串的子字符串

    String substring(int beginIndex,int endIndex)

    左闭右开

  24. String toLowerCase()

    使用默认语言环境的规则将此String中的所有字符都转化为小写。

    String toUpperCase()

    使用默认语言环境的规则将此String中的所有字符都转换为大写。

  25. String trim()

    返回字符串的副本,忽略签到空白和尾部空白

    \t\r\n\r--都属于空白

    只能去掉头部和尾部的空白,中间的去不掉

  26. Static String valueOf(boolean b)

    返回boolean参数的字符串表示形式

    Static String valueOf(char[] obj)

    返回char数组参数的字符串表示形式 ,本质上调用了String中参数为字符数组的构造方法

    Static String valueOf(Object obj)

    返回Object参数的字符串表示形式,对于数据类型除字符数组之外,其他的都是默认调用该引用数据类型的toString方法。

  27. String toString()

    返回此对象本身(已经是一个字符串)

  28. boolean matches(String regex)

    告知此字符串是否匹配给定的正则表达式

  29. String replaceAll(String regex,String replacement)

    使用给定的replacement替换此字符串中所有匹配正则表达式的子字符串

    String replaceFirst(String regex,String replacement)

  30. String[] split(String regex)

    根据给定正则表达式的匹配拆分此字符串。

五. String和StringBuffer和StringBuilder


  1. String

    由于value数组被final修饰,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间。

    不存在扩容

  2. StringBuilder

    可变类,速度更快,但是线程不安全

    默认大小16,存在扩容问题

  3. StringBuffer

    StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 。

    StringBuffer与StringBuilder都继承AbstractStringBuilder抽象类,大致相似,只在大多方法上加了Synchronized。

posted @ 2020-08-01 11:11  仰观云  阅读(66)  评论(0编辑  收藏
Live2D