字符串类String
字符串
由字符构成的一个序列。在很多语言中,字符串都被当作字符数组来处理,在Java中,字符串是一个对象。
构造一个字符串
String newString = new String(stringLiteral);
参数StringLiteral是一个括在双引号内的字符序列。char[] charArray = {‘G’, ‘o’, ‘o’, ‘d’};
String message = new String(charArray);
用字符数组创建一个字符串。String newString = “Welcome to Java”;
Java将字符串直接量看做String对象。
注意
String变量存储的是对String对象的引用,String对象里存储的才是字符串的值。
不可变字符串与限定字符串
String字符串是不可变的,一旦创建,它的内容是不能改变的。
//创建内容为“Java”的String对象,并将引用赋值为s。
String s = "Java";
//创建内容为“HTML”的新String对象,并将其引用赋值给s。赋值后第一个String对象仍然存在但是不能再访问它
s = "HTML";
因为字符串在程序设计中是不可变的,但同时又会频繁地使用,所以Java虚拟机为了提高效率并节约内存,对具有相同字符串序列的字符串直接量使用同一个实例。这样的实例称为“限定的”。
String s1 = "Welcome to Java";
String s2 = new String ("Welcome to Java");
String s3 = "Welcome to Java";
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //true
字符串的比较
- equals(s1 : String) : boolean
- equalsIgnoreCase(s1 : String) : boolean
- compareTo(s1 : String) : int
返回一个大于0、等于0、小于0的整数来表明这个字符串是的大于、等于还是小于s1。返回的实际值是依据s1和s2从左到右数第一个不同字符的ASCII差值。 - compareToIgnoreCase(s1 : String) : int
- regionMatthes(index : int, s1 : String, s1Index : int, len : int) : boolean
- regionMatthes(ignoreCase : boolean, index : int, s1 : String, s1Index : int, len : int) : boolean
- startsWith(prefix : String) : boolean
- endsWith(suffix : String) : boolean
运算符==只能检测string1和string2是否指向同一个对象。
字符串长度、字符以及组合字符串
- length() : int
- charAt(index : int) : char
- concat(s1 : String) : String
获取子串
- substring(beginIndex: int) : String
- substring(beginIndex: int, endIndex: int) : String
字符串的转换、替换和分隔
- toLowerCase(): String
返回将所有字符都转换为小写之后的新字符串 - toUpperCase(): String
返回将所有字符都转换为大写之后的新字符串 - trim(): String
返回去掉两端的空白字符之后的新字符串 - replace(oldChar: char, newChar: char): String
返回一个用新字符替换这个字符串中所有和它匹配的字符的新字符串 - replaceFirst(oldString: String, newString: String): String
返回用一个新子串替换这个字符串中第一个和它匹配的子串之后的新字符串 - replaceAll(oldString: String, newString: String): String
返回用一个新子串替换这个字符串中所有和它匹配的子串之后的新字符串 - split(delimiter: String): String[]
返回用定界符分隔的子串所构成的一个字符串数组
以上方法,都是返回一个新的字符串,并没有改变原字符串。Java中字符串一旦被创建,内容就不能修改。
依照模式匹配、替换和分隔
正则表达式 通过指定某个模式来匹配、替换或分隔一个字符串。
- matches()
- replaceAll()
- replaceFirst()
- split()
找出字符串中的某个字符或者某个子串
- indexOf(ch: char): int
返回字符串中第一次出现ch的下标。如果不匹配则返回-1 - indexOf(ch: char, fromIndex: int): int
返回字符串中fromIndex之后第一次出现ch的下标。如果不匹配则返回-1 - indexOf(s: String): int
返回字符串中第一次出现字符串s的下标。如果不匹配则返回-1 - indexOf(s: String, fromIndex: int): int
返回字符串中fromIndex之后第一次出现字符串s的下标。如果不匹配则返回-1 - lastIndexOf(ch: char): int
返回字符串中最后一次出现ch的下标。如果不匹配则返回-1 - indexOf(ch: char, fromIndex: int): int
返回字符串中fromIndex之前最后一次出现ch的下标。如果不匹配则返回-1 - indexOf(s: String): int
返回字符串中最后一次出现字符串s的下标。如果不匹配则返回-1 - indexOf(s: String, fromIndex: int): int
返回字符串中fromIndex之前最后一次出现字符串s的下标。如果不匹配则返回-1
字符串与数组之间的转换
- toCharArray()
将字符串转换成字符数组 - getChars(srcBegin: int, srcEnd: int, dst: char[], dstBegin: int)
将一个字符数组的内容复制到另外一个字符数组中 - 将一个字符数组转换成一个字符串
- String str = new String(charArray);
- String str = String.valueOf(charArray);
将字符和数值转换成字符串
String.valueOf()
格式化字符串
format()
字符类Character
- Character(value: char)
使用char值构成一个字符对象 - charValue()
从这个对象返回char值 - compareTo(anotherCharacter: Character): int
将这个字符和其他字符进行比较 - equals(anotherCharacter: Character): boolean
如果这个字符等于另一个字符则返回true - isDigit(ch: char): boolean
如果指定字符是一个数字则返回true - isLetter(ch: char): boolean
如果指定字符是一个字母则返回true - isLetterOrDigit(ch: char): boolean
如果指定字符是一个字母或者数字则返回true - isLowerCase(ch: char): boolean
如果指定字符是一个小写字母则返回true - isUpperCase(ch: char): boolean
如果指定字符是一个大写字母则返回true - toLowerCase(ch: char): char
返回指定的小写字母 - isUpperCase(ch: char): char
返回指定的大写字母
String StringBuilder StringBuffer区别
- StringBuilder、StringBuffer区别跟String类的区别:
StringBuilder/StringBuffer类可以添加、插入或追加心的内容,但是String对象一旦创建,值就不能被修改。
//JDK源码
//String的数据域
private final char value[];
//StringBuilder跟StringBuffer的数据域
private char value[];
- StringBuilder/StringBuffer区别 是否线程安全
两个类都是继承AbstractStringBuilder,而StringBuffer对方法加了同步锁或者对调用的方法加了同步锁(synchronized)。
public synchronized StringBuffer reverse() { super.reverse();
return this;
}
StringBufferr中修改缓冲区的方法是同步的。如果多任务并发访问,就是用StringBuffer,如果单任务访问,是用StringBuilder更有效。
StringBuilder类的构造方法
- StringBulider()
构建一个容器为16的空的字符串生成器 - StringBulider(capacity: int)
构建一个指定容量的字符串生成器 - StringBulider(s: String)
构建一个带指定字符串的字符串生成器
修改StringBuilder中的字符串
- append(data: char[]): StringBuilder
给这个字符串生成器追加一个char型数组 - append(data: char[], offset: int, len: int): StringBuilder
将data中的子数组追加给这个字符串生成器 - append(v: aPrimtiveType): StringBuilder
将一个基本类型值作为字符串追加到这个生成器 - delete(startIndex: int, endIndex: int): StringBuilder
删除两下标之间的字符 - deleteCharAt(index: int): StringBuilder
删除指定下标处的字符 - insert(index: int, data: char[], offset: int, len:int): StringBuilder
将数组中数据子数组插入到这个生成器的位置偏移量处 - insert(index: int, data: char[]): StringBuilder
将数据插入到这个生成器的位置偏移量处 - insert(offset: int, b: aPrimitiveType): StringBuilder
将转换成字符串的值插入到这个生成器中 - insert(offset: int, s: String): StringBuilder
将字符串插入这个生成器的位置偏移量处 - replace(startIndex: int, endIndex: int, s: String): StringBuilder
使用特定的字符串替换生成器中从startIndex到endIndex-1的字符 - reverse(): StringBuilder
颠倒生成器中的字符 - setCharAt(index: int, ch:char):void
在这个生成器中特定下标出设置一个新字符
StringBuffer类提供的其他方法
- toString(): String
- capacity(): int
返回这个字符串生成器的容量 - charAt(index: int): char
返回指定下标处的字符 - length(): int
- setLength(newLength: int): void
在这个生成器中设置新的长度 - substring(startIndex: int): String
返回从strtIndex开始的子串 - substring(startIndex: int, endIndex: int): String
返回从startIndex到endIndex-1的子串 - trimToSize(): void
减少字符串生成器所使用的存储大小
命令行参数
java TextMain arg0 arg1 arg2
参数是字符串,不需要用引号,字符串之间以空格相隔。
该参数传入main函数的参数String[] args
文件类File
注:
在Window中目录的分隔符是反斜杠\
。但是在Java中反斜杠是一个特殊的字符,应该写成\\
形式。
文件输入和输出
使用PrintWriter写数据
- PrintWriter(file: File)
- PrintWriter(fileName: String)
- print(s: String):void
- print(c: char):void
- print(cArray: char[]):void
- print(i: int): void
- print(l: long): void
- print(f: float): void
- print(l: double): void
- print(l: boolean): void
- Also contains the overloaded println methods
- Also contains the overloaded printf methods
使用Scanner读数据
- Scanner(source: File)
- Scanner(source: String)
- close()
- hasNext(): boolean
- next(): String
- nextLine(): String
- nextByte(): byte
- nextShort(): short
- nextInt(): int
- nextLong(): long
- nextFloat(): float
- nextDouble(): double
- nextDelimiter(pattern: String): Scanner
设置这个扫描器的分隔模式并返回这个扫描器