【Java】常用数据结构之字符串

字符串

Java中的字符串基于字符数组实现,因此字符串也是不可变的(每当对String进行更改时,都会创建一个新的实例)。对于可变字符串,可以使用 StringBuffer 和 StringBuilder 类。

不 可 变 的 原 因 ‾ \underline{不可变的原因}

1.Java中的ClassLoader使用String对象作为参数。
2.保证线程安全,无需处理共享对象的同步
3.利于内存优化,最大限度地减少堆内存的使用

创建

1.字面量

String s=“welcome”;

每次创建字符串文字时,JVM首先检查“字符串常量池”。如果该字符串已存在于池中,则返回对池化实例的引用。如果池中不存在该字符串,则会创建一个新的字符串实例并将其放入池中。

示意图

2.动态分配

String s=new String(“Welcome”);

通过new 创建字符串实例,会在堆中分配一块内存,且该字符串不会被添加到字符常量池中。

String internedString = str.intern();
//若该字符串本不存在,则将字符串添加到字符串常量池中;
//若该字符串存在,则返回该字符串的引用

比较

1.equals( )方法:比较值是否相等

public boolean equals(String another)
public boolean equalsIgnoreCase(String another) //忽略大小写。

2.== 判断引用是否相同

class Teststringcomparison{  
 public static void main(String args[]){  
   String s1="Welcome";  
   String s2="Welcome";  
   String s3=new String("Welcome");  
   System.out.println(s1==s2);//true (because both refer to same instance)  
   System.out.println(s1==s3);//false(because s3 refers to instance created in nonpool)  
 }  
} 

3.compareTo( )方法:按字典顺序比较

int out = s1.compareTo(s2);
/*
 out < 0 —— s1 在 s2 之前
 out = 0 —— s1 和 s2 相等
 out > 0 —— s1 在 s2 之后
 */

常用方法

  1. int length( ):返回字符串长度

  2. Char charAt(int i):返回第i个字符

  3. String substring (int i):从第i个字符开始截取字符串

    String substring (int i, int j):返回(i, j-1)的子串

  4. public char[] toCharArray():将字符串转换为字符数组

  5. public static String join(CharSequence delimiter, CharSequence… elements):给字符串添加指定分隔符
    public String split(String regex):按照指定规则分割字符串

  6. String.valueOf( )将给定的类型(如int、long、float、double、boolean、char和char数组)转换为String【与toString( )的区别?】

  7. String concat(String str):连接字符串

    String output = s1.concat(s2); //s1, s2均为字符串
    
  8. int indexOf (String s): 返回字符串中第一次出现指定字符串的索引
    int indexOf (String s, int i): 返回指定字符串第一次出现的字符串中的索引,从指定索引开始。
    int lastIndexOf( String s): 返回指定字符串最后一次出现在字符串中的索引。

  9. String trim(): 返回删除两端空格后String的副本(不会影响中间的空格)。

  10. String replace (char oldChar, char newChar):字符替换

  11. String toLowerCase():转换为全小写
    String toUpperCase():转换为全大写

  12. String startsWith()和endsWith():检查String是否以传递的参数(字母)开头/结尾

  13. public boolean isEmpty() :检查字符串是否为空

StringBuffer类

StringBuffer是String的对等类,它提供了字符串的大部分功能。字符串表示固定长度的、不可变的字符序列,而StringBuffer表示可增长和可写的字符序列。它是线程安全的。

构造器

ConstructorDescription
StringBuffer( )创建一个初始容量为16的StringBuffer
StringBuffer(String str)使用指定字符串创建
StringBuffer(int capacity)创建指定容量的StringBuffer

常用方法

MethodDescription
public synchronized StringBuffer append(DataType s)添加指定字符(串)
public synchronized StringBuffer insert(int offset, DataType s)在指定位置添插入指定字符(串)
public synchronized StringBuffer replace(int startIndex, int endIndex, String str)将[startIndex, endIndex)字符串替换为指定字符串
public synchronized StringBuffer delete(int startIndex, int endIndex)将[startIndex, endIndex)字符串删除
public synchronized StringBuffer reverse()翻转字符串
public int capaity( )返回当前StringBuffer容量,newcapacity = (oldcapacity*2)+2 ,初始容量
public char charAt(int index)返回指定位置的字符
public int length()返回字符数目
public String substring(int beginIndex)截取beginIndex起始的字符串
public String substring(int beginIndex, int endIndex)截取[beginIndex, endIndex)的字符串

StringBuilder类

用于创建可变大小的字符串,但是是线程不安全的。

构造器

ConstructorDescription
StringBuilder( )创建一个初始容量为16的StringBuffer
StringBuilder(String str)使用指定字符串创建
StringBuilder(int length)创建指定容量的StringBuffer

常用方法

MethodDescription
public StringBuilder append(DataType s)添加指定字符(串)
public StringBuilder insert(int offset, DataType s)在指定位置添插入指定字符(串)
public StringBuilder replace(int startIndex, int endIndex, String str)将[startIndex, endIndex)字符串替换为指定字符串
public StringBuilder delete(int startIndex, int endIndex)将[startIndex, endIndex)字符串删除
public StringBuilder reverse()翻转字符串
public int capaity( )返回当前StringBuffer容量
public char charAt(int index)返回指定位置的字符
public int length()返回字符数目
public String substring(int beginIndex)截取beginIndex起始的字符串
public String substring(int beginIndex, int endIndex)截取[beginIndex, endIndex)的字符串

String vs StringBuffer

StringBuilder比StringBuffer效率更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值