String
在Java中,字符串也是一连串的字符。但是,不像其他语言作为字符数组实现字符串,Java将字符串实现为Strng类型的对象。当创建String对象时,创建的字符串不能修改。也就是说,一旦创建一个String对象,就不能改变这个字符串中包含的字符。当每次需要已存在字符串的修改版本时,会创建包含修改后内容的新String对象。原始字符串保持不变。使用这种方式的原因是:实现固定的、不能修改的字符串与实现能够修改的相比效率更高。对那些需要修改的字符串,可以选择使用StringBuffer和StringBuilder。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
|
char charAt(int where)
void getChars(int sourceStart, int sourceEnd, char target[], int targetStart)
byte[] getBytes()
char[] toCharArray()
boolean equals(Object str)
boolean equalsIgnoreCase(String str)
boolean regionMatches(int startIndex, String str2, int str2StartIndex, int numChars)
boolean regionMatches(boolean ignoreCase, int startIndex, String str2, int str2StartIndex, int numChars)
boolean startsWith(String str)
boolean endsWith(String str)
int compareTo(String str)
int indexOf(int ch)
int indexOf(String str)
int indexOf(int ch, int startIndex) int indexOf(String str, int startIndex)
int lastIndexOf(int ch)
int lastIndexOf(String str)
int lastIndexOf(int ch, int startIndex) int lastIndexOf(String str, int startIndex)
String substring(int startIndex)
String subString(int startIndex, int endIndex)
String concat(String str)
String replace(char original, char replacement)
String trim()
String toLowerCase()
String topUpperCase()
static String join(CharSequence delim, CharSequence ...strs)
int codePointAt(int i)
int codePointBefore(int i)
int codePointCount(int start, int end)
boolean contains(CharSequence str)
boolean contentEquals(CharSequence str)
static String format(String fmtstr, Object ...args) static String format(Locale loc, String fmtstr, Object ...args)
boolean isEmpty()
boolean matches(string regExp)
int offsetByCodePoints(int start, int num)
String replaceFirst(String regExp, String newStr)
String replaceAll(String regExp, String newStr)
String[] split(Strinig regExp)
String[] split(String regEXP, int max)
CharSequence subSequence(int startIndex, int stopIndex)
|
equals()方法与“==”运算符执行不同的操作,equals()比较的是内容,“==”比较的是引用。
1 2 3 4 5 6 7 8 9 10
| public static void TestString() { String str1 = "String1"; String str2 = "String2"; String str3 = str1;
System.out.println("TestString length:" + str1.length()); System.out.println("TestString charAt:" + str1.charAt(3)); System.out.println("TestString equial:" + str1.equals(str3)); }
|
StringBuffer
StringBuffer表示可增长,可写入的字符串序列,是可修改的字符串。允许在中间插入字符和子串,或者在末尾追加字符和子串。StringBuffer能够自动增长,从而为这类添加操作准备空间,并且通常预先分配比实际需要更多的字符空间,以运行空间增长。
StringBuffer是线程安全
方法 |
描述 |
StringBuffer() |
默认 |
StringBuffer(int size) |
指定初始缓存大小 |
StringBuffer(String str) |
指定初始化字符串内容,并预留16个字符空间 |
StringBuffer(CharSequence chars) |
指定初始化字符序列,并预留16字符空间 |
方法 |
描述 |
length() |
返回字符串缓冲器内容的长度 |
capacity() |
返回字符串缓冲区的总大小 |
ensureCapacity() |
指定预先分配的空间 |
setLength() |
设置字符串的长度。当增加字符串的大小时,会向末尾添加null字符。如果减少字符大小,那超出的长度的字符会丢失。 |
charAt() |
获取指定索引的字符 |
setCharAt() |
设置指定索引的字符为新的字符 |
getChars() |
获取自定区间的子串 |
append() |
追加格子形式的字符串到尾部 |
insert() |
在指定位置插入字符串 |
reverse() |
字符串反向 |
delete() |
删除指定范围的内容 |
deleteCharAt() |
删除指定位置的字符 |
replace() |
用字符串替换指定范围的内容 |
substring() |
截取指定范围的字符串 |
StringBuilder
StringBuilder与StringBuffer类似,只有一个重要的区别:StringBuilder不是同步的,这意味着它不是线程安全的。StringBuilder的优势在于能得到跟高的性能。但是,如果可以修改的字符串被多个线程修改,并且没有使用其他同步措施就必须使用StringBuffer,而不能使用StringBuilder。
StringTokenizer
StringTokenizer用于解析格式化的字符串。StringTokenizer类提供了解析过程中第一步,通常称为字符分析器或扫描器。StringTokenizer实现了Enumeration接口。所以,给定输入字符串,就可以使用StringTokenizer枚举字符串中包含的每个标记。
方法 |
描述 |
StringTokenizer(String str) |
使用默认的界定符 |
StringTokenizer(String str, String delimiters) |
指定界定符的字符串 |
StringTokenizer(String str, String delimiters, boolean delimAsToken) |
指定是否要返回界定符 |
方法 |
描述 |
int countTokens() |
该方法使用当前的一组分隔符,确定还有多少标记需要解析并返回结果 |
boolean hasMoreElements() |
如果字符串中还有一个或多个标记,就返回true;否则返回false |
boolean hasMoreTokens() |
如果字符串中还有一个或多个标记,就返回true;否则返回false |
Object nextElement() |
作为Object对象返回下一个标记 |
String nextToken() |
作为String对象返回下一个标记 |
String nextToken(String delimiters) |
作为String对象返回下一个标记,并将界定符字符串设置为由delimiters指定的字符串 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import java.util.StringTokenizer;
public class LearnStringTokenizer1 { static String in = "title1=TitleName1;" + "title2=TitleName2;" + "title2=TitleName3"; public static void main(String args[]) { StringTokenizer st = new StringTokenizer(in, "=;"); while(st.hasMoreTokens()) { String key = st.nextToken(); String val = st.nextToken(); System.out.println(key + " " + val); } } }
|
Formatter用于格式化输出。
方法 |
描述 |
Formatter() |
|
Formatter(Appendable buf) |
buf用于存储格式化输出的子串 |
Formatter(Appendable buf, Locale loc) |
buf用于存储格式化输出的子串,loc指定地区 |
Formatter(String filename) |
filename指定用于接收格式化输出的文件的名称 |
Formatter(String filename, String charset) |
filename指定用于接收格式化输出的文件的名称,charset指定字符集 |
Formatter(File outF) |
outF指定一个引用,指向用于接收输出的已打开文件 |
Formatter(outputStream outStrm) |
outStrm指定一个引用,指向将要接收输出的输出流 |
方法 |
描述 |
void close() |
关闭调用Formatter对象。这回导致Formatter对象使用的所有资源被释放。Formatter对象在关闭之后,将不能再使用。如果试图使用已关闭的Formatter对象,会导致FormatterClosedException异常 |
void flush() |
刷新格式化缓冲区,这会导致将缓冲区中当前的所有输出都写入目标中。该方法主要用于与文件绑定的Formatter对象 |
Formatter format(String fmtString, Object …args) |
根据fmtString中包含的格式化说明符,格式化args传递过来的参数。返回调用对象 |
Formatter format(Locale loc, String fmtString, Object …args) |
根据fmtString中包含的格式化说明符,格式化args传递过来的参数。为格式化操作使用由loc指定的地区。返回调用对象 |
IOException ioException() |
如果作为输出目标的底层对象抛出IOException异常,就返回该异常;否则返回null |
Locale locale() |
返回调用对象的地区 |
Appednable out() |
返回指向底层对象的引用,底层对象是输出的目标 |
String toString() |
返回包含格式化输出的String对象 |
格式说明符 |
适用的转换 |
%a %A |
浮点型十六进制值 |
%g %G |
基于被格式化的值和精度使用%e 或%f |
%b %B |
布尔型 |
%o |
八进制整数 |
%c |
字符 |
%n |
插入一个换行符 |
%d |
十进制整数 |
%s %S |
字符串 |
%h %H |
参数的哈希码 |
%t %T |
时间和日期 |
%e %E |
科学计数法 |
%x %X |
十六进制整数 |
%f |
十进制整数 |
%% |
插入一个% 符号 |
标志 |
效果 |
- |
左对齐 |
# |
可选的转换格式 |
0 |
使用0而不是空格填充输出 |
空格 |
在输出的正数前面加一个空格 |
+ |
在输出的正数前面加一个+号 |
, |
在数值中包含组分割符 |
( |
将负值放在括号内 |
最小字段宽度
%符号和格式化代转换代码之间的整数被作为最小字段宽度说明符,这回使用空格填充输出,以确保输出达到特定的最小长度。几遍字符串或数字长于最小宽度,也仍然会完整的输出。默认使用空格进行填充。如果希望使用0进行填充,可以在自动宽度说明符之前放置一个0。字段宽度说明符可以用于除%n以外的所有格式说明符。
1 2 3 4 5 6 7 8 9 10 11 12
| import java.util.*;
public class LearnFormatter2 { public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("|%f|%n|%12f|%n|%012f|", 10.12345, 10.123445, 10.123456); System.out.println(fmt); fmt.close(); } }
|
指定精度
精度说明符可以应用于%f、%e、%g以及%s格式说明符。精度说明符位于最小字段宽度说明符之后,由一个小数点以及紧跟其后的整数构成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.util.*;
public class LearnFormatter3 { public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("%.4f", 123.1234567); System.out.println(fmt); fmt.close(); fmt = new Formatter(); fmt.format("%16.2e", 123.1234567); System.out.println(fmt); fmt.close(); fmt = new Formatter(); fmt.format("%.15s", "Froatting with java is now easy"); System.out.println(fmt); fmt.close(); } }
|
日期格式化
后缀 |
替换内容 |
a |
星期名简称 |
A |
星期名全称 |
b |
月份名简称 |
B |
月份名全称 |
c |
标准日期和时间字符串,格式为:天 月份 日期 小时:分钟:秒数 时区 年 |
C |
年份的前两个数字 |
d |
每月日期的十进制格式(01-31) |
D |
月/日/年 |
e |
每月日期的十进制格式(1-31) |
F |
年-月-日 |
h |
月份名简称 |
H |
小时(00-23) |
I |
小时(01-12) |
j |
每年日期的十进制格式(001-366) |
k |
小时(0-23) |
l |
小时(1-12) |
L |
毫秒(000-999) |
m |
月份的十进制格式(01-13) |
M |
分钟的十进制格式(00-59) |
N |
纳秒(000000000-99999999) |
p |
以小写形式表达本地时间的AM和PM |
Q |
自1970年1月1日以来经历的毫秒数 |
r |
小时:分钟:秒数(12小时格式) |
R |
小时:分钟:描述(24小时格式) |
S |
秒(00-60) |
s |
自1970年1月1日(UTC)以来经历的毫秒数 |
T |
小时:分钟:秒数(24小时格式) |
y |
以十进制表示的年份(00-99),不含世纪部分(即年份的前两位) |
Y |
以十进制表示的年份(0001-9999),包含世纪部分 |
z |
相对于UTC的时差 |
Z |
时区名 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.util.*;
public class LearnFormatter1 { public static void main(String args[]) { Formatter fmt = new Formatter(); Calendar cal = Calendar.getInstance(); fmt.format("%tr", cal); System.out.println(fmt); fmt.close(); fmt = new Formatter(); fmt.format("tc", cal); System.out.println(fmt); fmt.close(); fmt = new Formatter(); fmt.format("%tl:%tM", cal, cal); System.out.println(fmt); fmt.close(); fmt = new Formatter(); fmt.format("%tB %tb %tm", cal, cal, cal); System.out.println(fmt); fmt.close(); } }
|
使用参数索引
正常情况下,格式说明符和参数按顺序从左向右进行匹配。但是,使用参数索引,可以显示地控制哪个参数与哪个格式说明符相匹配。
1 2 3 4 5 6 7 8 9 10 11 12
| import java.util.Formatter;
public class LearnFormatter5 { public static void main(String args[]) { Formatter fmt = new Formatter(); fmt.format("%3$d %1$d %2$d %2$d", 1, 2, 3); System.out.println(fmt); fmt.close(); } }
|
Scanner
Scanner类用于格式化输入,并将输入转换成相应的二进制形式。Scanner可以用于从控制台、文件、字符串或任何实现了Readable或ReadableByteChanner接口的源读取内容。
构造函数
方法 |
描述 |
Scanner(File from) |
创建的Scanner对象使用from指定的文件作为输入源 |
Scanner(File from, String charset) |
创建的Scanner对象使用from指定的文件作为输入源,并且文件的编码方式由charset指定 |
Scanner(InputStream from) |
创建的Scanner对象使用from指定的流作为输入源 |
Scanner(InputStream from, String charset) |
创建的Scanner对象使用from指定的流作为输入源,并且流的编码方式由charset指定 |
Scanner(Path from) |
创建的Scanner对象使用from指定的文件作为输入源 |
Scanner(Path from, String charset) |
创建的Scanner对象使用from指定的文件作为输入源,并且文件的编码方式由charSet指定 |
Scanner(Readable from) |
创建的Scanner对象使用from指定的Readable对象作为输入源 |
Scanner(ReadableByteChannel from) |
创建的Scanner对象使用from指定的ReadableByteChannel作为输入源 |
Scanner(ReadableByteChannel from, String charset) |
创建的Scanner对象使用from指定的ReadableByteChannel作为输入源,编码方式由charset指定 |
Scanner(String from) |
创建的Scanner对象使用from指定的字符串作为输入源 |
1 2 3 4 5 6
| FileReader fin = new FileReader("Test.txt"); Scanner src = new Scanner(fin);
Scanner conin = new Scanner(System.in);
|
方法 |
描述 |
boolean hasNext() … |
如果有可以读取的任意类型的标记,就返回true;否则返回false |
String next() … |
从输入源返回下一个任意类型的标记 |
Scanner useDelimiter(String pattern) … |
指定界定符组的正则表达式 |
String findInLine(String pattern) … |
搜索指定的模式 |
String findWithHorizon(Pattern pattern, int count) … |
视图在后续count个字符中查找指定的模式。如果找到返回匹配的模式;否则返回null,如果count是0,就在全文搜索 |
Scanner skip(Pattern pattern) … |
跳过某个模式 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import java.util.Scanner;
public class LearnScanner1 { public static void main(String args[]) { Scanner conin = new Scanner(System.in); int count = 0; double sum = 0.0; System.out.println("Enter numbers to average."); while(conin.hasNext()) { if(conin.hasNextDouble()) { sum += conin.nextDouble(); count ++; } else { String str = conin.next(); if(str.equals("done")) { break; } else { System.out.println("Data format error."); return; } } } conin.close(); System.out.println("Average is " + sum / count); } }
|
正则表达式
正则表达式是描述字符序列的一串字符。这种通用描述被称为模式,可以用于在其他字符序列中查找匹配,正则表达式可以指定通配符、一组字符和各种量词。因此,可以指定一种通用形式的正则表达式,以匹配多种不同的特定字符系列。
Pattern
方法 |
描述 |
static Pattern compile(String pattern) |
pattern是希望使用的正则表达式。comple()方法将pattern中的字符串转换成一种模式,Matcher可以使用这种模式进行匹配。返回包含模式的Pattern对象 |
Matcher mathcer(CharSequence str) |
str是将要用于匹配模式的字符串 |
String[] split(CharSequence str) |
使用匹配的字符将str拆分成多个字符串 |
static boolean matches(String pattern, CharSequence str) |
如果patter与str匹配,就返回true;否则返回false |
量词
量词决定表达式将被匹配的次数
量词 |
描述 |
+ |
匹配一次或多次 |
* |
匹配零次或多次 |
? |
匹配零次或一次 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import java.util.regex.Matcher; import java.util.regex.Pattern;
public class LearnReg1 { public static void main(String args[]) { Pattern pat = Pattern.compile("W+"); Matcher mat = pat.matcher("W WW WWW"); while(mat.find()) { System.out.println("Match:" + mat.group()); } } }
|
Matcher
方法 |
描述 |
boolean matches() |
如果字符串序列与模式匹配,就返回true;否则返回false |
boolean find() |
如果存在匹配的子序列,就返回true;否则返回false,可以重复调用这个方法,以查找所有匹配的子序列,find()每次调用都是从上一次离开的位置开始 |
String group() |
获得包含最后一个匹配序列的字符串,如果存在匹配的字符串就返回;如果没有就抛出IllegalStateException异常 |
int start() |
获得输入序列中当前匹配的索引,如果不存在匹配的,就抛出IllegalStateException异常 |
int end() |
获得当前匹配序列末尾之后下一个字符的索引,如果不存在匹配的,就抛出IllegalStateException异常 |
String replaceAll(String newStr) |
使用newStr替换所有匹配的序列,并返回新字符串的副本 |