Java常用类库API之字符串操作及面试题(含StringBuffer与StringBuilder相关问题)

目录

String类的赋值方式

String类的两种赋值分析

String类字符与字符串操作方法

String类字节与字符串操作方法

String类判断是否以指定内容开头或结尾 

 String类替换操作

 String类字符串截取操作

String类字符串拆分操作

 String类字符串查找操作

String类其它操作方法

StringBuffer与StringBuilder


在Java中String类可以表示一个字符串,String类实际上是使用字符数组存储的。

String类的赋值方式

 (1)一种称为直接赋值(推荐):
(只创建一个对象在字符串常量池中。)

String name = “张三”

(2)通过关键字new调用String的构造方法赋值

面试题:以下代码创建了几个对象?

答:两个。(字符串常量池中一个,堆中还new了一个。)

String name = new String(“张三”)

String类的两种赋值分析

1 、字符串常量池
2 String name = new String(“ 小白 ”) ,在内存中的分析
3 String name = “ 小白 ,在内存中的分析
String 类编译期与运行期分析:
1 、编译期和运行期
2 、代码示例: 4 种情况分析

String类字符与字符串操作方法

序号方法名称类型描述
1
public char charAt(int index)
普通
根据下标找到指定的字符
2
public char[] toCharArray()
普通
以字符数组的形式返回全部的字符串内容
3
public String(char[] value)
构造
将全部的字符数组变为字符串
4
public String(char[] value,int offset,int count)
构造
将指定范围的字符数组变为字符串

(拓展:Method call expected这个报错是因为要用new创建对象,在使用public String(char[] value)等构造方法时经常会碰到类似的错误)

用法演示:

public class Demo {
    public static void main(String[] args) {
        String letter="abcdefg";
        System.out.println(letter.charAt(3));
        char[]a=letter.toCharArray();
        System.out.println(Arrays.toString(a));
        String m=new String(a);
        System.out.println(m);
        String a1=new String(a,3,2);
        System.out.println(a1);
    }

}

运行结果:

d
[a, b, c, d, e, f, g]
abcdefg
de

String类字节与字符串操作方法

序号方法名称类型描述
1
public byte[] getBytes()
普通
将字符串变为字节数组
2
public String(byte[] bytes)
构造
将字节数组变为字符串
3
public String(byte[] bytes,int offset,int
length)
构造
将指定范围的字节数组变为字符串
4
public String(byte[] bytes,
String charsetName)
构造
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

(注意:charsetname是指所用编码名称,将内存中的unicode编码转换为charsetname格式。)

用法演示: 

public class Demo {
    public static void main(String[] args) {
        String letter="abcdefg";
        System.out.println(letter.getBytes());
        byte[] byt = letter.getBytes();
        for (byte b : byt) {
            System.out.println(b);
        }
        String a=new String(byt);
        System.out.println(a);
        String a1=new String(byt,3,2);
        System.out.println(a1);
        try{
        String a2=new String(byt,"utf-8");
            System.out.println(a2);}
        catch (Exception e)
        {

        }

    }

}

运行结果:

[B@6f496d9f
97
98
99
100
101
102
103
abcdefg
de
abcdefg

(注意:在使用

public String(byte[] bytes, String charsetName)容易出现 这个异常,因为解码不一定准确,加上try  catch就可以啦) 

String类判断是否以指定内容开头或结尾 

序号方法名称类型描述
1
public boolean startsWith(String prefix)
普通
从第一个位置开始判断是否以指定的内容开头
2
public boolean startsWith(String prefix,int toffset)
普通
从指定的位置开始判断是否以指定的内容开头
3
public boolean endsWith(String suffix)
普通
判断是否以指定的内容结尾

用法演示:

public class Demo {
    public static void main(String[] args) {
        String letter="abcdefg";
        System.out.println(letter.startsWith("a"));
        System.out.println(letter.startsWith("d", 3));
        System.out.println(letter.endsWith("g"));
    }

}

运行结果:

true
true
true

 String类替换操作

序号方法名称类型描述
1
public String replace(char oldChar,char newChar)
普通
替换指定字符
2
public String replace(CharSequence target, CharSequence replacement)
普通
替换指定字符串
3
public String replaceAll(String regex,String replacement)
普通
替换指定的字符串
4
public String replaceFirst(String regex,String replacement)
普通
替换第一个满足条件的字符串

(注意:regex指的是正则表达式。)

用法演示:

public class Demo {
    public static void main(String[] args) {
        String letter="abcdefg";
        System.out.println(letter.replace("a", "z"));
        System.out.println(letter.replace("ab", "xy"));
        System.out.println(letter.replaceAll("^[a-z]+$", "121564"));
        System.out.println(letter.replaceFirst("^[a-z]", "1"));
    }

}

运行结果:

zbcdefg
xycdefg
121564
1bcdefg 

 String类字符串截取操作

序号
方法名称
类型描述
1
public String substring(int beginIndex)
普通
从指定位置开始一直截取到末尾
2
public String substring(int beginIndex,int endIndex)
普通
截取指定范围的字符串

public class Demo {
    public static void main(String[] args) {
        String letter="abcdefg";
        System.out.println(letter.substring(3));
        System.out.println(letter.substring(2, 4));
    }

}

运行结果:

 defg
 cd

String类字符串拆分操作

序号方法名称类型描述
1
public String[] split(String regex)
普通
按照指定的字符串拆分
2
public String[] split(String regex,int limit)
普通
拆分字符串,并指定拆分的个数

用法示例: 

import java.util.Arrays;

public class Demo {
    public static void main(String[] args) {
        String letter="a0bc0d0e0fg";
       String[] s=letter.split("0");
        System.out.println(Arrays.toString(s));
        String[] s1=letter.split("0",2);
        System.out.println(Arrays.toString(s1));
    }

}

运行结果:

[a, bc, d, e, fg]
[a, bc0d0e0fg] 

 String类字符串查找操作

序号方法名称类型描述
1
public boolean contains(String s)
普通
返回一个字符串是否存在
2
public int indexOf(int ch)
普通从头查找指定的字符是否存在,char -> int,如果存在则返回位置,如果不存在则返回“-1”。
3
public int indexOf(int ch,int
fromIndex)
普通从指定位置查找指定的字符是否存在,char -> int,如果存在则返回位置,如果不存在则返回“-1”。
4
public int indexOf(String str)
普通从头查找指定的字符串是否存在,如果存在则返回位置,如果不存在则返回“-1"
5
public int indexOf(String str,int
fromIndex)
普通从指定位置查找字符串是否存在,如果存在则返回位置,如果不存在则返回“-1”。
6
public int lastIndexOf(int ch)
普通从字符串的最后向前查找,指定的字符是否存在,如果存在则返回位置,如果不存在则返回“-1”。
7
public int lastIndexOf(int ch,int fromIndex)
普通从字符串的指定的末尾向前查找,指定的字符是否存在,如果存在则返回位置,如果不存在则返回“-1”。
8
public int lastIndexOf(String str)
普通从字符串的最后向前查找,指定的字符串是否存在,如果存在则返回位置,如果不存在则返回“-1”。
9
public int lastIndexOf(String str,int fromIndex)
普通从字符串的指定的末尾向前查找,指定的字符串是否存在,如果存在则返回位置,如果不存在则返回“-1”。

用法示例: 

public class Demo {
    public static void main(String[] args) {
        String letter="abcdefg";
        System.out.println(letter.contains("a"));
        System.out.println(letter.indexOf("a"));
        System.out.println(letter.indexOf("a", 2));
        System.out.println(letter.indexOf("bc"));
        System.out.println(letter.indexOf("cd", 2));
        System.out.println(letter.lastIndexOf("a"));
        System.out.println(letter.lastIndexOf("a", 2));
        System.out.println(letter.lastIndexOf("bc"));
        System.out.println(letter.lastIndexOf("bc", 3));
        
    }

}

运行结果:

true
0
-1
1
2
0
0
1

String类其它操作方法

序号方法名称类型描述
1
public boolean isEmpty()
普通
判断是否为空,指的是内容为空“ ""
2
public int length()
普通
取得字符串的长度
3
public String toLowerCase()
普通
转小写
4
public String toUpperCase()
普通
转大写
5
public String trim()
普通
去掉开头和结尾的空格,中间的空格不去
6
public String concat(String str)
普通
字符串连接操作
import java.util.Locale;

public class Demo {
    public static void main(String[] args) {
        String letter="  abcdefg  XYZ  ";
        String m="llly";
        System.out.println(letter.isEmpty());
        System.out.println(letter.length());
        System.out.println(letter.toLowerCase(Locale.ROOT));
        System.out.println(letter.toUpperCase(Locale.ROOT));
        System.out.println(letter.trim());
        System.out.println(letter.concat(m));

    }

}

运行结果:

 false
16
  abcdefg  xyz  
  ABCDEFG  XYZ  
abcdefg  XYZ
  abcdefg  XYZ  llly

StringBufferStringBuilder

在实际开发当中,我们经常会使用到字符串连接的操作,如果用String来操作,则使用“+”号完成字符串的连接操作。
使用String连接字符串,代码性能会非常低,因为String的内容不可改变,在这个过程中会创建很多对象。
解决这个问题的方法是使用StringBuffer或StringBuilder,使用它们的好处是不产生重复的新对象 

StringBuilder是一个与 StringBuffer 兼容的 API,但不保证同步。该类被设
计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种
情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比
StringBuffer 要快。

面试题:String和StringBuffer和StringBuilder的区别

String:不可变字符串

StringBuffer:可变字符串,效率低,线程安全(所有公开方法都是 synchronized 修饰,但StringBuilder没有)(适合多线程使用)

StringBuilder :可变字符序列,效率远远高于StringBuffer,线程不安全(不能同步访问),但由于效率高,在不要求线程安全的情况下,多数(单线程)情况下建议使用StringBuilder

StringBuffer使用了缓存区,StringBuilder没有使用缓存区,所以没有修改数据的情况下,多次调用StringBuffer的toString方法获取的字符串是共享底层的字符数组的。而StringBuilder不是共享底层数组的,每次都生成了新的字符数组

(拓展:1.synchronized是Java中的关键字,synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性,因此StringBuffer(被上锁)性能比StringBuilder差

2.String对象的相加底层调用的是StringBuilder对象,调用了append方法和toString方法,由于其中还有StringBuilder对象的创建过程和toString方法中字符数组拷贝的过程,因此String效率很低) 

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态特好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值