当前位置:首页 > Java技术 > Java编程思想学习笔记-第13章

Java编程思想学习笔记-第13章

2022年08月05日 17:51:23Java技术2
Java编程思想学习笔记-第13章

Java编程思想学习笔记-第13章

1 第13章-字符串

1.1 不可变String

  1. String对象是不可变的,字符串对象作为方法的参数传递时,实际传递的是引用的一个拷贝.该引用所指的对象其实一直待在单一的物理位置上,从未动过.
  2. 给String对象赋值本质上是改变该String对象引用的指向.

1.2 重载"+"与StringBuilder

  1. String对象是不可变的,你可以给一个String对象加任意多的别名.因为String对象具有只读特性,所以指向它的任何引用都不可能改变它的值.
  2. 不可变性会带来一定的效率问题,为String对象重载的"+"操作符就是一个例子.
  3. String的"+"操作经过编译器优化后是利用的StringBuilder对字符串进行拼接,性能不如直接使用StringBuilder拼接字符串要好.
  4. 多个String对象的"+"操作有可能会创建多个StringBuilder来拼接.

1.3 无意识的递归

  1. 想打印对象的内存地址,在toString()方法中不能使用this关键字的返回字符串,this关键字会转换为String对象,从而递归调用toString()方法,会抛出异常.
  2. 解决方案: 使用super.toString()方法打印内存地址.这里的super父类是Object类.
package strings;

import java.util.ArrayList;
import java.util.List;

public class InfiniteRecursion {
    @Override
    public String toString() {
        return " InfiniteRecursion address: " + super.toString() + "\n";
    }

    public static void main(String[] args) {
        List<InfiniteRecursion> v = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            v.add(new InfiniteRecursion());
        }
        System.out.println(v);
    }
}

1.4 String上的操作

  1. 当需要改变字符串的内容时,String类的方法都会返回一个新的String对象.
  2. 同时,如果内容没有发生改变,String的方法只是返回指向原对象的引用而已.这节省了存储空间以及避免了额外的花销.
方法 参数,重载版本 应用
构造器 重载版本:默认版本,String,StringBuilder,StringBuffer,char数组,byte数组 创建String对象
length()   String中字符的个数
charAt() Int索引 取得String中该索引位置上的char
getChars(),getBytes() 要复制的部分的起点和终点的索引,复制的目标数组,目标数组的起始索引 复制char或byte到一个目标数组中
toCharArray()   生成一个char[],包含String的所有字符
equals(),equalsIgnoreCase() 与之进行比较的String 比较两个String的内容是否相同
compareTo 与之进行比较的String 按词典顺序比较String的内容,比较结果为负数,零或正数.注意,大小写并不等价
contains    
contentEquals() 与之比较的CharSequence或StringBuffer 如果该String与参数的内容完全一致,则返回true
equalsIgnoreCase 与之进行比较的String 忽略大小写,如果两个String的内容相同,则返回true
regionMatcher() 该String的索引偏移量,另一个String及其索引偏移量,要比较的长度.重载版本增加了"忽略大小写"功能 返回boolean结果,以表明所比较区域是否相等
startsWith() 可能的起始String.重载版本在参数中增加了偏移量 返回boolean结果,以表明String是否以此参数起始
endsWith() 该String可能的后缀String 返回boolean结果,以表明此参数在String中的起始索引.lastIndexOf()是从后向前搜索
indexOf(),lastIndexOf() 重载版本包括:char,char与起始索引,String,String与起始索引 如果该String并不包含此参数,就返回-1;否则返回此参数在String中起始的索引.lastIndexOf()是从后向前搜索
substring(subSequence()) 重载版本:起始索引;起始索引+终点坐标 返回一个新的String,以包含参数指定的子字符串
concat() 要连接的String 返回一个新的String对象,内容为起始Stirng连接上参数String
replace() 要替换掉的字符,用来进行替换的新字符,也可以用一个CharSequence来转换另一个CharSequence 返回替换字符后的新String对象.如果没有替换发生,则返回原始的String对象
toLowerCase,toUpperCase()   将字符的大小写改变后,返回一个新String对象.如果没有发生改变,则返回原始的String对象
trim()   将String两端的空白字符删除后,返回一个新的String对象.如果没有改变发生,则返回原始的String对象
valueOf() 重载版本:Object;char[];char[],偏移量,字符个数; boolean; char; int; long; float; double 返回一个表示参数内容的String
intern()   为每个唯一的字符序列生成一个且仅生成一个String引用

1.5 格式化输出

1.6 System.out.format()

  • System.out.format()可以用于PrintStream或PrintWriter对象,其中包括System.out对象.

1.7 Formatter类

  • Formatter类可以将格式化字符串与数据翻译成需要的结果.

1.7.1 格式化说明符

  1. Formatter类格式化抽象语法: %[argument_index][flags][width][.precision]conversion
    • 用"-"标志来改变对齐方向(默认右对齐),添加了"-"表示左对齐
    • width: 控制一个域的最小尺寸,
    • precision: 用来指明最大尺寸,用于String时,它表示打印String时输出字符的最大数量.用于浮点数时,表示小数显示的位数(默认6位),小数过多则舍入,过少则在尾部补零.用于整数时,会出发异常.

1.7.2 Formatter转换

  1. 常用的类型转换
类型转换字符 说明
d 整数型(十进制)
c Unicode字符
b Boolean值
s String
f 浮点数(十进制)
e 浮点数(科学计数法)
x 整数(十六进制)
h 散列码(十六进制)
% 字符'%'

1.7.3 String.format()

  • 是一个static方法,接受与Formatter.format()方法一样的参数,但返回一个String对象.
  • String.format()内部,它也是创建一个Formatter对象,然后将你传入的参数转给Formatter.

1.8 正则表达式

  1. 在Java中使用正则表达式, \\ 的意思是要插入一个正则表达式的反斜线, \\\\ 是插入一个普通的反斜线.

1.8.1 创建正则表达式

  • 字符说明
字符 说明
B 指定字符B
\xhh 十六进制值为oxhh的字符
\uhhhh 十六进制表示为oxhhhh的Unicode字符
\t 制表符Tab
\n 换行符
\r 回车
\f 换页
\e 转移(Escape)
  • 字符类说明
字符类 说明
. 任意字符
[abc] 包含a,b和c的任何字符(和a或b或c作用相同)
[abc] 除了a,b和c之外任何字符串(否定)
[a-zA-Z] 从a到z或从A到Z的任何字符(范围)
[abc[hij] 任意a,b,c,h,i和j字符(与a或b或c或h或i或j作用相同)(合并)
[a-z&&[hij]] 任意的h,i或j(交)
\s 空白符(空格,tab,换行,换页和回车)
§ 非空白符([^\s])
\d 数组[0-9]
\D 非数字[0-9]
\w 词字符[a-zA-Z0-9]
\W 非此字符[^\w]
  • 边界匹配符
边界匹配符 说明
^ 一行的起始
\B 非词的边界
$ 一行的结束
\G 前一个匹配的结束
\b 词的边界

1.8.2 量词

  1. 量词描述了一个模式吸收输入文本的方式
    • 贪婪型: 量词总是贪婪的,除非有其他的选项被设置.贪婪型表达式会为所有可能的模式发现尽可能多的匹配.导致此问题的一个典型理由就是嘉定我们的模式技能匹配第一个可能的字符组,如果它是贪婪的,那么它就会继续往下匹配.
    • 勉强型: 用问号来制定,这个量词匹配满足模式所需的最少字符数,也称作懒惰的,最少匹配的,非贪婪的,不贪婪的.
    • 占有型: 目前,这种类型的量词只有在Java中才可用.当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败的时候可以回溯.它们常常可以用于防止正则表达式时空,因此可以使用正则表达式执行起来更有效.
贪婪型 勉强型 占有型 如何匹配
X? X?? X?+ 一个或零个X
X* X*? X*+ 零个或多个X
X+ X+? X++ 一个或多个X
X{n} X{n}? X{n}+ 恰好n次X
X{n,} X{n,}? X{n,}+ 至少n次X
X{n,m} X{n,m}? X{n,m}+ X至少n次,且不超过m次

1.8.3 Pattern和Matcher

  • Pattern.compile()方法用来编译正则表达式并返回一个Pattern对象.
  • Pattern对象的matcher()方法会生成一个Matcher对象.
  • Matcher的方法,能够判断各种不同配型的匹配是否成功
    • boolean matches()
    • boolean lookingAt()
    • boolean find()
    • boolean find(int start)

1.8.4

  • 组是用括号划分的正则表达式,可以根据组的编号来引用某个组.组号为0表示整个表达式,组号为1表示被一对括号括起的组,一次类推.
  • Matcher对象提供了一系列方法
    • public int groupCount(): 该匹配器的模式中分组的数目,第0组不包括在内.
    • public String group(): 返回前一次匹配操作的第0组.
    • public String group(int i): 返回前一次匹配操作期间指定的组号,如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,则将会返回null.

1.8.5 Matcher的相关方法

  • Matcher对象提供了一系列方法
    • public int groupCount(): 该匹配器的模式中分组的数目,第0组不包括在内.
    • public String group(): 返回前一次匹配操作的第0组.
    • public String group(int i): 返回前一次匹配操作期间指定的组号,如果匹配成功,但是指定的组没有匹配输入字符串的任何部分,则将会返回null.
    • public int start(int group): 返回前一次匹配操作中寻找到的组的起始索引.
    • public int end(int group): 返回在前一次匹配操作中寻找到的组的最后一个字符索引加1的值
    • public boolean find(): 可以在输入的任意位置定位正则表达式.
    • public boolean lookingAt(): 只有在正则表达式与输入的最开始处就开始匹配才会成功, 只要输入的第一部分匹配就会成功.
    • public boolean matches(): 只有在正则表达式与输入的最开始处就开始匹配才会成功,只有在整个输入都匹配正则表达式时才会成功.
    • public String[] split(CharSequence input): 将输入字符串断开成字符串对象数组,断开边界由下列正则表达式决定.
    • public String[] split(CharSequence input, int limit): 将输入字符串断开成字符串对象数组,断开边界由下列正则表达式决定,limit限定将输入分割成字符串的数量.
    • public replaceFirst(String replacement): 以参数字符串replacement替换掉第一个匹配成功的部分.
    • public replaceAll(String replacement): 以参数字符串replacement替换掉所有匹配成功的部分.
    • public appendReplacement(StringBuffer sbuf, String replacement): 执行渐进式的替换,而不是像replaceFirst()和replaceAll()那样只替换第一个匹配或者全部匹配.它允许你调用其他方法来生成或处理replacement,使你能够以编程的方式将目标分割成组.
    • appendTail(StringBuffer sbuf): 在执行了一次或多次appendReplacement()之后,调用此方法可以将输入字符串余下的部分复制到sbuf中.
    • reset(CharSequence input)方法: 可以将现有的Matcher对象应用于一个新的字符序列.

1.8.6 Pattern标记

  1. Pattern类的compile()方法还有另一个版本,接受标记参数,调整匹配的行为.
    • Pattern Pattern.compile(String regex, int flag)
  2. flag常量如下
编译标记 效果
Pattern.CANONEQ 两个字符当且仅当它们的完全规范分解相匹配时,就认为它们是匹配的.例如:如果我们指定这个标记,表达式a\u030A就会匹配字符串?.在默认的情况下,匹配不考虑规范的等价性.
Pattern.CASEINSENSITIVE(?i) 默认情况下,大小写不敏感的匹配只有US-ASCII字符集中的字符才能进行.这个标记运行模式匹配不必考虑大小写(大写或小写).通过指定UNICODECASE标记及结合此标记,基于Unicode的大小写不敏感的匹配模式也可以开启了
Pattern.COMMENTS(?x) 在这种模式下,空格符将被忽略掉,并且以#开始直到行末的注释也会被忽略掉.通过嵌入的标记表达式也可以开启Unix的行模式
Pattern.DOTALL(?s) 在dotall模式中,表达式"."匹配所有字符,包括行终结符.默认情况下,"."表达式不匹配行终结符
Pattern.MULTILINE(?m) 在多行模式下,表达式$分别匹配一行的开始和结束.还匹配输入字符串的开始,而$还匹配输入字符串的结尾.默认情况下,这些表达式仅匹配输入的完整字符串的开始和结束
Pattern.UNICODECASE(?u) 当指定这个标记,并且开启CASEINSENSITIVE时,大小写不敏感的匹配将按照与Unicode标准相一致的方式进行.默认情况下,大小写不敏感的匹配假定只能在US-ASCII字符集中的字符才能进行
Pattern.UNIXLINES(?d) 这种模式下,在. ^和$行为中,只识别行终结符\n

1.8.7 正则表达式和Java I/O

//: strings/JGrep.java
package strings;

import net.mindview.util.TextFile;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JGrep {
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Usage: java JGrep file regex");
            System.exit(0);
        }
        Pattern p = Pattern.compile("\\b[Ssct]\\w+");
        // Iterate through the lines of the input file:
        int index = 0;
        Matcher m = p.matcher("");
        for (String line : new TextFile(args[0])) {
            m.reset(line);
            while (m.find()) {
                System.out.println(index++ + ": " +
                        m.group() + ": " + m.start());
            }
        }
    }
}

Date: 2018-11-02 14:05

Author: devinkin

Created: 2018-11-04 日 16:57

Validate

作者:EmacsDevinkin
来源链接:https://www.cnblogs.com/devinkin/p/9895923.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/17872.html

分享给朋友:

“Java编程思想学习笔记-第13章” 的相关文章

读Java编程思想随笔の数组

  数组与其他种类的容器之间区别有三:效率、类型和保存基本类型的能力。在Java中,数组是一种最高的存储和随机访问对象引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是为这种速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变。你可以能会建议使用Ar...

Java编程思想 4th 第2章 一切都是对象

Java编程思想 4th 第2章 一切都是对象

Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成。 在Java中,使用引用来操纵对象,在Java编程思想的第四版中,使用的术语是...

Java编程思想学习(五)----第5章:初始化与清理

随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。 C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法。Java中也采用了构造器,并额外提供了“垃圾回收器”。对于不再使用的内存资源,垃圾回收器能自动将其释放。...

回顾Java编程思想篇(一)

本文主要介绍Java中对象的理解。 很久以前看过Java编程思想这本书,当时看得不是很懂,重新拿起这本书,感觉非常陌生,于是产生了重新研究的念头,并做一些读书笔记。   一、一切都是对象 1、Java与...

JAVA编程思想三

第三章主要是对JAVA控制执行流程的介绍,在这里注意到了几点与C++的不同之处: (1)Java不允许像C++中对一个数字作为布尔类型的判断,即0为false,非0为true; (2)逗号操作符在C++中是取最后一个表达式的值作为整个表达式的值;在Java中将逗号操作符一般...

【Java编程思想】8.多态

【Java编程思想】8.多态

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。 多态分离了“做什么”和“怎么做”,让接口和实现分离开,改善了代码的可读性和组织结构,创建了可拓展的程序。 封装,通过合并特征和行为来创建新的数据类型。 实现隐藏,通过将细节“私有化”把接口...

[JAVA]java编程思想-第一章-对象入门

第1章 对象入门 “为什么面向对象的编程会在软件开发领域造成如此震憾的影响?” 面向对象编程(OOP)具有多方面的吸引力。对管理人员,它实现了更快和更廉价的开发与维护过程。对分析与设计人员,建模处理变得更加简单,能生成清晰、易于维护的设计方案。对程序员,对象模...

Java编程思想第四版勘误

  坊间传说这本书翻译得很烂,我倒觉得还好。虽然看原文更准确,但是如果在具备一定编程思维和基础、能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看。当然,错误和不通顺还是有的,而且官方和网上居然没有一份公开的勘误表,至少我没有搜到,搜索“Java编程思想第四版勘...

Java编程思想学习(十五) 注解

注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式。使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Annotation的类型检查,使得在编译期间就可以排除语法错误。 1JDK内置的3中...

java异常捕获案例,此题的出处是《Java编程思想》一书

转自:https://blog.csdn.net/jackfrued/article/details/44921941   class Annoyance extends Exception {} class Sneeze extends Annoyan...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。