Java编程思想笔记13.字符串

一年又一年,字节跳动 Lark(飞书) 研发团队又双叒叕开始招新生啦!
【内推码】:GTPUVBA
【内推链接】:https://job.toutiao.com/s/JRupWVj
【招生对象】:20年9月后~21年8月前 毕业的同学
【报名时间】:6.16-7.16(提前批简历投递只有一个月抓住机会哦!)
【画重点】:提前批和正式秋招不矛盾!面试成功,提前锁定Offer;若有失利,额外获得一次面试机会,正式秋招开启后还可再次投递。

点击进入我的博客

字符串操作是计算机程序设计中最常见的行为

13.1 不可变String

String底层是由char[]实现的,是不可变的。
看起来会改变String的方法,实际上都是创建了一个新的String对象,任何指向它的引用都不可能改变它本身的值。

13.2 重载“+”与StringBuilder

重载操作符的意思是,一个操作符被用于不同的类时,被赋予类特殊的含义(String++=是Java中仅有的两个重载过的操作符,而且Java不允许程序员重载操作符)。
由于String的不可变性,如果你通过多个String相加生成一个String的时候,就需要产生多个中间对象,这造成了一定的效率问题。

StringBuilder的好处
  1. 使用String对字符串进行操作时,编译器会自动帮你转成StringBuilder来进行操作
  2. StringBuilder来操作字符串,编译后的代码通常会更加简单,效率更高
  3. 如果字符串比较简单,可以使用String让编译器为你构造最终的字符串结果;如果要在循环中使用字符串,那么最好自己创建一个StringBuilder

13.3 无意识的递归

    @Override
    public String toString() {
        return "Test" + this;
    }

上述代码中,由于字符串在拼接的时候会自动调用toString()方法,所以会无意思造成递归。
如果你想打印对象的内存地址,应该调用Object.toString()方法

13.4 String上的操作

13.5 格式化输出

13.5.1 System.out.printf()

System.out.printf("%d%n", 123)这种输入方式来自于C,使用特殊的占位符来表示数据将来的位置,这些占位符称作格式修饰符

13.5.2 System.out.format()

System.out.printf()是相同的。

13.5.3 Formatter类

在Java中,所有新的格式化功能都由java.util.Formatter类处理。
Formatter的构造器经过重载可以接受多种输出目的地,不过最常用的还是PrintStreamOutputStreamFile

13.5.4 格式化说明符

%[argument_index$] [flags] [width] [.precision] conversion

  • 可选的argument_index是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由1$引用,第二个参数由2$引用,依此类推(不要忘记$)。
  • 可选flags是修改输出格式的字符集。有效标志集取决于转换类型。
  • 可选width是一个非负十进制整数,表明要向输出中写入的最少字符数,不足则用空格代替。默认数据是右对齐,可以通过-实现左对齐。
  • 可选precision是一个非负十进制整数,通常用来限制最大字符数。特定行为取决于转换类型。
  • 所需conversion是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。

13.5.5 Formatter转换

类型转换字符

13.5.6 String.format()

该方法可以接受Formatter.format()方法一样的参数,但返回一个String对象。

13.6 正则表达式

正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理。

13.6.1 基础

正则表达式就是以某种方式来描述字符串。

Java和其他语言对反斜线\的处理不同
  1. 正常反斜线\:我们需要的就是一个单纯的反斜线,但Java(包括其他语言)中,反斜线也被用来当作转义字符,所以不能直接使用
  2. 文艺反斜线\\:第一个反斜线表示转移,第二个表示正常的反斜线
  3. Java二逼反斜线\\\\:在正则表达式中,反斜线也需要转义,这是如果要插入一条反斜线这需要这种写法。四个反斜线的作用其实是两两一组,第一组的反斜线作为转义符,第二组的反斜线是正常要插入的反斜线。
String中内建的正则匹配方法
  • String#matches()
  • String#split()
  • String#replaceFirst()
  • String#replaceAll()

13.6.2 创建正则表达式

正则表达式完整构造子列表,请参考java.util.regex.Pattern

字符
字符
字符类
字符类
逻辑操作符
逻辑操作符
边界匹配符
边界匹配符

13.6.3 量词

量词:描述了一个模式吸收输入文本的方式:
  1. 贪婪型:默认设置,贪婪表达式会为所有可能的模式发现尽可能多的匹配,导致此问题的一个经典理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它会继续往下匹配;
  2. 勉强型:在贪婪型基础上添加?,这个量词匹配满足模式所需的最少字符数,又称作最少匹配;
  3. 占有型:在贪婪型基础上添加+,目前这种类型的量词只有在Java中才可用并且也更高级,当正则表达式被应用于字符串时,它会产生相当多的状态以便在匹配失败时可以回溯,而占有型量词并不保存这些中间状态,因此它们可以防止回溯,它们被用来防止正则表达式失控,因此可以让正则表达式执行起来更有效。
    三种模式对比

13.6.4 Pattern和Matcher

由于String类功能有限,所以可以通过java.util.regex包下的类实现更加复杂的功能

一般使用方法
    // 1.构建Pattern对象
    Pattern pattern = Pattern.compile("1[0-9]{10}");
    // 2.构建Matcher对象
    Matcher matcher = pattern.matcher("18888888888");
    // 3.使用Matcher方法
    System.out.println(matcher.matches());
Pattern方法
    // 构建Pattern对象
    Pattern pattern = Pattern.compile(regex);
    // 将字符串按照正则表达式分割
    pattern.split("18888888888");
    // 生成Matcher对象判断是否匹配
    pattern.matcher("18888888888");
    // 直接验证正则表达式和字符串是否匹配
    Pattern.matches("1[0-9]{10}", "18888888888");
Pattern标记

Pattern类的compile()方法还有另一个版本,它接受一个标记参数数,以调整匹配的行为:
Pattern Pattern.compile(String regex,int flag);。其中的flag来自以下Pattern类中的常量:

标记参数

Matcher方法

组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号1表示被第一对括号括起的组,依此类推。因此在下面这个表达式:A(B(C))D中有三个组,组0是ABCD,组1是BC,组2是C。

    // 整个字符串是否满足表达式
    matcher.matches();
    // 判断字符串中是否包含表达式
    matcher.lookingAt();
    // 遍历字符串
    matcher.find();
    matcher.find(int start);
    // 返回前一次匹配的结果
    matcher.group();
    matcher.groupCount();
    // 返回前一次匹配操作中寻找到的组的起始索引
    matcher.start();
    // 返回前一次匹配操作中寻找到的组的最后一个字符加一的值
    matcher.end();
    // 替换所有
    matcher.replaceAll();
    // 替换第一个
    matcher.replaceFirst();
    // 渐进式的替换
    matcher.appendReplacement();
    // 将现在Matcher用于一个新的字符串
    matcher.reset();

13.7 扫描输入

到日前为止,从文件或标准输入读取数据还是一件相当痛普的事情。终于,Java SE5新增了Scanner类,它可以大大减轻扫描输入的工作负担。
Scanner有多个重载的构造器,可以接受FilePathInputStreamStringReadable对象。Readable是Java SE5中新加入的一个接口,表示“具有read()方法的某种东西”。

13.7.1 Scanner的定界符

在默认的情况下,Scanner根据空白字符对输入进行分词,但是你可以用正则表达式指定自己所需的定界符:scanner.useDelimiter();。还有一个delimiter()方法,用来返回当前正在作为定界符使用的Pattern对象。

13.7.2 用正则表达式扫描

    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNext("(\\d+)@(\\w+)\\.(\\w+)")) {
        scanner.next("(\\d+)@(\\w+)\\.(\\w+)");
        MatchResult result = scanner.match();
        System.out.println("号码:" + result.group(1));
        System.out.println("域名:" + result.group(2));
        System.out.println("后缀:" + result.group(3));
    }

Scanner可以接受Pattern作为参数,可以扫描复杂的数据。
配合正则表达式扫描时要注意:它仅仅针对下一个输入分词进行匹配,如果你的正则表达式中含有定界符,那永远都不可能匹配成功。

13.8 StringTokenizer

已过时!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容

  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,083评论 1 44
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,111评论 18 139
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 2,990评论 0 7
  • 清早,一个朋友发来消息说刚看见喜欢的那个人发了朋友圈,那是他们分开的第十个月,心里恍如这个雨季,又开始难过,所以来...
    王坤玥儿阅读 426评论 0 0
  • 知识是无穷无尽的,当一个人去不断学习的时候,才知道自己知道的太少太少,才会让自己有自省的意识,所以一定要让自己做一...
    思嘉123阅读 538评论 0 1