1.String对象不可变

  • String对象不可变,只读。任何指向它的引用都不能改变它的内容。改变String内容意味着创建了一个新的String对象。
  • String 对象作为方法参数时都会复制一份引用(不是复制对象),而引用指向的对象一直呆在单一物理位置上。

2.重载操作符和StringBuilder

  • + += 这2个符号作用于字符串和基本类型数据时意义不相同,Java只有这2个操作符被重载过。
  1. 拼接字符串 + += 编译器会调用StringBuilder来工作。
  2. 拼接字符串时编译器会创建一个StringBuilder对象来生成最终的String,并且调用append方法来拼接字符串,最后用toString输出。(一条表达式生成一个StringBuilder对象)
  3. 如果 + +=在循环内,就会生成多个StringBuilder对象,影响性能。如果在循环外创建StringBuilder对象循环内调用append方法,就会只有一个对象。
  4. Object的toString方法输出引用所指向对象的内存地址,所有类都继承它,但大多数类覆写了toString方法,用来输出对象内容的字符串。

3.StringBuffer

  • StringBuider和StringBuffer的区别
    1. StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)。
    2. StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
    3. StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

4.格式化输出

4.1输出流的两种格式化输出方法。

  • printf( ) 这和C语言中的一样,使用%d、%f、%s等占位符,但C语言中不能拼接字符串,Java可以。
  • format()和printf( )一样,printf()调用了format()方法

4.2 Formatter类

  1. 新的格式化输出功能都由Formatter类提供。
  2. 创建Formatter对象要给构造器传递一些信息,告诉它最后输出到哪。

4.2.3 格式化说明符

  • %[argument_index$] [flags] [width] [.precision] conversion  [ ] 内为可略内容
  1. argument_index 是一个十进制整数, 2$表示使用参数列表的第2个参数 。
  2. flags 是修改输出格式的字符集。有效标志的集合取决于转换类型。
  3. width 是一个非负十进制整数,至少达到多少长度,不够用空格补齐,默认右对齐。
  4. precision 是一个非负十进制整数,前面有个点,和width区分。通常用来限制字符数,表示最多多少位。整数无法使用,String型输出最大字符量,浮点型表示小数点位数,不足补0,超过四舍五入。
  5. 浮点数 %f 默认输出小数点后6位
  6. %b  对于Boolean 和 boolean型可以准确输出,对于其他类型只要不是null,就为true,0也是true。
  • 静态方法 String.format()返回一个String, 如果只使用一次format()方法,这个比较简单。

5.正则表达式

5.1 String自带的正则表达式工具

  • s.split(regex)  将字符串从正则表达式匹配的地方割开,并返回String数组。
  • s.matches(regex) 返回boolean值, 是否能匹配到正则。
  • s.replaceFirst(regex  a)将第一个匹配到的正则换为a. s.replaceAll(regex  a)替换全部。
  • 只使用一次正则表达式建议使用自带的

5.2 创建正则表达式对象

  1. 正则表达式预编译 Pattern p  = Pattern.compile(regex);  编译正则表达式是非常耗性能的,提前预编译可以提高性能,但不能再方法体中,因为会执行一次方法就会预编译一次,预编译也很耗性能。
  2. Pattern 是 final 类 只能通过静态方法它的compile创建对象。
  3. Matcher m = p.matcher(string);  Matcher 同样也是 final 类
  4. Pattern对象的matcher方法接受一个字符串并生成一个 Matcher 匹配器对象 ,通过匹配器可以获得字符串与正则的关系
  5. 匹配器的一些方法:
    • m.matches() 整个字符串是否匹配正则
    • m.lookingAt() 字符串的起始部分是否匹配
    • m.find() 查找下一个匹配(下一个意味着有迭代行为)
    • m.find(int start) 从指定位置开始匹配
    • find 只负责匹配,不返回匹配到的结果,匹配到的结果由group()获取。

5.3 组

  • 组是用括号划分的正则表达式,由外向内,由左向右 编号0  1  2  3 。。。叫 组0,组1,组2 。。。
  1. Matcher对象获得组相关信息的方法
    • public int groupCount() 返回组的数量,不包括组0
    • public String group() 返回前一次的全匹配(组0)相当于group(0)
    • public String group(int i ) 返回 前一次匹配期间指定组,若之前匹配成功,指定组未能匹配则返回null
    • start(int group) 返回匹配到的指定组的起始位置索引。
    • start()返回匹配到的正则起始索引。
    • end(int group) 返回匹配到的指定组的最后一位索引再加一。
    • end()返回匹配到的正则最后一位索引再加一。

6 Pattern标记

  • Pattern.compile(regex,int flage)  flage来自pattern类中的常量,可以调整匹配行为,是对正则式的一种约定。可是使用 | 组合多个标记。
  1. Pattern.CANON_EQ 两个字符当且仅当它们的完全规范分解相匹配时,就认为它们是匹配的。
  2. Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不敏感的匹配假定只有US-ASCII字符集中的字符才能进行。这个标记允许模式匹配不必考虑大小写(大写或小写)。通过指定UNICODE_CASE标记及结合此标记。基于Unicode的大小写不满干的匹配就可以开启了。
  3. Pattern.COMMENTS(?x) 在这种模式下,空格符将被忽略掉,并且以#开始直到行末的注释也会被忽略掉。
  4. Pattern.DOTALL(?s) 在dotall模式中,表达式"." 匹配所有字符,包括终结符。默认情况下,”." 表达式不匹配行终结符。
  5. Pattern.MULTILINE(?m) 在多行模式下,表达式^和$分别匹配一行的开始和结束。^还匹配输入字符串的开始,而$还匹配输入字符串的结尾。默认情况下,这些表达式仅匹配输入的完整字符串的开始和结束。
  6. Pattern.UNICODE_CASE(?u) 当指定这个标记, 并且开启CASE_INSENSITIVE时,大小写不敏感的匹配将按照与Unicode标准相一致的方式进行。默认情况下,大小写不敏感的匹配假定只能在US-ASCII 字符集中的字符才能进行
  7. Pattern.UNIX_LINES(?d) 在这种模式下,在., ^和$行为中, 只识别行终结符\n

7 split()

  • 切割字符串并返回切割后的字符串数组,一切split()方法底层都由Pattern的split()方法提供支持。

1.Pattern.compile(regex).split(String string);

2.Pattern.compile(regex).split(String string, int limit); 从第limit个开始不分割,包括limit。

8 替换

1.String自带替换

  • public String replaceFirst(String regex,String replacement)   只替换第一个匹配到的正则。
  • public String replaceAll(String regex,String replacement)  替换全部。

2. Matcher 替换

  • Pattern.compile(regex).matcher(str).replaceFirst(repl)   // String 方法的底层实现。
  • Pattern.compile(regex).matcher(str).replaceAll(repl)     // String 方法的底层实现。
  • appendReplacement(StringBuffer sb, String replacement)  渐进式替换
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer(); //用于接收被替换的部分
while (m.find()) {
m.appendReplacement(sb, "dog");
//System.out.println(sb.toString());
}
m.appendTail(sb); //把剩余部分存入sb
System.out.println(sb.toString());

//one dog
//one dog two dog
//one dog two dogs in the yard

 

3 reset()

  • m. reset(string)   将Matcher对象应用于一个新的字符串,中途改变要匹配的字符串。

9 正则与IO

10 扫描输入 Scanner

  • 对输入进行分词

1.scanner构造器接受任何类型的输入对象。

2.普通next()方法返回下一个string对象。

3.基本类型除char外的 nextXXX() 方法都返回对应类型的数字。

4.next方法只有找到一个完整的分词后才返回,否则线程挂起等待。

5.hasNexXXX()方法判断下一个分词是否是需要的类型。

6.scanner默认对空字符串分割。

7.scanner.useDlimiter(regex) 使用正则对输入分词

8.scanner.dlimiter() 返回 当前正则匹配到的字符串,并作为Pattern对象。

9 正则扫描

  • nextXXX( string)和hasNex(string)都可以传入String进行匹配。(注意是匹配不是分词)。也可以传入string类型和pattern类型的正则进行匹配。
  • 用正则匹配后调用scanner.match(),返回MatcherResult类型的扫描匹配结果。它包含了获得的内容及捕获组位置,通过group(i)获得对应组信息。

知识点:

  1. 无意识的递归 :打印对象引用会调用toString,this代表调用当前方法的引用,所以this在toString中会发生递归调用。
  2. String.trim() 删除前后空格。
  3. String.valueOf( ) 将基本类型,对象,和char[ ] 数组转换成字符串。 基本类型转String也可以直接加个空字符串  如 2+""

《Java编程思想》笔记 第十三章 字符串的更多相关文章

  1. Java编程思想 笔记

    date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...

  2. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  3. #Java编程思想笔记(一)——static

    Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...

  4. 《Java编程思想》第一二章

    前段时间一直通过网络教程学习Java基础,把面向对象部分学完之后本来打算继续深入学习,但是感觉自己操之过急了,基础根本不够扎实,所以入手了一本<Java编程思想>,希望先把基础打好,再深入 ...

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

    Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成 ...

  6. 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...

  7. Java编程思想 4th 第1章 对象导论

    所有编程语言都提供抽象机制. 面向对象编程似乎是一种很好的编程思想和方式,面向对象编程中的对象简洁描述是:对象具有状态.行为和标识.状态指的是数据存储,存储的数据能反应状态:行为指的是方法,方法表示对 ...

  8. Java编程思想笔记(第二章)

    第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(referenc ...

  9. java编程思想笔记(第一章)

    Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...

随机推荐

  1. SQL select 和SQL where语句

    一.SQL SELECT语句 用于从表中选取数据,结果被存储在一共结果表中(称为结果集) 1.语法: SELECT 列名称   FROM  表名称 以及: SELECT * FROM 表名称 注:SQ ...

  2. tomcat8 管理页面403 Access Denied的解决方法

      安装tomcat,配置好tomcat环境变量以后,访问manager app页面,出现403 Access Denied错误,解决的方法如下: 首先在conf/tomcat-users.xml文件 ...

  3. 详细介绍javascript中的几种for循环的区别

    偶然间见到了forEach循环,感觉很新奇,就研究了一下,顺带着把js中的几种for循环做了一个比较. 首先,简单说一下,js中一共大概有四种for循环:(1).那种简单常见的for循环:(2).fo ...

  4. JSP九大内置对象及其方法

    内置对象包括 request response pageContext session application out config page exception 1.out (1)clear()清除 ...

  5. 安装与配置JDK

    第一步:下载jdk-7-linux-i586.tar.gzwget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586. ...

  6. Java学习全攻略-->阅读官方文档

    一直感觉Java的官方文档有些杂乱,最近特意整理了一下,仅供参考. 入口 Oracle官方文档入口:http://docs.oracle.com/.下级页面这边只整理了JavaEE跟JavaSE的文档 ...

  7. 【bzoj1455】罗马游戏 可并堆+并查集

    题目描述 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样 ...

  8. hdu 1286 找新朋友 (欧拉函数)

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. P4467 [SCOI2007]k短路

    题目描述 有 n 个城市和 m 条单向道路,城市编号为 1 到 n .每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此 n 和 m 满足 m \le n(n-1)m≤n(n−1 ...

  10. 【题解】SDOI2009学校食堂

    不知道有没有人跟我有一样的感觉……实际上很多的状压DP都不难,然而调到心碎……这题题面看起来很长,还有混合的‘位运算’来吓唬人(实际上就是异或而已).但实际上只要仔细阅读,发现也是一道水水的裸题. 首 ...