String、StringBuilder和StringBuffer
String:
String的底层代码为一个用final修饰的char数组,这意味着定义一个String变量以后,该变量的内容是不可变的;
每次对 String 类型进行改变时,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。
StringBuilder与StringBuffer:
StringBuilder 与StringBuffer都继承自AbstractStringBuilder,该类的char数组并没有用final修饰,内容是可变的;
通过底层代码可知,StringBuilder 与StringBuffer在拼接字符串时,通过判断字符串长度是否足够,从而创建一个新的数组用来封装数据,而原来的对象被放弃引用,等待垃圾回收,从而减少内存的浪费,因此在拼接字符串等操作时,我们通常使用StringBuilder 与StringBuffer,但两者在执行效率上又有不同,StringBuilder的执行效率较高;
通过底层源码可知,可以发现StringBuffer在拼接字符串时,使用了同步锁,安全性提高,而StringBuilder未使用同步锁,故效率提高;
StringBuilder是线程不安全的,而StringBuffer是线程安全的。
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
正则表达式
基本概念:
正则表达式是一种文本处理工具。利用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。正则表达式就是以某种方式来描述字符串。
正则表达式的创建:
Pattern和Matcher:
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式;
pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数 。
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例;
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作。
Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.;
示例:
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
扫描输入
Scanner:
这是一个用于扫描输入文本的实用类。可以看做StringTokenizer和Matcher类之间的某种结合。有了Scanner,所有的输入、分词和翻译的操作都隐藏在不同类型的next方法中。
在默认的情况下,Scanner根据空白字符对输入进行分词,但是也可以用正则表达式指定自己所需的定界符。
next()方法 与 nextLine() 方法区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。