JavaSE01_Day01(下)-字符串常用API(下)、StringBuilder封装可变字符串
1.1 根据位置获取字符charAt()
package cn.tedu.str;
/**
* 根据指定的位置,获取该位置所对应字符串中具体位置的字符
* charAt(int index)方法参数需要传递具体的下标位置
* @author cjn
*
*/
public class StrCharAtDemo {
public static void main(String[] args) {
String str = "今天是星期六";
// 0 1 2 3 4 5
char c1 = str.charAt(2);
System.out.println(c1);//是
System.out.println("-----------面试笔试题中可能会使用该API-----------");
String str2 = "上海自来水来自海上";//判断是否是回文数
int str2Len = str2.length();
for (int i = 0; i < str2Len/2 ; i++) {//遍历一半就可以了
char c2 = str2.charAt(i);
char c3 = str2.charAt(str2Len-1-i);
if (c2 != c3) {
//不是回文
System.out.print("不");
break;//结束整个循环
}
}
System.out.print("是回文");//此句始终会输出,当是回文时,不拼接上面的"不",否则拼接
}
}
运行结果:
是
-----------面试笔试题中可能会使用该API-----------
是回文
1.2 字符串转换大小写
package cn.tedu.str;
/**
* 讲字符串中英文字母转变成全大写或者全小写
* String toUpperCase()
* String toLowerCase
* @author cjn
*
*/
public class ToUpperCase_ToLowerCaseDemo {
public static void main(String[] args) {
String str = "yyds666";
//转成全大写,只能全部转换
String uperStr = str.toUpperCase();
System.out.println("转变为全大写的字符串:"+uperStr);
//转成全小写
String lowerStr = uperStr.toLowerCase();
System.out.println("转变为全小写的字符串:"+lowerStr);
}
}
测试结果:
转变为全大写的字符串:YYDS666
转变为全小写的字符串:yyds666
1.3 判断字符串的首尾内容
package cn.tedu.str;
/**
* 判断一个字符串是否是以指定的前缀开始和后缀结束。
* @author cjn
*
*/
public class StrStartsWithDemo {
public static void main(String[] args) {
String str = "欢迎同学们跟着包老师学习第二阶段API知识";
boolean b = str.startsWith("欢迎");
System.out.println("是否是以某个字符开始的:"+b);
b = str.endsWith("知识");
System.out.println("是否是以某个字符结束的:"+b);
}
}
测试结果:
是否是以某个字符开始的:true
是否是以某个字符结束的:true
1.4 基本数据类型转换为字符串
package cn.tedu.str;
/**
* 将基本数据类型的数据转换为字符串类型
* valueOf() 该方法是静态方法(类方法),需要通过类名调用
* @author cjn
*
*/
public class StrValueOfDemo {
public static void main(String[] args) {
int score = 100;
//整数->字符串
String str = String.valueOf(score);
System.out.println(str);
//验证
System.out.println(str + 8);//1008 进行的是字符串拼接
//其他解决方案
System.out.println(score + "" + 1);//注意""之间没有空格
}
}
测试结果:
100
1008
1001
二、StringBuilder封装可变字符串
在之前的学习过程中,我们已经得知,String是一个不可变对象,那么每当对字符串进行修改时,都会进行创建一个新的字符串对象。如果现在业务需求中是需要频繁的对一个字符串进行修改,那么就会增加内存的压力,从而当创建的对象数量过于庞大时,可以能就会造成内存泄漏和内存溢出的情况发生,程序会终止执行(报错)。需要避免内存开销过大,Java专门提供了一个类StringBuilder,用于对字符串做频繁的修改操作业务。
2.1 定义:
StringBuilder类是java.lang包下的,该类内部维护的是一个可变的字符串,但是这个类本身并不是一个字符串,可以理解成这个类是一个String字符串类的工具类。
2.2 使用StringBuilder类的意义
当需要对一个字符串进行频繁修改的时候,需要使用到StringBuilder和StringBuffer类进行处理。和String字符串类不同的是,StringBuilder和StringBuffer这两个类是允许字符串进行多次修改的,并且不会产生新的不被使用的对象,内部维护的是一个可变字符数组。
-
StringBuilder该类是JDK5以后提出的,它和StringBuffer类最大的区别是:StringBuilder不是线程安全的(不能进行同步访问),执行速度较快。
-
StringBuffer 相对于StringBuilder类而言是线程安全的,执行速度较慢。
注意:
工作中如果需要考虑多线程并发安全问题,使用StringBuffer,否则使用StringBuilder。
有关于线程安全问题,第二阶段后面课程讲解。
2.3 使用String字符串频繁修改创建对象
package cn.tedu.sb;
/**
* 使用String字符串类进行频繁修改操作
* @author cjn
*
*/
public class StringBadDemo {
public static void main(String[] args) {
String str = "a";
//频繁修改拼接1000000
for (int i = 0; i < 1000000; i++) {
str = str + str;
}
System.out.println("over");
}
}
报错:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
频繁new对象,以指数方式扩增,最终导致堆内存溢出!!!
2.4 使用StringBuilder频繁修改字符串
package cn.tedu.sb;
/**
* 使用StringBuilder对象对字符串做频繁修改操作
* @author cjn
*
*/
public class StringBuilderDemo01 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("a");
//频繁修改拼接1000000
for (int i = 0; i < 1000000; i++) {
sb.append("a");
}
System.out.println("over");
}
}
over
结果分析