Sting 字符串类
一、字符串类String
字符串(string)是由字符构成的一个序列。
1. 构建一个字符串
//直接将字符串直接量看成String对象。 String message = "Weclome to JAVA"; //使用字符数组 char[] charArray = { 'G', 'o', 'o', 'd', ' ', 'D', 'a', 'y'}; String message = new String(charArray);
String变量存储的是对String对象的引用,String对象里存储的才是字符串的值。
2. 不可变字符串与限定字符串
String对象是不可变的,它的内容是不能改变的。
String s = "Java"; s = "HTML"; //赋值以后,"Java"字符串仍然存在,并没有变成"HTML",只是已经无法访问了,因为s变量指向了新的对象。
限定(interned):对具有相同字符串序列的字符串直接量使用同一个实例。
String s1 = new String("Weclome to Java"); String s2 = "Weclome to Java"; String s3 = "Weclome to Java"; System.out.println("s1 == s2 is " + (s1 == s2)); System.out.println("s2 == s3 is " + (s2 == s3));
结果:
s1 == s2 is false s2 == s3 is true
==:检测两个字符串变量是否指向同一个对象。比较的是两个对象的地址
3. 字符串的比较
equals(s1:String) : boolean | 如果这个字符串等于字符串s1返回true |
equalsIgnoreCase(s1: String) : boolean | 如果不区分大小写这个字符串等于字符串s1则返回true |
compareTo(s1:String) : int | 返回一个大于0、等于0或小于0的整数以表明这个字符串是大于、等于还是小于s1 |
compareToIgnoreCase(s1:String) : int | 除了不区分大小写外,其他都和compareTo一样 |
regionMatched(index:int, s1:String, s1Index:int, len:int) : boolean | 如果这个字符串指定的子域精确匹配字符串s1中指定的子域则返回true |
regionMatches(index:int, s1:String, s1Index:int, len:int) : boolean | 除了不区分大小写外,其他都和regionMatched一样 |
startWith( prefix:String) : boolean | 如果这个字符串以指定的前缀开始则返回true |
endWith(suffix:String) : boolean | 如果这个字符串以指定的后缀开始则返回true |
注意:== 运算符只能检测两个字符串是否指向同一个对象,不能判断两个字符串的内容是否相等。要判断两个字符串的内容是否相等应该使用equals方法。
String s1 = new String("Weclome to Java"); String s2 = "Weclome to Java"; String s3 = "Weclome to Java"; String s4 = "Weclome to C++"; System.out.println("s1 == s2 is " + (s1 == s2)); //false System.out.println("s2 == s3 is " + (s2 == s3)); //true; System.out.println("s1 equals s2 " + s1.equals(s2)); //true System.out.println("s2 equals s4 " + s2.equals(s4)); //false
compareTo方法: s1.compareTo(s2); 如果s1与s2相等,返回0,如果按字典序(即统一编码的顺序)s1小于s2,返回值小于0;如果按字典序s1大于s2,返回值大于0.
1 String s1 = new String("abc"); 2 String s2 = "abg"; 3 4 System.out.println( s1.compareTo(s2)); // c比g小4, 所以返回-4
4. 字符串长度、字符以及组合字符串
length():int --返回字符串的字符个数; massage.length()
charAt(index: int):char --返回这个字符串中指定下标的字符 massage.charAt(0)
concat(s1:String): String --返回连接这个字符串和字符串s1所构成的新字符串。 s3 = s1.concat(s2);等价于:s3 = s1 + s2;
length是String类的一个方法,但它是数组对象的一个属性。获取String对象的字符个数用s.length();获取数组a的元素个数用a.length.
substring(beginIndex:int):String --返回这个字符串中以指定的beginIndex开始并延续到字符串末尾的字串。
subString(beginIndex:int, endIndex:int):String --返回这个字符串中以指定的beginIndex开始并延续到字符串endeIndex -1 的字串。如果beginIndex等 于endIndex,那么返回一个长度为0的空字符串,如果beginIndex大于endIndex,运行错误。
5. 字符串的转换、替换和分隔
toLowerCase():String --返回将所有字符转换成小写字符后的新字符串
toUpperCase():String --返回将所有字符转换成大写字符后的新字符串
trim():String --返回去掉两端的空白字符之后的新字符串。
replac(oldChar:char, newChar:char) : String --返回一个新字符替换字符串中所有和它匹配的字符的新字符串
replaceFirst(oldString:String, newString):String --返回一个新字串替换字符串中第一个和它匹配的字串之后的新字符串
replaceAll(oldString:String, newString):String --返回一个新字串替换字符串中所有和它匹配的字串之后的新字符串
split(delimiter:String):String[] --返回用界定符分隔的字串所构成的一个字符串数组
6. 找出字符串中的某个字符或者某个字串
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.
lastIndexOf(ch:char, fromIndex:int):int --返回字符串中fromIndex之前最后一次出现ch的下标。如果不匹配则返回-1.
lastIndexOf(s:String):int --返回字符串中最后一次出现字符串s的下标。如果不匹配返回-1.
lastIndexOf(s:String, fromIndex:int):int --返回字符串fromIndex之前最后一次出现字符串s的下标。如果不匹配返回-1.
7. 字符串与数组、数值之间的转换
tocharArray --将字符串转换成字符数组
char[] chars = "java".tocharArray();
将一个字符数组转成字符串需要调用构造方法String(char[])或者方法valueOf(char[]):
String str = new String (new char[]{'J', 'a', 'v', 'a'});
String str = String.valueOf(new char[]{'J', 'a', 'v', 'a'});
valueOf(c:char):String --返回包含字符c的字符串
valueOf(data:char[]):String --返回包含数组中字符的字符串
valueOf(d:double):String --返回包含double值的字符串
valueOf(f:float):String --返回包含float值的字符串
valueOf(i:int):String --返回包含int值的字符串
valueOf(l:long):String --返回包含long值的字符串
valueOf(b:boolean):String --返回包含boolean值的字符串
可以使用Double.parseDouble(str)、Integer.parseInt(str)将一个字符串转换成double型数值或者int数值。
二、StringBuilder/StringBuffer类
可以给一个StringBuilder或者StringBuffer中添加、插入或追加新的内容,但是String对象一旦创建,它的值就确定了。
除了StringBuffer中修改缓冲区是同步的之外,StringBuffer与StringBuilder类是很相似的。如果是多任务并发访问,就使用StringBuffer;如果是单任务访问,就使用StringBuilder会更有效。(不懂多任务并发....mark)
java.lang.StringBuilder类的构造方法:
StringBuilder() --构建一个容量为16的空字符串生成器
StringBuilder(capacity:int) --构建一个指定容量的字符串生成器
StringBuilder(s:String) --构建一个带指定字符串的字符串生成器
1. 修改StringBuilder中的字符串
append(data:char[]):StringBuilder --给这个字符串追加一个char数组
append(data:char[], offsset:int, len:int):StringBuilder --将data中的子数组追加给这个生成器
append(v:aPerimitiveType):StringBuilder --讲一个基本类型值作为字符串追加到这个生成器
append(s:String):StringBuilder --将一个字符串追加到这个字符串生成器
delete(startIndex:int, endIndex:int):StringBuilder --删除指定区间的字符:startIndex ~ endIndex - 1
deleteCharAt(Index:int):StringBuilder --删除指定下标的字符
insert(index:int, data: cahr[], offset:int, len:int):StringBuilder --将字符串插入到生成器的位置偏移处
insert(offset:int, s:String):StringBuilder --将数组中数据子数组插入到生成器的指定下标处
revers():StringBuilder --颠倒生成器中的字符
setCharAt(index:int, ch:char):void --在这个生成器下标处设置一个新的字符
replac(startIndex:int, endIndex:int, s:String):StringBuilder --使用指定的字符串替换生成器中的指定区间的字符:startIndex ~ endIndex - 1
toString():String --从字符串生成器返回一个字符串对象
capacity():int --返回这个字符串生成器的容量
charAt(index:int): char --返回指定下标处的字符
length():int --返回生成器的字符个数
setLength(newLength:int):void --在该生成器中设置新的长度
subString(startIndex:int) :String --返回从startIndex开始的字串
subString(startIndex:int, endIndex:int) :String --返回从startIndex到endIndex-1之间的字串
trimTosize():void --减少生成器所使用的存储大小。
package demo; import java.util.Scanner; /** * 编写一个小程序,输入一串包含数字、字母和特殊符号的字符串, * 忽略该字符串中的特殊字符,判断其是否为回文串 * Created by luts on 2015/12/1. */ public class test { public static void main(String[] args){ Scanner input = new Scanner(System.in); String src = new String(); System.out.println("输入一个任意的字符串"); src = input.next(); System.out.println("忽略掉输入字符串中的特殊字符,该字符串是回文串? " + isPalindrome(src)); } public static boolean isPalindrome(String s){ String tempString = filter(s); String tempString2 = reverse(tempString); return tempString.equals(tempString2); //判断两者内容是不是相等 } //过滤掉非字母、非数字的字符 public static String filter(String src){ StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < src.length(); i++){ if (Character.isLetterOrDigit(src.charAt(i))) stringBuilder.append(src.charAt(i)); } return stringBuilder.toString(); } public static String reverse(String src){ StringBuilder stringBuilder = new StringBuilder(src); stringBuilder.reverse(); return stringBuilder.toString(); } }
输入一个任意的字符串 123*&%^$321 忽略掉输入字符串中的特殊字符,该字符串是回文串? true