Java中的String,StringBuilder,StringBuffer三者的方法及关系

    java中String的常用方法

1.String的常用方法

  • 封装一个 char[] 数组的对象
  • 不可变
  • 字符串的加号连接,效率低

1.charAt(int index)  获得指定下标字符


    public static void main(String[] args) {
        System.out.println("输入回文:");
        String s = new Scanner(System.in).nextLine();
        if(ishuiwen(s)) {
            System.out.println("是回文");
        }else {
            System.out.println("不是回文");
        }
    }

    private static boolean ishuiwen(String s) {
        for (int i = 0,j=s.length()-1; i < j; i++,j--) {
            if(s.charAt(i)==s.charAt(j)) {
                return true;
            }
        }
        return false;
    }

2.compareTo(String anotherString) 比较字符串大小
3compareToIgnoreCase(String str)  字符顺序比较
4contains(CharSequence s) 是否包含子串
5endsWith(String suffix) 判断后缀
6equals(Object anObject)
7equalsIgnoreCase(String anotherString) 相等判断
8getBytes()
9getBytes(Charset charset) 编码转换
10 indexOf(String str)


    public static void main(String[] args) {
        System.out.println("输入邮箱:");
        String s = new Scanner(System.in).nextLine();
        String name =getName(s);
        System.out.println(name);
    }

    private static String getName(String s) {
        int a =s.indexOf("@");//@符号的下标位置
        if (a==-1) {
            return "email格式错误";
        }
        String str1 =s.substring(0, a);//提取0到a范围的子串
        return str1;
    }

11 indexOf(String str, int fromIndex) 查找子串出现的位置,找不到返回-1
12 isEmpty() 是否是空串 “”
13 lastIndexOf(String str) 从后向前找子串位置,找不到返回-1
14 length() 字符长度
15 replace(char oldChar, char newChar) 替换字符
16 startsWith(String prefix)  判断前缀
17 substring(int beginIndex)
18 substring(int beginIndex, int endIndex) 截取子串
19 toCharArray() 获得内部char[]数组
20 toLowerCase() 变成小写
21 toUpperCase() 变成大写
22 trim() 去除两端空白字符
23 String.valueOf() 任何数据转成字符串
24concat()连接两个字符串


2 StringBuilder、StringBuffer

  • 内部封装一个 char[]
  • 可变的字符序列
  • 提供一组对内部字符修改的方法
  • 常用来代替字符串,做高效率的字符串连接运算
    append()方法,追加字符串

StringBuilder

  高效的字符串连接

创建对象

  • new StringBuilder()
  • new StringBuilder(“abc”)

方法

  1. append() 追加
  2. delete(int start, int end) 删一段[start, end)
  3. deleteCharAt(int index) 删一个
  4. insert(int offset, String str)  指定位置插入
  5. replace(int start, int end, String str) 替换指定区间
  6. reverse() 翻转
  7. setCharAt(int index, char ch) 替换指定位置的字符
        StringBuilder sb = new StringBuilder("abc");
        sb.append("def")
        .append("ghi")
        .append("sd")
        .deleteCharAt(3)
        .insert(2, "sdf");

3.Java中的String,StringBuilder,StringBuffer三者的区别

自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便于大家观看:

  1. 运行速度:StringBuilder > StringBuffer > String
      理由:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
      
1 String str="abc";
2 System.out.println(str);
3 str=str+"de";
4 System.out.println(str);

代码分析:
  如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
  而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
  另外,有时候我们会这样对字符串进行赋值
  

1 String str="abc"+"de";
2 StringBuilder strb=new StringBuilder().append("abc").append("de");
3 System.out.println(str);
4 System.out.println(strb.toString());

输出结果也是“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和
String str=”abcde”;
是完全一样的,所以会很快,而如果写成下面这种形式

1 String str1="abc";
2 String str2="de";
3 String str=str1+str2;

那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。

 2. 再来说线程安全
   StringBuilder是线程不安全的,而StringBuffer是线程安全的
  如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
  
 3.总结一下
   首先String、StringBuffer、StringBuilder在JDK中都被定义为final类,这意味着他们不可以被继承。
  String:适用于少量的字符串操作的情况(不可变的,性能差,线程安全,效率非常低)
  StringBuilder:适用于单线程下在字符缓冲区进行大量的字符串操作的情况(可变的,方法没加了同步锁,非线程安全,效率高)
  StringBuffer:适用多线程下在字符缓冲区进行大量的字符串操作的情况 (可变的,方法加了同步锁,线程安全,效率低)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值