十三、字符串----Thinking in Java 阅读笔记

1. 不可变String

  • String作为方法参时,接收的是一个引用的复制,并不是原来的String对象
  • String对象具有只读特性,所以指向它的任何引用都不能改变它的值

2. 重载+、+=与StringBuilder

  • 当对String对象使用+、+=时,编译器会自动创建一个StringBuilder对象用于字符串的拼接操作
  • 使用 javap -c 类名 命令查看编译后的类文件的jvm字节码

3. 无意识的递归

例:

public class Test3 {

    @Override
    public String toString() {
        return super.toString() + this;
    }

    public static void main(String[] args) {
        System.out.println(new Test3());
    }
    
}

由于+后this为非字符串类型,所以会发生强制类型转换,将this转换成String类型,因此会调用toString()方法,所以发生了递归

4. String上的操作

  • 当需要改变String的内容是,String中的方法都是返回一个新的String对象,原对象没有发生改变
  • 如果内容没有发生改变,为了避免额外的开销,返回的仍然是原来的对象

5. 格式化输出

  • System.out.printf()与System.out.format()

  • Formatter类

    该类用来处理所有新的格式化功能(System.out.printf()与System.out.format()方法都是使用该类进行格式化输出操作的)

  • 格式化说明符

    语法:%[argument_index$][flags][width][.precision]conversion
    

    argument_index:

    flags:**“-”**控制对齐方向

    width:控制字符的最小宽度,不够时以空格补充

    .predision:控制域的最大宽度,用于String类型时用来控制输出字符的最大数量,用于浮点类型时用来控制小数部分要显示的位数

    conversion:d、c、b、s、f、e、x、h、%

  • 注意:对于b转换来说,它虽然对于所有类型都是合法的,但是稍有不同,对于Boolean、boolean可以正常转换成对应的true、false,对于基本类型转换结果均为true,对于对象来说只要不是null转换结果也均为true

6. 正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

1.基础

  • java中正则表达式对反斜线\的处理有些不同

    普通语言中\\表示在正则表达式中插入一个普通的反斜线,而在Java中则表示插入一个正则表达式的反斜线

    例如: \d 与 \\d

  • String中的split()和“替换”方法可以接受正则表达式

2. 创建正则表达式

3. 量词

  • 量词描述了一个正则表达式吸收文本的方式

    类型有:贪婪型、勉强型、占有型(只在java中可用)

  • CharSequence

    CharSequence接口从CharBuffer、String、StringBuffer、StringBuilder中抽象出来,Java中多数正则表达式的操作都是接受的CharSequence类型的参数(如Pattern和Matcher中的一些方法);

4. Pattern和Matcher

  • Pattern常见方法

    compile(String regex)、compile(String regex, int flag)、spilt()

  • Matcher常见方法

    matches()、lookingAt()、find()、find(int start)、start()、stop()、groupCount()(第0组不包括在内)、group()、group(int i)、start(int group)、end(int group)、reset()、reset(CharSequence input)

  • 组(groups)

    组是用括号来划分的表达式、可以根据组的编号来引用某个组,相关方法在Matcher类中

  • Pattern标记

    用来调整匹配的行为,在调用compile(String regex, int flag)方法时作为参数传入,可以通过或“|”操作符来组合多个标记,例如:Pattern.compile(re, Pattern.CASE_INSENSITIVE|Pattern.MULTILINE)

    flag功能
    CASE_INSENSITIVE(?i)表示正则匹配的时候忽略大小写,US-ASCII 字符下进行。可以结合 UNICODE_CASE 的标记,基于 Unicode 的大小写不敏感的匹配就可以开启了
    COMMENTS(?x)空白和 #开始直到行末的注释会被忽略掉
    DOTALL(?s)这种模式下. 可以匹配所有字符,包括换行符,默认 .匹配除换行符以外的任意字符
    MULTILINE(?m)更改 ^$ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结尾匹配。 注意:(?m)只有在正则表达式中涉及到多行的^$的匹配时,才使用 Multiline 模式。
    UNIX_LINES(?d).^&的行为中只识别换行符 \n
    • 除了通过以传入参数的方式调整匹配行为,也可以**直接在正则表达式的开头使用(?i)、(?m)**等来调整匹配行为,如:(?i)(\S+)\s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值