当前位置: 首页 > 编程日记 > 正文

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


点击进入我的博客

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

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 无意识的递归

    @Overridepublic 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

已过时!

相关文章:

【Python】有道翻译的爬虫实现(后篇)

前面说到,有道翻译和百度翻译不同 (百度翻译是模拟iPhone手机,可能百度翻译用Pc端也会有类似的问题,有道翻译的User—Agent是Pc端) 每一次的salt和sign都不一样,这是什么原因产生的呢? 一、每…

Redis客户端JetCache的单机版和集群版的配置

jetcache基础应用参考这个:阿里巴巴开源的缓存框架JetCache创建缓存 1.JetCache的jedis配置 https://github.com/alibaba/jetcache/wiki/Config_CN jedis配置:apollo版 jetcache.remote.default.type = redis jetcache.remote.default.keyConvertor = fastjson jetcache.r…

5 分钟一次理解 Spring IOC !

今天我们分析一下 spring 的 IOC,梳理一下 IOC 和 DI 的概念与原理。在网上看到开涛有篇文章写的不错,提取其中一部分精华内容并做一些解读。 1.1.IOC是什么? Ioc—Inversion of Control,即“控制反转”,不是什么技术&…

工作两年的编程感想

2019独角兽企业重金招聘Python工程师标准>>> 工作已有两年了,两年不长也不短了,程序员的辛酸苦乐也都体验了一些,故写此博客既为留念,也为接下来的两年留下一个参考点。 首先需要声明的是,本人的工作是Java…

微服务重构心得

现在都在做微服务,看起来就是做服务拆分比较简单,但是实际上真正重构起来又遇到许许多多的问题。 微服务重构常见问题 1.领域驱动模型的困扰 比如听到很多理论比如领域驱动,那么到底需要不需要学习或者使用领域驱动呢? 2.系统的复杂性 重构的时候发现系统之间调用非常…

【Python】百度翻译的爬虫实现(后篇)

这个程序可以实现中英文的自动识别然后进行翻译 看着程序就很好理解。 import requestsimport jsonclass Translation():翻译def __init__(self,content):self.content contentself.url "http://fanyi.baidu.com/basetrans"self.headers {"User-Agent"…

美团即时物流的分布式系统架构设计

背景 美团外卖已经发展了五年,即时物流探索也经历了3年多的时间,业务从零孵化到初具规模,在整个过程中积累了一些分布式高并发系统的建设经验。最主要的收获包括两点: 即时物流业务对故障和高延迟的容忍度极低,在业务复…

Intellij IDEA单元测试提示Test events were not received

Intellij IDEA单元测试时提示Test events were not received 也就是可以运行test方法,也提示成功,但是看不到具体的执行结果。 Intellij IDEA从2019.2.1版本开始,会将Gradle管理的项目的测试代码,默认使用Gradle来运行&#xff0…

Linux下task_struct详解

背景:为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块。在linux系统中,这就是task_stru…

【Python】数据提取xpath和lxml模块(豆瓣电影排行榜的爬虫)

xpath xpath:一门从html中提取数据的语言 xpath语法 1、选择节点(标签) /html/head/meta :能够选中html下的head下的所有的meta标签 2、// :能够从任意节点开始选择 //li:当前页面上所有的li标签 //html/head/link &a…

qt5.6.3下使用firebird

有人把firebird比作数据库界的瑞士军刀,想学习一下其在QT5.6中的使用,于是便开始了一场自己挖坑,自己埋的旅程。 环境说明:win7 64位QT5.6 mingw4.9 32位(好像官网上也没有64位,当然mingw也是32位的&#x…

【Python】数据提取xpath和lxml模块(糗事百科的爬虫)

程序中用到的一些零碎知识点: 一、列表推导式:帮助我们快速生成一堆数据的列表 1、format:字符串格式化的一种方式 >>> ["10月{}日".format(i) for i in range(1,10)] [10月1日, 10月2日, 10月3日, 10月4日, 10月5日, 1…

Linux Performance

性能专家Brendan Gregg的网站。 Linux性能 该页面链接到我创建的各种Linux性能材料,包括右侧的工具图。它们使用大字体来适合滑盖。您也可以将它们打印出来用于办公室墙壁。它们显示:Linux可观察性工具, Linux静态性能分析工具,…

07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器

LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/dunitian/LoTCodeBase/tree/master/LoTUI 先看在LoT.UI里面的应用效果图: 完整Demo:(https://gith…

workerman结合laravel开发在线聊天应用的示例代码

项目背景: 最近由于公司的业务需求,需要用到聊天功能。而且有比较多的个性化需求需要定制。之前使用别人的聊天组件是基于微擎的。如果要移植到普通的H5在逻辑修改还有定制上存在比较多的困难。为此只能克服困难,自己搭建一个吧 什么是Worker…

复杂系统设计 企业开发的困境

复杂系统设计源自我多年对企业复杂系统的设计的一些思考,类似日记吧,不断完善。 为什么从一个大公司的引入架构师甚至架构师组还是很难架构企业开发中的很多问题? 这些问题表现出架构上的复杂性,和业务上的复杂性。 有时候架构…

数据库服务器跟网站服务器间传输慢的问题

数据库服务器和网站服务器是分开的,现在从网站服务器这边查数据比较慢,什么原因??? 一、首先确定服务器之间的网络有没有问题 可以简单的在网站服务器上ping数据库服务器(反过来也可以)&#xf…

【Python】百度贴吧图片的爬虫实现(努力努力再努力)

学会爬取图片以后,第一时间去了张艺兴吧,哈哈哈哈哈哈 一定要放上一张爬取的照片,哼唧 import reimport requestsimport urllibclass Baidutieba():def __init__(self):self.url "http://tieba.baidu.com/p/4876047826?pn{}"#u…

cin、cout的重载

一、cin重载 1.cin为ostream类的成员 2.cin重载应为全局函数&#xff08;毕竟ostream是别人写好的&#xff09; 3.代码 a.核心代码 ostream & operator<<(ostream &os,const A &a)//const A &a是为了避免复制函数的调用 &#xff1b;ostream &o 相当…

第二次冲刺第十天

第二次冲刺今天就结束了&#xff0c;这十天来学会了不少的东西。 简单说一下昨天做的&#xff1a;整合各个部件的功能。 今天&#xff1a;小组进行总结&#xff0c;加强性能。 这十天来遇到的问题&#xff1a; 一&#xff0c;对于网络云端&#xff0c;之前都是其他小组成员在使…

说透泛型类和泛型方法以及Class<T>和Class<?>的差异

泛型类和泛型方法看起来似乎可以实现类似的功能&#xff0c;但是很多人并未真正掌握泛型方法&#xff0c;网上很多文章说了很多还是似是而非&#xff0c;特别是初学者还是搞不明白。 一.关于泛型方法 1.泛型方法可以独立于泛型类 2.泛型方法等效于泛型类里泛型参数方法&…

win10 +python 3.6.4安装scrapy

第一步&#xff1a; 首先&#xff0c;我们先在电脑上安装好python3.6并且配置好环境变量&#xff0c;以可以直接在命令行界面输入python命令可以出现如图的界面为主。 第二步&#xff1a; 升级pip &#xff0c;在cmd窗口中会有提示&#xff0c;没有提示的话就已经是最新版本了…

7 种 Javascript 常用设计模式学习笔记

7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制&#xff0c;并不是 23 种设计模式都常用。 有的是没有使用场景&#xff0c;有的模式使用场景非常少&#xff0c;所以只是列举 7 个常见的模式 本文的脉络&#xff1a; 设计与模式5 大设计原则 7 种常见的设计…

从难免的线上bug说起代码的思考

经常是某司线上又出bug了&#xff0c;然后是给公司造成多少损失&#xff0c;追根究底总是可以找到一些原因&#xff0c;诸如&#xff1a;写代码逻辑考虑不全面&#xff0c;或者代码有硬伤&#xff0c;也有测试不充分&#xff0c;甚至不测试都有&#xff0c;也有是运维的问题等等…

PHP-Fpm应用池配置

//php.net php-fpm配置简介http://php.net/manual/zh/install.fpm.configuration.php//Global Options//pool defined[www]user nobodygroup nobodylisten 127.0.0.1:9000pm dynamicpm.max_children 5pm.start_servers 2pm.min_spare_servers 1pm.max_spare_servers 3s…

【Python】百度首页GIF动画的爬虫

今天百度首页的GIF动画很可爱&#xff0c;就想着用才学的爬虫爬取一下&#xff0c;虽然直接点击“图片另存为”就可以了 import requestsimport urllibclass Gif():def __init__(self):self.url "https://www.baidu.com/"self.headers {"User-Agent": …

CSS题目系列(3)- 实现文字切割效果

描述 有一天逛 Codepen 的时候&#xff0c;看到这么一个效果&#xff1a;将文字上下切开两半。 点进去看了一下代码&#xff0c;发现原理很简单&#xff0c;大概就是通过伪类使用attr()函数获取内容&#xff0c;然后进行定位。 你可以点下方链接查看效果&#xff1a; gd4ark.gi…

Java开发字符串JSON处理

需求很简单就是数据库存json。 数据库字段 varchar 入参request 定义 List<String> 如果不定义这个 而是定义String那么需要加"/转义比较难看 这样就只要入参传这个就行了&#xff1a; "xxxIds": ["33","44"], 数据库也是…

1.JSONObject与JSONArray的使用

参考文献&#xff1a; http://blog.csdn.net/huangwuyi/article/details/5412500 1.JAR包简介 要使程序可以运行必须引入JSON-lib包&#xff0c;JSON-lib包同时依赖于以下的JAR包&#xff1a; commons-lang.jarcommons-beanutils.jarcommons-collections.jarcommons-logging.ja…

【Python】Scrapy爬虫实战(豆瓣电影 Top 250)

今天一天都在弄Scrapy&#xff0c;虽然爬虫起来真的很快&#xff0c;很有效率&#xff0c;但是......捣鼓了一天 豆瓣电影 Top 250&#xff1a;https://movie.douban.com/top250 安装好的scrapy 在你想要的文件夹的目录下输入命令&#xff1a; scrapy startproject douban_m…