Java实例——Java字符串
1、字符串比较:字符串1 :a 字符串2:b 对象:object =a :c
(1)a.compareTo(b)-----------不忽略大小写,不一样就返回a-b的首字符的ASII的值。
(2)a.compareTo(c.tostring())-----------toString()返回对象本身
(3)a.compareToIgnoreCase(b)---------忽略大小写
//toString()返回此对象本身
//object.toString()是类型转换,Object转String,自定义对象需要重写toString。
引申:
如何将Object类型转换成String类型
(1)Object.toString()
注意:Object值允许是null,编译没有错,执行会报NullPointerException异常。
(2)强制转换,(String)Object
注意:转换的类型必须是能转换成String的,否则执行会报ClassCastException异常。
(3)String.valueOf(Object)
注意:Object值允许是null,编译没有错,执行会报NullPointerException异常。
ublic static void main(String[] args) {
// 字符串比较
String str1 ="Hello World";
String str2 ="hello world";
//string转换成object
Object object =str2;
//object转换成string
Object ob1 ="hello world";
String string =(String)ob1;
System.out.println(string);
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareTo(object.toString()));//object转换成string
System.out.println(String.valueOf(""));//object转换成string
System.out.println(String.valueOf(object));//object转换成string
System.out.println(str1.compareToIgnoreCase(str2));
}
输出结果:
hello world
-32
-32
hello world
0
2、查找字符串最后一次出现的位置: 字符串1 :a 子字符串:b
a.lastIndexOf(b)--------------返回整型,显示查询字符在指定范围内最后一次出现的索引位置
//没有,返回-1
System.out.println("Hello world heello hello Hello".lastIndexOf("llo"));
输出结果:
27
3、删除字符串中的一个字符:字符串 :a
a.substring(0)------------------截取字符,默认0为开始字符
【1】先要定义一个删除方法,打印删除后的字符。调用函数,a的参数没有改变。
String Delete(String a,int p){
return a.substring(0,p)+a.substring(p+1);
}
【2】调用删除方法,打印。
public static void main(String[] args) {
String str ="Hello world";
System.out.println(delete(str,2));//调用delete方法
}
public static String delete(String str,int port) {
return str.substring(0,port)+str.substring(port+1);
}
输出结果:
Helo world
4、字符串替换:字符串 :a
(1)a.replace(a1,a2)-----------替换所有匹配的字符或字符串
(2)a.replaceFirst(String a1,String a2)--------替换第一次匹配出现的字符串,参数是正则表达式
(3)a.replaceAll(String a1,String a2)--------替换所有匹配的字符串,参数是正则表达式。如果参数不是reges,和replace()方法相同。
//调用原字符串,原字符串的内容没有发生改变
String str ="Hello World com.qst.com";
System.out.println(str.replace('l', 'a'));
System.out.println(str.replace("ll", "a"));
System.out.println(str.replaceAll("\\.", "aaa"));
System.out.println(str.replaceAll("", "aa"));
System.out.println(str.replaceFirst("l", "a"));
输出结果:
Heaao Worad com.qst.com
Heao World com.qst.com
Hello World comaaaqstaaacom
aaHaaeaalaalaaoaa aaWaaoaaraalaadaa aacaaoaamaa.aaqaasaataa.aacaaoaamaa
Healo World com.qst.com
5、字符串反转:字符串 :a
利用reverse()成员方法--------------表示将一个输入流倒叙输出。
//此方法针对的是io流,不能针对字符串。
举例:
StringBuffer str =new StringBuffer(a)
str.reverse().toString();//调用反转方法
引申:
Java中String,StringBuffer与StringBuilder的区别:
(1)可变与不可变:
String是不可变的对象,每次进行改变就相当于产生一个新的对象;StringBuffer和StringBuilder是可变的字符序列。
(2)线程安全:
String和StringBuffer(加了同步锁),线程是安全的。
单线程情况下,StringBuilder提高效率;在多线程情况下,适合使用StringBuffer。
String str ="Hello World";
StringBuffer strb =new StringBuffer(str);
System.out.println(strb.reverse().toString());
输出结果:
dlroW olleH
6、字符串查找:字符串1 :a 子字符串:b
a.indexOf(b)--------------返回整型,显示查询字符在指定范围内第一次出现的索引位置
//没有,返回-1
System.out.println("Hello".indexOf('l'));
输出结果:
2
7、字符串分割:字符串 :a ——使用正则表达式
a.split(“分割符”)-----------------返回数组,通过指定分割符将字符串分割为数组。
//“.”号需要转义“\.”,for循环,foreach循环取出数组。
String str ="com.qst.com.baidu";
String[] str2 =str.split("\\.");
for(String a: str2) {
System.out.println(a);
}
输出结果:
com
qst
com
baidu
8、字符串分割:字符串 :a ——使用逐字分裂字符
StringTokenizer是一个用来分隔String的应用类.。
//如果不用正则表达式(StringTokenizer也不能使用正则表达式),StringTokenizer在截取字符串中的效率要高。
注意,StringTokenizer的分隔符不需要使用转义字符。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。
String str="This is String , l";
StringTokenizer st =new StringTokenizer(str);//默认分隔符,并且默认打印不显示
while(st.hasMoreElements()){//返回是否还有分割符 System.out.println(st.nextElement());//返回Object,打印从当前位置到下一个分隔符的字符串。nextToken(),返回String类型。
}
输出结果:
This
is
String
,
l
9、字符串大小写:字符串 :a
(1)a.toUpperCase()------------------将字符串从小写转为大写,返回String
(2)a.toLowerCase()------------------将字符串从大写转为小写,返回String
System.out.println("abABcAb".toLowerCase());
System.out.println("abABcAb".toUpperCase());
输出结果:
ababcab
ABABCAB
10、测试两个字符串区域是否相等:字符串1 :a 字符串2:b
a.regionMatches(true,3,b,4,9)---------返回boolean,测试两个字符串区域是否相等
//true 表示忽略大小写区别
//表示字符串a从第3个字符开始和字符串b第4个字符开始逐个比较,共比较9个字符。
String str1 ="aabbacabefgbcabc";
String str2 ="accbcbAcbac";
System.out.println(str1.regionMatches(true, 3, str2, 5, 3));
输出结果:
true
11、字符串性能比较测试——创建字符串花费时间
System.currentTimeMilllis()--------------返回一个毫秒值,获取当前系统时间。
//使用纳秒:System.nanoTime()
【1】获取开始时间
【2】创建字符串
【3】获取结束时间
【4】花费时间=结束时间-开始时间
long startTime =System.currentTimeMillis();
for(int i=0;i<50000;i++){
String s1 =new String("hello");
}
long endTime1 =System.currentTimeMillis();
System.out.println("通过 String 对象创建字符串"
+ " : " + (endTime1 - startTime)
+ " 毫秒");
输出结果:
通过 String 对象创建字符串 : 14 毫秒
12、字符串优化——针对常量池的优化:字符串:a
a.intern()-----------把字符串对象加入常量池中
//如果常量池中已经有该字符串,则返回池中的字符串;
否则将此字符串添加到常量池中,并返回字符串的引用。
//从常量池中取数据要比从堆里面取数据要快一些。
//编译期确定的字符串常量还有java中基本类型的包装类大部分存放在常量池中,
有引用类型的保存在堆内存
//浮点类型的包装类没有实现常量池技术
13、字符串格式化
(1)%字符串格式化
(2)format字符串格式化
(3)F字符串
System.out.println(String.format("大家好,我叫:%s","小明"));
输出结果:
大家好,我叫:小明
14、连接字符串
(1)直接用+号连接。//编译器将构造一个StringBuffer对象,并调用append对象。
(2)自己构造StringBuffer对象,使用append()方法连接。
String str1 ="He"+"llo";
StringBuffer str2 =new StringBuffer();
str2.append("He")
.append("llo");
System.out.println(str1);
System.out.println(str2);
输出结果:
Hello
Hello