JavaSE01_Day01(下)-字符串常用API(下)、StringBuilder封装可变字符串

一、字符串常用API(下)

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

结果分析:运行很快,结果马上就出来了,但是如果以指数方式扩增,也会导致堆内存溢出,毕竟堆内存也是有大小的,太大了也不行!!!

posted @ 2021-06-05 23:34  Coder_Cui  阅读(100)  评论(0编辑  收藏  举报