暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

字符串

码农大腿哥 2021-02-07
193
前言:

字符串也是数据结构?没错,字符串还真的是一种数据结构!!!

在开发中,我们经常要处理一些非数值的数据,也就是 '字符' 的处理。为了快速处理多个字符,产生了字符串的概念

比如,我们在搜索引擎中输入要查询的内容后,就要进行字符串的查找匹配工作。今天我们就来研究 '字符串' 这种数据结构

本篇目标:

1.熟练掌握String类、StringBuilder类的使用
2.掌握一些特殊的字符串操作代码逻辑
3.体会ASCII码和字符互相转化的作用



01

字符串介绍

1.字符串概念

串(String)是由零个或多个字符组成的有限序列,又叫字符串

字符串是一种线性结构,它是由0个或多个字符组成的一个有序整体。和其他结构不同的是,字符中的元素只能是字符

几个特别的字符串:

空串:含有0个字符的串,例如s = ""

空格串:只包含空格的串,例如s = "  "

子串:字串就是字符串中任意几个连续字符组成的子序列

2.字符串结构

字符串是由一个个独立的字符组成的

字符串

3.存储结构

字符串是一种逻辑结构,也是线性的。字符串既可以用数组实现,也可以用链表实现

Java中常用的String类就是由Char类型的数组实现的



02

字符串基本操作

字符串的基本操作和其它线性结构有很大差别。之前提到的数组、队列等更关注单个元素的操作,也就是常说的增、删、改、查。字符串更多的是对字串的操作,如字串的查找、截取、替换等


高级语言中一般都提供了操作字符串的工具,重点是掌握其用法。Java 提供了 String 类来创建和操作字符,我们主要掌握String和StringBuilder类的使用


1.String类


1)String类的常用方法


    String str1 = "jack";
    String str2 = "mary";
    // 属性
    str1.isEmpty(); //是否为空
    str1.length();  //字符串长度
    // 查找
    str1.charAt(1);       //查找字符
    str1.indexOf('a');    //查找字符首位置
    str1.lastIndexOf('a');//查找字符末位置
    // 修改与转换
    str1.replace('a','b');//a替换成b
    str1.toCharArray();   //转成字符类型的数组
    // 合并与拆分
    str1.concat(str2);   //连接两个字符串
    str1.substring(2,3); //截取字符串
    //包含与比较
    str1.contains(str2);  //是否包含该子串
    str1.compareTo(str2); //比较字符是否相等


    2.StringBuilder类


    Java中String 是不可变的。存放字符的数组是用final声明的,因此只能赋值一次,不可再更改。只要更改字符串内容就会产生新对象

    StringBuilder 类的对象修改后不会产生新的未使用对象如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuilder


      StringBuilder sb = new StringBuilder();
      // 属性
      sb.capacity(); //当前容量,底层数组的容量,默认16
      sb.length(); //字符个数
      // 方法
      sb.append("bigleg is a gentleman"); //追加字符
      sb.insert(10 , "not ");//插入字符
      sb.delete(10 , 14); //删除字符
      sb.toString();         //转成字符串




      03

      字符串进阶操作


      虽然String类提供了很多现成的方法,不过有些场景还是要自己实现。比如字符统计、字符串去重等


        //ASCII码和字符互转
        int ascii = (byte)'a';
        char c = (char)97;
        //统计字符出现个数并打印
        public static void countChar(String str){
        int[] cnt = new int[256];
        for (int i = 0; i < str.length(); i++){
                cnt[str.charAt(i)]++; //字符转成ASCII码值, 作为索引传入
        }
        for (int i = 0; i < 256; i++) {
        if(cnt[i] != 0)
        System.out.println((char)i + " " +cnt[i]);
        }
        }
        //去除重复字符
        public String removeRepeatChar(String str){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
        char charWord = str.charAt(i);
        int firstPosition = str.indexOf(charWord); //字符首次出现的位置
        if( firstPosition == i){
        sb.append(charWord);
        }
        }
        return sb.toString();
        }
        //保留重复字符
        public String collectRepeatChar(String str){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
        char charWord = str.charAt(i);
        int firstPosition = str.indexOf(charWord);
        int lastPosition = str.lastIndexOf(charWord);
        if( firstPosition != i && lastPosition == i){
        sb.append(charWord);
        }
        }
        return sb.toString();
        }




        你学废了吗?

        — END  —


        文章转载自码农大腿哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论