黑马程序员--String类、StringBuffer类和StringBuilder类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、           定义

1、三者的特征

String字符串常量,字符串对象一旦被初始化就不会被改变。

StringBuffer字符串变量(线程安全)底层是char[], 数组初始化的时候就定下了大小, 如果不断的append 肯定有超过数组大小的时候,我们是不是定义一个超大容量的数组,太浪费空间了。就像ArrayList 的实现,采用动态扩展,每次 append 首先检查容量,容量不够就先扩展,然后复制原数组的内容到扩展以后的数组中。

StringBuilder字符串变量(非线程安全),除了线程不同步以外,其他功能与StringBuffer一致。

2、API说明

查看 API 会发现,String、StringBuffer、StringBuilder 都实现了 CharSequence 接口,内部都是用一个char数组实现,虽然它们都与字符串相关,但是其处理机制不同。

String:是不可改变的量,也就是创建后就不能在修改了。

StringBuffer:是一个可变字符串序列,它与 String 一样,在内存中保存的都是一个有序的字符串序列(char 类型的数组),不同点是 StringBuffer 对象的值都是可变的。

StringBuilder:与 StringBuffer 类基本相同,都是可变字符换字符串序列,不同点是 StringBuffer 是线程安全的,StringBuilder 是线程不安全的。

        注意:开发中一般使用StringBuilder,因为StringBuilder执行效率高,需要线程安全可以自行加锁。

升级三因素:

                              1、提高效率

                              2、简化书写

                              3、提高安全性。

 

二、           使用场景

1、使用 String 类的场景:在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算。

2、使用 StringBuffer 类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用 StringBuffer。

3、使用 StringBuilder 类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用 StringBuilder。

三、           常用方法

1、获取

int length();   获取字符串中字符的个数(长度);

char charAt(int index);    根据位置获取字符;

 int indexOf(int ch);     根据字符获取在字符串中的位置;

从指定位置开始查找ch第一次出现的位置:

int indexOf(int ch,int fromIndex);

int indexOf(String str);

int indexOf(String str,int fromIndex);

根据字符串获取在字符串中第一次出现的位置。

int lastIndexOf(int ch);

int lastIndexOf(int ch,int fromIndex);

int lastIndexOf(String str);

int lastIndexOf(String str,int fromIndex);   

获取字符串中的一部分字符串,也叫子串。

String substring(int beginIndex,int endIndex);
String substring(int beginIndex);

示例:

public classStringMethodDemo{
      public static void main(String[] args){
           StringMethodDemo();
     }
 
      public static void StringMethodDemo(){
           String s = "abcdae";
           int a = s.length();//获取字符串长度
           char b =s.char charAt(2);//获取2角标字符
           int c = s.int indexOf(‘c’); //获取’c’在字符串中的位置
           System.out.println( "substring:" +s.substring(2));//从2角标位置开始获取字符串部分
           System.out.println( "substring:" +s.substring(2,4));//获取角标2-4间的子字符串,包含头不包含尾
     }
}


2、 转换\修改

将字符串变成字符串数组(字符串的切割)
    String[] split(String regex);涉及到正则表达式。

将字符串变成字符数组
    char[] toCharArray();

将字符串变成字节数组

                char[] getBytes();

将字符串中的字母转成大小写

                String toUpperCase();大写
                StringtoLowerCase();小写

 将字符串中的内容进行替换
    String replace(char oldCh,char newCh);
    String replace(String s1,String s2);

示例:

public classStringMethodDemo{
      public static void main(String[] args){
           StringMethodDemo();
     }
      public static void StringMethodDemo(){
           String s1 = "java";
           String s2 = s1.replace( 'a','o' );//将S1中’a’字符替换为’o’
           String s3 = s1.replace( 'q','o' );// 将S1中’q’字符替换为’o’,s1中没有q字符,未替换
           System.out.println(s2);
           System.out.println(s3);
           System.out.println(s1 == s3);//S1与S3引用的是同一个对象,结果为turn
     }
}


在StringBuffer中添加元素

StringBuffer append(data);
    StringBuffer insert(index,data);

在StringBuffer中删除元素

                StringBuffer delete(int start,int end);包含头,不包含尾。
                StringBufferdeleteCharAt(int index):删除指定位置的元素。

 

3、 判断

两个字符串内容是否相同呢?
    boolean equals(Object obj);
    boolean equalsIgnoreCase(String str);忽略大小写比较字符串内容。

字符串中是否包含指定字符串
    boolean contains(String str);

字符串是否以指定字符串开头,是否以指定字符串结尾
    boolean startsWith(String str);
    boolean endsWith(String str);

int compareTo(String str);    如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。

练习:

子串”nba”在整串中出现的次数   "nbaernbatynbauinbaopnba"

思路:

               i.         找的子串是否存在,如果存在获取其出现的位置,这个可以使用indexOf完成。

              ii.          如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,而剩余字符串的起始位是出现位置+子串的长度。

             iii.         以此类推,通过循环完成查找,如果找不到就是-1,并且每次找到用计数器记录。

代码:

public classStringTest{
      public static void main(String[] args){
           String str ="nbaernbatynbauinbaopnba";
           String key = "nba";
           
            int count = getKeyStringCount(str,key);
            System.out.println( "count = " +count);
     }
 
     public static int getKeyStringCount(String str,String key){
            //1、定义计数器
            int count = 0;
 
            //2、定义变量记录key出现的位置
            int index = 0;
 
            while((index = str.indexOf(key)) != -1) //如果包含,则继续
{
//从找到的子串位置后一位开始获取 
str = str.substring(index + key.length());
                 count++;
           }
 
            return count;
     }
}
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值