String类详解

1.String class初步认知:不可变性
JDK中 String类中定义的方法,不会去改变字符串引用中的数据值,最终会创建、返回新的字符串对象引用。
2.编译器如何实现两个字符串的连接操作
不同于想象,compiler会利用可变字符串类StringBuilder的append方法,实现字符串的拼接,完成后在调用toString()。
3.String类方法总结
length() 对于数组来说,求长度用length,这里的长度是方法,而对于数组类型来说是成员变量
constructor:可重载类型为StringBuilder、String、char arrays、StringBuffer
charAt(int pos) 返回的是给定pos的字符char
toCharArray()返回的是字符串数组char[]
getchars(int start,int end,char [] dst, int dstbegin)得到字符数组 char[]
equals()/equalsIgnoreCase() 比较两个字符串内容
contentEquals() 比较字符序列是否相同,与上面的函数不同在参数上,这里的参数是CharSequence or StringBuffer
compareTo()比较两个字符串的大小 -1 0 正数 区分大小写
contains() 重载后,参数类型丰富,判断是否包含charsquence(StringBuilder、StringBuffer)
startsWith() /endsWith()参数只能是String ,重载后可多一个offset ,参数字符串是否为带匹配字符串的前缀(后缀)字符串
indexOf() 重载后参数类型可以为:单个字符、字符串(String)、起始位置,获取给定字符/子字符串的索引值
substring(int start,int end) 返回的给定位置上的子字符串 end取不到
concat() 参数是String 返回一个新拼接后的String
replace() 重载后的参数可以为两个char,两个字符串,返回的是新的字符串
toUpperCase() toLowerCase() 返回新的字符串
trim()返回去空格后的新字符串
valueOf() 静态方法 String.valueOf()返回的是任何对象的字符串表达
4.静态方法String.format()
返回格式化的String类对象,该方法调用Fomatter()实现格式化。
类似的我们有System.out.format() 直接将格式化数据输出到控制台。
谈谈Formatter类:
构造方法的参数是输出流对象:可以是PrintStream、OutputStream、File。
该参数表明将格式化的数据输出到哪里去。
Formatter中的format():
参数指定格式化的数据样子及数据来源,数据样子可由数据出现的位置、数据的类型、数据表现形式共同决定
可用的数据类型有哪些呢?
s–字符串
c–字符
d–decimal整数
x—hex整数
f --float
h–hash code
如何指定数据的表现形式呢?
宽度(最小长度)
精确性(字符创类型来说最大可显示的长度、float数据来说小数点后可表达的位数,默认为6位)
%(-)宽度.精确度 (-)改变对齐方式:默认右对齐,-为左对齐,对齐方式仅仅存在有设定了宽度后相应的数据显示在宽度的左边还是右边,没有设定宽度,不存在对齐设置

//使用Formatter类
public class tryFormat {
	Formatter formatter;

	public tryFormat(Formatter formatter) { //为其传入输出流对象
		// TODO Auto-generated constructor stub
		this.formatter=formatter;
		
	}
	
	public void getTitle() {
		formatter.format("%-10s %5s %6s\n", "Name","Id","Price");
		formatter.format("%-10s %5s %6s\n", "----","--","-----");//为了达到长度补空格 第一个参数采用左对齐,剩余部分右对齐 
	}
	public void getInfo(String name,int id,float price) {//调用format函数,设定输出格式
		formatter.format("%10.10s %5d %6.2f\n", name,id,price);//字符串最多显示10位  小数最多显示2位
	}
	public static void main(String[] args) {
	
		tryFormat tFormat=new tryFormat(new Formatter(System.out));//传入输出流参数后,可将format 函数的数据显示在该输出流中
		tFormat.getTitle();
		PrintStream printStream=new PrintStream(System.out);
		tryFormat tFormat2=new tryFormat(new Formatter(printStream));
		tFormat2.getInfo("potato is so deliocious ", 1, 10.36985f);
		tFormat.getInfo("tomato great", 2, 10.1f);
	}

}

5.正则表达式
String、StringBuffer、StringTokenizer类中提供了简单的正则表达式功能,同时Java.util.regex包中提供了类Pattern和类Matcher可以实现完整的正则表达式功能。
先从简单的String、Stringbuffer自带的正则表达式功能讲起:
三个方法支持正则表达式的查询及处理:
match(“regex”)
spilt(“regex”) 以匹配到的字符串切割目标字符串,匹配到的子字符串不出现在切割目标字符串的结果中
replace(“regex”,“新的字符串”)

创建正则表达式(regex):
一些特殊的表达即可表示character classes:
. any character
[abc] ==(a | b|c)==a or b or c
[^abc] 除了abc之外的任意一个字符
[a-zA-Z] a-z or A-Z中的一个字符
\s space |tab |newline
\d 0-9
\D 非0-9
\w [a-zA-Z_0-9]
boundary :
^ $
匹配次数:

  • 不曾匹配到 、匹配多次
  • +匹配到一次或者多次
  • ? 不曾匹配到、匹配一次
    匹配方法:
    greedy(默认、最长匹配)、独占、reluctant(最短匹配)

如何使用Matcher和Pattern类?

Pattern类中静态方法:
Pattern.compile(String类型的正则表达式规则),生成pattern
Pattern.compile(正则表达式,int flag)
可选的flag(常用):
?m 可以按行匹配(由多行构成的字符串)== Pattern.MULTILINE
?i 忽略大小写==Pattern.CASE_INSENSITIVE
非静态方法:
matcher(待检测字符串),使得pattern去匹配待检测的字符串,返回Matcher对象
spilt(待检测字符串),得到的是字符串数组(以在目标字符串中匹配到的子串来切割检测字符串生成的字符串数组)

Matcher类的非静态方法:
find()类似iterator,搜寻目标字符串中是否还存在pattern ,目标字符串的index自动改变以继续查找
find(i) i指定了目标字符串的index,从指定的index查找pattern(与上一个函数相比,指定了目标字符串的index)
lookingat()pattern是否出现在目标字符串的开始
matches()pattern是否完全等于目标字符串(从头到尾)
start()当前pattern匹配目标字符串时得到的子串在目标字符串的start index
end()当前pattern匹配目标字符串时得到的子串在目标字符串的end index+1
reset() 重新置入待检测的字符串 ,对待检测的字符串做相同的处理(matcher 或是 spilt)
appendReplacement(stringBuffer ,replacement)方法支持边匹配边替换:
StringBuffer存储的是待检测字符串中匹配到的子串之前的字符串,再将当前的replacement加到stringBuffer
appendTail(stringBuffer):
一旦使用了appendReplacement方法,还需要使用该方法,将待检测的末尾未匹配的字符串加到stringBuffer上
特别的是,replaceAll()和replaceFirst()是由字符串对象调用,不需要特意生成pattern对象

关于groups的概念(由matcher对象调用):
在指定正则表达式时,通过括号形式指定了group,从左至右,第一个括号记为组1,依次往下,组0是指整个正则表达式。
相应的在匹配目标字符串时,获取到的目标字符串的子串根据正则表达式也有组号
group(i) 获取指定组号的字符串
group()获取整个字符串
groupcount()获取包含的组数

matcher+find方法简单应用
package stringdemo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestPatternAndMatcher {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("input text is\n"+ args[0]);
		for(String arg:args){
			System.out.println(" pattern is :"+arg);
			Pattern pattern=Pattern.compile(arg);
			Matcher matcher=pattern.matcher(args[0]);
			while(matcher.find()){
				System.out.println(matcher.group()+" start index is "+matcher.start());
			}
		}
	}
	

}

spilt方法简单应用
public class TestPatternAndMatcher {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("input text is\n"+ args[0]);
		for(String arg:args){
			System.out.println(" pattern is :"+arg);
			Pattern pattern=Pattern.compile(arg);
			System.out.println(Arrays.toString(pattern.split(args[0])));
		}
	}
	

}

appendReplacement()和appendTail()应用
public class TestPatternAndMatcher {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("input text is\n"+ args[0]);
		for(String arg:args){
			System.out.println(" pattern is :"+arg);
			Pattern pattern=Pattern.compile(arg);
			Matcher matcher=pattern.matcher(args[0]);
			StringBuffer stringBuffer=new StringBuffer();
			while(matcher.find()){
				//System.out.println(matcher.group()+" start index is "+matcher.start());
			matcher.appendReplacement(stringBuffer, "ABC");
			
			}
			matcher.appendTail(stringBuffer);
			System.out.println(stringBuffer);
			//System.out.println(Arrays.toString(pattern.split(args[0])));
			
			
		}
	}
	

}

测试reset方法  是Matcher类的方法
public class TestPatternAndMatcher {
	public static void main(String[] args) {
		System.out.println("input text is: "+args[0]);
		Pattern pattern=Pattern.compile(args[1]);
		Matcher matcher=pattern.matcher(args[0]);
		while(matcher.find()){
			System.out.println(matcher.group());
		}
		matcher.reset("abc");
		//依旧是matcher方式匹配待匹配字符串,改变了待检测的字符串
		while(matcher.find()){
			System.out.println(matcher.group());
		}
	}
}

6.Scanner类(总感觉Scanner还有好多东西)
在next()方法中,类似于spilt方法,将字符串分割为数组,默认以空格分割字符串,封装了tokenize、parsing操作,无需自己再去切分字符串。
Scanner 构造方法的参数可以是String、InputStream、File、or something readable
默认的分割方式是空格,也可以设置pattern来分割字符串,通过hasnext()和next()取出,使用useDelimiter(regex)
类似于match方法的字符串匹配,不同的地方在于把可读序列封装为Scanner类了,使用方法改变:
Scanner对象封装输入数据,String表示pattern模式,进行匹配Scanner.next(pattern),scanner.match()返回匹配结果对象MatchResult

//scanner的usedelimiter()、next()、hasnext()  设定分隔符,得到切分结果
public class TestScanner {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string="aa.bb.cc.dd ";
		Scanner scanner=new Scanner(string);
		String pattern="\\.";
		scanner.useDelimiter(pattern);
		while(scanner.hasNext())
			System.out.println(scanner.next());
	
		
	}

}

//在封装的Scanner上去匹配某一个pattern,hasNext(),Next()方法实现匹配pattern,match方法得到匹配结果。
public class TestScanner {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	String string="aa bb ccdd ";
	Scanner scanner=new Scanner(string);
String  pattern ="\\w+";
while(scanner.hasNext(pattern))
{
	scanner.next(pattern);
	MatchResult matchResult=scanner.match();
	System.out.println(matchResult.group());
}	
}

}
//利用scanner 不用自己截取感兴趣的数据,直接利用封装的方法
public class Scanner2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println(“please input your name”);
String in=scanner.nextLine();
System.out.println(“input your favorite age and number”);
int age=scanner.nextInt();
int number=scanner.nextInt();
//System.out.println("age is “+age+”, number is "+number);
System.out.format(“your age is %d, favorite number is %d”, age,number);
}
}

猜你喜欢

转载自blog.csdn.net/m0_37937932/article/details/84762327