字符串类


字符串是Java程序中经常要处理的对象,因此有必要熟练的掌握字符串的各种处理方法,有助于提高我们开发的效率。Java中与字符串有关的类有String类、StringBuilder类、StringBuffer类。

1、String类

char类型只能表示单个字符,如果想使用多个字符,那么可以使用String类。Java中将字符串视作对象处理,可以使用String类来创建字符串对象。api文档中的说明如下:
在这里插入图片描述

1.1、构造方法

提供的构造方法如下:
在这里插入图片描述
在这里插入图片描述
常用的构造方法有以几种:

//无参构造
public String()
//参数为char数组,数组中的字符从头连到尾
public String(char []chars)
//按指定索引连接长度为len的字符串
public String(char []chars,int offset,int len)
//以指定的内容构造String对象
public String(String str)

以代码说明:

    public static void main(String[] args) {
        char[] chs = {'我', '喜', '欢', '中', '国' };
        String str = new String(chs);
        System.out.println(str);
        String str2 = new String(chs, 3, 2);
        System.out.println(str2);
        String str3 = new String("我喜欢中国");
        System.out.println(str3);
        String str4 = "我喜欢中国";
        System.out.println(str4);
    }

在这里插入图片描述

1.2、常用方法

api文档中的所有方法如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下对常用的方法进行说明:

  • charAt(int index) :返回char指定索引处的值。
  • compareTo(String anotherString):按字典顺序比较两个字符串。
  • compareToIgnoreCase(String str):按字典顺序比较两个字符串,忽略大小写差异。
  • concat(String str):将指定的字符串连接到该字符串的末尾。
  • contains(s):是否包含某个字符序列或子串,返回布尔值。
  • endsWith(String suffix):测试此字符串是否以指定的后缀结尾。
  • equals(Object anObject):将此字符串与指定对象进行比较。
  • equalsIgnoreCase(String anotherString):将此String与其他String比较,忽略大小写。
  • format():格式化字符串。
  • getBytes(Charset charset):使用给定的charset将该String编码为字节序列,将结果存储到新的字节数组中。
  • getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):将此字符串中的字符复制到目标字符数组中,返回char数组。
  • hashCode():返回此字符串的哈希码值。
  • indexOf(a):返回指定字符或子串第一次出现的字符串内的索引,a可以是char类型也可以是String类型。
  • isEmpty():返回true如果,且仅当 length()为0 ,判断字符串为空基本不用此方法。
  • lastIndexOf(a):返回指定字符或子串最后一次出现的字符串中的索引,从指定的索引开始搜索或从头开始搜索。
  • length():返回此字符串的长度。
  • matches(String regex):告诉这个字符串是否匹配给定的regular expression,与正则表达式有关,返回布尔值。
  • replace(char oldChar, char newChar):替换字符串中的所有字符。
  • replaceAll(String regex, String replacement) :替换字符串中的所有子串。
  • replaceFirst(String regex, String replacement) :替换字符串中的第一个子串。
  • split(String regex):以指定的分隔符分割字符串,返回字符串数组。
  • startsWith(String prefix):测试此字符串是否以指定的前缀开头。
  • substring(int beginIndex):截取字符串,可以指定截取的范围。
  • toCharArray():将此字符串转换为新的字符数组。
  • toLowerCase():将字符串转换为小写。
  • toUpperCase():将字符串转换为大写。
  • trim():返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。

在代码中进行测试:

    public static void main(String[] args) {
        String str = " 东风夜放 花夜千树 ";
        String str2 = str;
        String str3 = "I am a Chinese";
        String str4 = "i am a chinese";
        System.out.println("索引为2的字符是:" + str.charAt(2));
        System.out.println("比较两个字符串的位置:" + str.compareTo(str2));
        System.out.println("比较两个字符串的位置:" + str.compareTo(str3));
        System.out.println("连接字符串:" + str.concat(str2));
        System.out.println("是否包含花字?" + str.contains("花"));
        System.out.println("是否包含东风?" + str.contains("东风"));
        System.out.println("是否以I开头?" + str3.startsWith("I"));
        System.out.println("是否以ese结尾?" + str3.endsWith("ese"));
        System.out.println("两个字符串是否相等?" + str.equals(str2));
        System.out.println("两个字符串是否相等?" + str3.equals(str4));
        System.out.println("两个字符串是否相等?" + str3.equalsIgnoreCase(str4));
        System.out.println("a字符第一次出现的位置是:" + str3.indexOf('a'));
        System.out.println("am子串第一次出现的位置是:" + str3.indexOf("am"));
        System.out.println("a字符最后一次出现的位置是:" + str3.lastIndexOf('a'));
        System.out.println("am子串最后一次出现的位置是:" + str3.lastIndexOf("am"));
        System.out.println("字符串的长度是:" + str.length());
        System.out.println("去除前后导空格后字符串的长度是:" + str.trim().length());
        System.out.println("替换串中的所有空格成加号:" + str.replace(' ', '+'));
        System.out.println("替换串中的所有子串:" + str3.replaceAll("am", "确实是"));
        System.out.println("替换串中的第一个位置的子串:" + str3.replaceFirst("am", "确实是"));
        String s = "湖北,重庆,四川,广东,广西,江西";
        // 分割字符串
        String[] strsStrings = s.split(",");
        for (int i = 0; i < strsStrings.length; i++) {
            System.out.println("第" + (i + 1) + "个元素是:" + strsStrings[i]);
        }
        System.out.println("截取字符串:" + str.substring(3));
        System.out.println("截取字符串:" + str.substring(3, 7));
        // 转为字符数组
        char[] chs = str.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            System.out.println("第" + (i + 1) + "个字符是:" + chs[i]);
        }
        System.out.println("全部转换为大写:" + str3.toUpperCase());
        System.out.println("全部转换为小写:" + str3.toLowerCase());
    }

执行,控制台:
在这里插入图片描述
在这里插入图片描述
需要说明的是,以上的操作并不会影响原来的字符串,也就是说字符串一旦确定是改变不了的,改变的只是副本。源码如下:
在这里插入图片描述
String类是final修饰的,也就是不可变的。

1.3、字符串的连接

使用+连接或者concat方法就可以了,但是不建议使用。

    public static void main(String[] args) {
        String s0 = "去年今日此门中,";
        String s2 = "人面桃花相映红。";
        String s3 = "人面不知何处去,";
        String s4 = "桃花依旧笑春风。";
        System.out.println(s0 + s2 + s3 + s4);
        System.out.println(s0.concat(s2).concat(s3).concat(s4));
    }

在这里插入图片描述

2、StringBuilder类

如果想使用可变的字符串,那么可以使用StringBuilder类,它是线程不安全的。api文档说明如下:
在这里插入图片描述

2.1、构造方法

在这里插入图片描述
在这里插入图片描述

就这3种,以下代码测试:

    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        System.out.println(sb.toString().length());
        StringBuilder sb2 = new StringBuilder("爱江山更爱美人!");
        System.out.println(sb2.toString());
    }

在这里插入图片描述

2.2、常用方法

api文档中提供的所有方法如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下对常用的几种方法进行说明:

  • append(s):在末尾追加新的内容。
  • capacity() :返回当前的容量。
  • charAt(int index):返回char在指定索引在这个序列值。
  • delete(int start, int end):删除指定范围的内容。
  • deleteCharAt(int index):删除指定位置的字符。
  • indexOf(String str):返回指定子字符串第一次出现的字符串内的索引,可以从指定的位置开始搜索。
  • lastIndexOf(String str): 返回指定子字符串最后一次出现的字符串内的索引,可以从指定的位置开始搜索。
  • insert():在指定位置插入内容。
  • length():返回长度(字符数)。
  • replace(int start, int end, String str):替换指定范围内的内容。
  • reverse():字符串反转。
  • setCharAt(int index, char ch):替换指定位置的字符。
  • setLength(int newLength):设置串的长度。
  • subSequence(int start, int end):返回指定范围内子串。
  • substring(…):截取子串,可以指定截取范围。
  • toString():返回表示此顺序中的数据的字符串。

以下在代码中测试:

    public static void main(String[] args) {
        String s = "abcdefghijklmnopqrstuvwxyz";
        StringBuilder sb = new StringBuilder(s);
        // 容量为初始容量16+字符序列的长度26,应该是42
        System.out.println("容量为:" + sb.capacity());
        System.out.println("原串为:" + sb.toString());
        // 添加内容
        sb.append("云过梦无痕");
        System.out.println(sb.toString());
        System.out.println("索引位26的字符为:" + sb.charAt(26));
        // 删除一段内容
        sb.delete(27, 29);
        System.out.println(sb.toString());
        // 删除指定位置的字符
        sb.deleteCharAt(sb.length() - 1);
        System.out.println(sb.toString());
        System.out.println("云第一次出现的位置:" + sb.indexOf("云"));
        System.out.println("云最后一次出现的位置:" + sb.lastIndexOf("云"));
        // 执行位置插入内容
        sb.insert(26, "理想乡");
        System.out.println(sb.toString());
        System.out.println("串的长度:" + sb.length());
        System.out.println("串反转:" + sb.reverse());
        // 替换指定范围内的内容
        sb.replace(29, 31, "有没有一首歌");
        System.out.println(sb.toString());
        // 替换指定位置的字符
        sb.setCharAt(sb.length() - 1, 'g');
        System.out.println(sb.toString());
        // 设置长度
        sb.setLength(sb.length() - 1);
        System.out.println(sb.toString());
        // 注意,返回子串不是截取
        System.out.println("返回子串:" + sb.subSequence(0, 5));
        System.out.println(sb.toString());
        // 截取子串,也不改变原串
        sb.substring(0,5);
        System.out.println(sb.toString());
        System.out.println(sb);
    }

控制台输出:
在这里插入图片描述
StringBuilder中,字符序列是可变的,但是非线程安全的,适用于单线程。

3、StringBuffer类

其实StringBuffer类只是在StringBuilder类的基础上加了锁,所以StringBuffer类是线程安全的,它也是字符序列可变的,多线程中可以使用StringBuffer类,非必要的话不建议使用,因为要维持线程安全会消耗额外的资源。源码对比:
在这里插入图片描述
在这里插入图片描述
api文档说明如下:
在这里插入图片描述
方法的话和StringBuilder是一模一样的,可以参考StringBuilder类。

4、总结

掌握字符串有关的三个类型:String、StringBuilder、StringBuffer,熟练使用字符串处理的相关方法,String类是字符序列不可变的,StringBuilder和StringBuffer是字符序列可变的,区别它们的不同点,有助于提高我们的开发效率,因为字符串的处理是十分常见的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值