《Java编程思想》笔记13.字符串
点击进入我的博客
字符串操作是计算机程序设计中最常见的行为
13.1 不可变String
String
底层是由char[]
实现的,是不可变的。
看起来会改变String
的方法,实际上都是创建了一个新的String
对象,任何指向它的引用都不可能改变它本身的值。
13.2 重载“+”与StringBuilder
重载操作符的意思是,一个操作符被用于不同的类时,被赋予类特殊的含义(String
的+
和+=
是Java中仅有的两个重载过的操作符,而且Java不允许程序员重载操作符)。
由于String
的不可变性,如果你通过多个String
相加生成一个String
的时候,就需要产生多个中间对象,这造成了一定的效率问题。
StringBuilder的好处
- 使用
String
对字符串进行操作时,编译器会自动帮你转成StringBuilder
来进行操作 - 用
StringBuilder
来操作字符串,编译后的代码通常会更加简单,效率更高 - 如果字符串比较简单,可以使用
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
的构造器经过重载可以接受多种输出目的地,不过最常用的还是PrintStream
、OutputStream
和File
。
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和其他语言对反斜线\
的处理不同
- 正常反斜线
\
:我们需要的就是一个单纯的反斜线,但Java(包括其他语言)中,反斜线也被用来当作转义字符,所以不能直接使用 - 文艺反斜线
\\
:第一个反斜线表示转移,第二个表示正常的反斜线 - Java二逼反斜线
\\\\
:在正则表达式中,反斜线也需要转义,这是如果要插入一条反斜线这需要这种写法。四个反斜线的作用其实是两两一组,第一组的反斜线作为转义符,第二组的反斜线是正常要插入的反斜线。
String中内建的正则匹配方法
- String#matches()
- String#split()
- String#replaceFirst()
- String#replaceAll()
13.6.2 创建正则表达式
正则表达式完整构造子列表,请参考java.util.regex.Pattern
。
字符
字符类
逻辑操作符
边界匹配符
13.6.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
有多个重载的构造器,可以接受File
、Path
、InputStream
、String
和Readable
对象。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
已过时!
《Java编程思想》笔记13.字符串相关推荐
- Java编程思想笔记——容器深入研究1
完整的容器分类法 Java SE5新添加了: 1.Queue接口(LinkedList已经为实现该接口做了修改)及其实现PriorityQueue和各种风格的BlockingQueue. 2.Conc ...
- Java编程思想笔记(持有对象)
1.泛型和类型安全的容器 2.基本概念 3.添加一组元素:Arrays.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数),并将其转换为一个LIst对 ...
- java 编程思想 笔记_java编程思想笔记20170215
importjava.util.ArrayList;importjava.util.List;public classTest {public static voidmain(String[] arg ...
- 【Java编程思想笔记】-集合1
1.为什么要用集合? 一般情况下,数组是保存一组对象(或基本数据类型)最有效的方式.但是数组有着固定的尺寸,而在更一般的情况下,我们在写程序时不知道将需要保存多少个对象,或者是否需要更复杂的存储结构来 ...
- java 编程思想笔记(七)——异常
1.什么是异常 java中的异常指的是程序中的异常(不包括硬件异常(内存溢出等)),比如:语法错误(少写分号),除数为0,nullPoint等. 2.为啥需要异常 谁也不想代码在运行的时候,突然程序出 ...
- Java中的移位操作——Java编程思想笔记
欢迎转载,转载请务必注明出处: http://blog.csdn.net/alading2009/article/details/39968281 Java中的移位操作包括 <<(无符号左 ...
- Java编程思想笔记——并发3
终结任务 装饰性花园 公园人数共享计数值递增: class Count {private int count = 0;private Random rand = new Random(47);// R ...
- JAVA编程思想笔记 : 并发 [ 一 ]
程序中的所有事物,在任意时刻都只能执行一个步骤. 并发的多面性 并发解决的问题大体上可以分为"速度"和"设计可管理性"两种 并发通常是提高运行在单处理器上的程序 ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- 【java】《java编程思想》 读书笔记
之前主要用的C++的比较多,之前花了快2个月的实际认真系统全面的学习了以下java的基础语法,<java编程思想>这本书翻译水平确实不是很好,很多话读着会比较拗口.推荐读之前,先去网上搜索 ...
最新文章
- 钉钉大数据:贵州政府效率意识全国领先
- JavaScript规范
- 解决RuntimeError: cuda runtime error (30) : unknown error at /pytorch/aten/src/THC/THCGeneral.cpp:70N
- hdu 5139(离线处理)
- php教程知识点归纳,PHP知识点小结
- JavaScript萌新基础
- ophonesdn对首位优秀版主mobileguy的专访
- PHP5 Session 使用详解(一)
- C++简介(5)STL
- Linux----UnZip命令
- kindle刷机ttl_kindle咕咪版如何刷成普通kindle版本?
- 【新闻】本人新书《Java多线程编程实战指南(核心篇)》已出版上市
- Blender建模与3D打印
- 怎么启动mysql2008_SQL Server 2008初次启动
- ktt算法 约化_matlab在热学中的应用
- Android游戏破解练习-大圣降魔录
- shiny教程一 -- shiny入门
- flash player 11.2 64位 linux,Flash Player 11.2新版发布
- ionic安卓打印终极解决方案,支持USB打印
- 将前端网页生成二维码
热门文章
- json的简单的数据格式
- 学习笔记TF065:TensorFlowOnSpark
- angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )
- Linux账户安全管理--useradd、groupadd、passwd、chown、chmod工具
- Get started with ros -- 1
- 【转】让Chrome化身成为摸鱼神器,利用Chorme运行布卡漫画以及其他安卓APK应用教程...
- sys.check_constraints
- oracle相关操作
- python快速小教程
- dll的概念、dll导出类(转)