1.Scanner类与String类

1.1 Scanner类

Scanner类作用

用Scanner类的方法可以完成接收键盘录入的数据

  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-24-10:08
  5. */
  6. import java.util.Scanner;
  7. /**
  8. * 用于字符串的获取
  9. * Scanner用于获取键盘输入的数据(基本类型,字符串类型)
  10. * 获取字符串类型:nextLine();--获取下一行字符串的数据(换行)
  11. * next();--获取下一个字符开始的数据(不换行)
  12. * 获取int类型:nextInt();
  13. *
  14. */
  15. public class ScannerDemo {
  16. public static void main(String[] args) {
  17. //实例化Scanner--系统中提供好的api
  18. Scanner sc=new Scanner(System.in);//System.in表示系统中输入的内容获取
  19. //接收数据
  20. System.out.println("请输入数据:");
  21. String s=sc.nextLine();
  22. String s1=sc.next();
  23. int n=sc.nextInt();
  24. System.out.println("s:"+s);
  25. System.out.println("s1:"+s1);
  26. System.out.println("n:"+n);
  27. //Scanner其实就是一个占用的资源,使用结束以后记得关闭
  28. //如果不关闭,会一直占用内存
  29. sc.close();
  30. }
  31. }

1.2 String类

String类概述

通过JDK提供的API,查看String类的说明
A:”abc”是String类的一个实例,或者成为String类的一个对象
B:字符串字面值”abc”也可以看成是一个字符串对象
C:字符串是常量,一旦被赋值,就不能被改变
D:字符串本质是一个字符数组

  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-24-10:25
  5. */
  6. /**
  7. * 字符串:string
  8. * 属于java.lang包下的api,使用的时候不需要导包
  9. *
  10. * 字符串是一个串,是多个字符连接而成
  11. *
  12. * 字符串的底层其实就是字符类型的数组
  13. */
  14. public class PreString {
  15. public static void main(String[] args) {
  16. //储备知识
  17. String s="王嘉尔好帅!";
  18. //底层的实现--字符类型的数组
  19. char[] c={'王','嘉','尔','好','帅','!'};
  20. }
  21. }

String类的构造方法

  1. String(String original):把字符串数据封装成字符串对象<br /> String(char[] value):把字符数组的数据封装成字符串对象<br /> String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象<br />**注意:字符串是一种比较特殊的引用数据类型,直接输出字符串对象输出的是该对象中的数据。**<br />/**<br />* **面试题:**<br />* String s="hello";s=s+"world",<br />* 问:原始值变了没有<br />* 答案:没有<br />* 解释:因为String是不可变类,即类的实例是不可被修改的。<br />*在这段代码中,s原来指向一个String对象,内容是“hello”,然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为”helloworld!",原来那个对象还存在内存中,只是s这个引用变量不再指向他了。<br />*/<br />// String s="hello";<br />// s1=s+"world";<br />// System.out.println(s);<br />// System.out.println(s1);
  1. package com.igeek_03;
  2. /**
  3. * @author Lynn
  4. * @create 2020-11-24-10:30
  5. */
  6. /**
  7. * 演示String常用的构造方法
  8. *
  9. * 构造函数:
  10. * String(String original):把字符串封装成字符串对象
  11. * String(char[] value):把字符数组封装成字符串对象
  12. * String(char[] value,int index,int count):把一部分字符数组封装成字符串对象
  13. *
  14. * 注意:
  15. * 字符串是一个比较特殊的引用类型数据,直接输出字符串对象的时候输出的就是对象中的数据
  16. */
  17. public class StringDemo {
  18. public static void main(String[] args) {
  19. //方式1--用的最多
  20. String s1=new String("hello");
  21. //在String的底层重写了toString()方法
  22. System.out.println(s1);//hello
  23. System.out.println("---------------");
  24. //方式2
  25. char[] chs={'h','e','l','l','o'};
  26. //char chs[]={'h','e','l','l','o'};//也可以
  27. String s2=new String(chs);
  28. System.out.println(s2);//hello
  29. //方式3
  30. String s3=new String(chs,0, chs.length);
  31. System.out.println(s3);//hello
  32. String s4=new String(chs,1,3);
  33. System.out.println(s4);//ell
  34. //方式4--字符串的特殊声明方式,直接按照基本类型的声明格式使用!!
  35. // --是Java对于String的恩赐
  36. String s5="故事的";
  37. System.out.println(s5);//故事的
  38. int a=10;
  39. // Integer i=new Integer(a);
  40. System.out.println(a);//10
  41. /**
  42. * 面试题:
  43. * String s="hello";s=s+"world",
  44. * 问:原始值变了没有
  45. * 答案:没有
  46. * 解释:因为String是不可变类,即类的实例是不可被修改的。
  47. */
  48. // String s="hello";
  49. // s1=s+"world";
  50. // System.out.println(s);
  51. // System.out.println(s1);
  52. }
  53. }

创建字符串对象两种方式的区别

1.通过构造函数创建的字符串保存在堆中
2.直接声明的字符串保存在方法区中的常量池中

常量池的作用:

  • Java字符串的优化机制
  • 1.如果说利用直接声明字符串的时候会去常量池查找,如果有相同的字符串存在

    1. 则直接拿来使用,不再创建新的字符串
  • 2.如果使用构造函数声明字符串(new),那么不管常量池中有没有相同的字符串都会在堆中

  • 创建一个新的字符串对象
  • ==:
  • 基本类型:比较的是数据类型的值是不是相同
  • 引用类型:比较的是引用类型的地址值是否相同 ```java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-11-24-11:07 */

/**

  • 当前案例演示通过构造函数创建字符串和直接声明字符串的区别
  • 1.通过构造函数创建的字符串保存在堆中
  • 2.直接声明的字符串保存在方法区中的常量池中 *
  • 常量池的作用:
  • Java字符串的优化机制
  • 1.如果说利用直接声明字符串的时候会去常量池查找,如果有相同的字符串存在
  • 则直接拿来使用,不再创建新的字符串 *2.如果使用构造函数声明字符串(new),那么不管常量池中有没有相同的字符串都会在堆中
  • 创建一个新的字符串对象 *
  • ==:
  • 基本类型:比较的是数据类型的值是不是相同
  • 引用类型:比较的是引用类型的地址值是否相同 */ public class StringDemo02 { public static void main(String[] args) {

    1. //构造函数创建
    2. String s1=new String("hello");
    3. //直接声明
    4. String s2="hello";
    5. System.out.println(s1);
    6. System.out.println(s2);
    7. //比较地址值
    8. System.out.println("s1==s2:"+(s1==s2));//s1==s2:false
    9. //s3直接从常量池中去拿的,并没有创建新的对象,其实就是s2
    10. String s3="hello";
    11. System.out.println("s1==s3:"+(s1==s3));//s1==s3:false
    12. System.out.println("s2==s3:"+(s2==s3));//s2==s3:true

    } } ``` image.png

    String类的判断功能

    boolean equals(Object obj):比较字符串的内容是否相同
    boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
    boolean startsWith(String str):判断字符串对象是否以指定的str开头
    boolean endsWith(String str):判断字符串对象是否以指定的str结尾 ```java package com.igeek_04;

/**

  • @author Lynn
  • @create 2020-11-25-0:34 */

/**

  • String判断的演示 *对象的顶级父类:Object
  • 是类层级结构中的根类(是Java中的顶级父类),所有的类都直接或者是间接的继承Object *
  • String判断功能
  • boolean equals(Object):比较两个字符串的内容是不是相同(比较两个双胞胎像不像)
  • boolean equalsIgnoreCase(String str):比较两个字符串的内容是不是一样,忽略大小写
  • boolean startWith(String str):判断这个字符串是不是以指定的str开头
  • boolean endWith(String str):判断这个字符串是不是以指定的str结束 *
  • 注意:
  • ==与equals的区别(面试题)
  • 1.==在基本类型中比较的是两个变量的值是不是相等
  • 2.==在引用类型中比较的是两个对象的地址值是不是相同
  • 3.equals在引用类型中比较的是两个对象像不像
  • 4.在Object类中有一个equals方法,这个方法如果不重写,是按照==的比较规则进行比较的 */ //public class StringDemo extends Object{ // String name; // // @Override // public String toString() { // return “StringDemo{“ + // “name=’” + name + ‘\’’ + // ‘}’; // } //} public class StringDemo{ public static void main(String[] args) {

    1. //创建字符串的对象--直接赋值方式
    2. String s1="hello";
    3. String s2="hello";
    4. String s3="HELLO";
    5. //boolean equals(Object):比较两个字符串的内容是不是相同(比较两个双胞胎像不像)
    6. System.out.println(s1.equals(s2));//true
    7. System.out.println(s1.equals(s3));//false
    8. System.out.println(s1.equalsIgnoreCase(s3));//true
    9. //boolean startWith(String str):判断这个字符串是不是以指定的str开头--大小写敏感
    10. System.out.println(s1.startsWith("h"));//true
    11. //boolean endWith(String str):判断这个字符串是不是以指定的str结束--大小写敏感
    12. System.out.println(s1.endsWith("o"));//true

    } } ```

    判断功能案例

    需求:模拟登录,给三次机会,并提示还有几次 ```java package com.igeek_04;

/**

  • @author Lynn
  • @create 2020-11-26-20:42 */

import java.util.Scanner;

/**

  • 需求:模拟登录,给三次机会,并提示还有几次
  • 分析:
  • A:定义两个字符串对象,用于存储已经存在的用户名和密码
  • B:键盘录入用户名和密码
  • C:拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
  • 如果内容相同,提示登录成功
  • 如果内容不同,提示登录失败,并提示还有几次机会 */ public class Test { public static void main(String[] args) { //定义两个字符串对象,用于存储已经存在的用户名和密码 String username=”wlll”; String userpswd=”wlll”;
  1. //给三次机会,用for循环实现
  2. for (int i = 0; i <3 ; i++) {
  3. //键盘录入用户名和密码
  4. Scanner sc=new Scanner(System.in);
  5. System.out.println("请输入用户名");
  6. String name=sc.nextLine();
  7. System.out.println("请输入密码");
  8. String pswd=sc.nextLine();
  9. //拿键盘录入的用户名和密码和已经存在的用户名和密码进行比较
  10. if (username.equals(name) && userpswd.equals(pswd)){
  11. System.out.println("登录成功!");
  12. break;
  13. }else if (i==2){
  14. System.out.println("用户名和密码被锁定,请与管理员联系!");
  15. }else {
  16. System.out.println("登录失败,你还有"+(2-i)+"次机会!");//2,1,0
  17. //break;
  18. }
  19. }
  20. }

}

  1. <a name="aXBvn"></a>
  2. ### String类的获取功能
  3. String类的获取功能:
  4. - int length():获取字符串的长度,其实也就是字符个数
  5. - char charAt(int index):获取指定索引处的字符
  6. - int indexOf(String str):获取str在字符串对象中第一次出现的索引
  7. - String substring(int start):从start开始截取字符串
  8. - String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
  9. ```java
  10. package com.igeek_02_04;
  11. /**
  12. * @ClassName: StringDemo
  13. * @Description: String类的获取功能
  14. * @date 2017年11月11日 上午11:03:08
  15. * Company www.igeekhome.com
  16. *
  17. * String类的获取功能:
  18. * int length():获取字符串的长度,其实也就是字符个数
  19. * char charAt(int index):获取指定索引处的字符
  20. * int indexOf(String str):获取str在字符串对象中第一次出现的索引
  21. * String substring(int start):从start开始截取字符串
  22. * String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end
  23. */
  24. public class StringDemo {
  25. public static void main(String[] args) {
  26. //创建字符串对象
  27. String s = "helloworld";
  28. //int length():获取字符串的长度,其实也就是字符个数
  29. System.out.println(s.length());
  30. System.out.println("--------");
  31. //char charAt(int index):获取指定索引处的字符
  32. System.out.println(s.charAt(0));
  33. System.out.println(s.charAt(1));
  34. System.out.println("--------");
  35. //int indexOf(String str):获取str在字符串对象中第一次出现的索引
  36. System.out.println(s.indexOf("l"));
  37. System.out.println(s.indexOf("owo"));
  38. System.out.println(s.indexOf("ak"));
  39. System.out.println("--------");
  40. //String substring(int start):从start开始截取字符串
  41. System.out.println(s.substring(0));
  42. System.out.println(s.substring(5));
  43. System.out.println("--------");
  44. //String substring(int start,int end):从start开始,到end结束截取字符串
  45. System.out.println(s.substring(0, s.length()));
  46. System.out.println(s.substring(3,8));
  47. }
  48. }

案例

  1. package com.igeek_02_04;
  2. /**
  3. * @ClassName: StringTest
  4. * @Description: 遍历字符串(获取字符串中的每一个字符)
  5. * @date 2017年11月11日 上午11:09:15
  6. * Company www.igeekhome.com
  7. *
  8. */
  9. public class StringTest {
  10. public static void main(String[] args) {
  11. //创建一个字符串对象
  12. String s = "abcde";
  13. //原始做法
  14. System.out.println(s.charAt(0));
  15. System.out.println(s.charAt(1));
  16. System.out.println(s.charAt(2));
  17. System.out.println(s.charAt(3));
  18. System.out.println(s.charAt(4));
  19. System.out.println("---------");
  20. //用for循环改进
  21. for(int x=0; x<5; x++) {
  22. System.out.println(s.charAt(x));
  23. }
  24. System.out.println("---------");
  25. //用length()方法获取字符串的长度
  26. for(int x=0; x<s.length(); x++) {
  27. System.out.println(s.charAt(x));
  28. }
  29. }
  30. }
  1. package com.igeek_02_04;
  2. import java.util.Scanner;
  3. /**
  4. * @ClassName: StringTest2
  5. * @Description: 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)
  6. * @date 2017年11月11日 上午11:10:44
  7. * Company www.igeekhome.com
  8. *
  9. * 分析:
  10. * A:键盘录入一个字符串数据
  11. * B:定义三个统计变量,初始化值都是0
  12. * C:遍历字符串,得到每一个字符
  13. * D:拿字符进行判断
  14. * 假如ch是一个字符。
  15. * 大写:ch>='A' && ch<='Z'
  16. * 小写:ch>='a' && ch<='z'
  17. * 数字:ch>='0' && ch<='9'
  18. * E:输出结果
  19. */
  20. public class StringTest2 {
  21. public static void main(String[] args) {
  22. //键盘录入一个字符串数据
  23. Scanner sc = new Scanner(System.in);
  24. System.out.println("请输入一个字符串数据:");
  25. String s = sc.nextLine();
  26. //定义三个统计变量,初始化值都是0
  27. int bigCount = 0;
  28. int smallCount = 0;
  29. int numberCount = 0;
  30. //遍历字符串,得到每一个字符
  31. for(int x=0; x<s.length(); x++) {
  32. char ch = s.charAt(x);
  33. //拿字符进行判断
  34. if(ch>='A' && ch<='Z') {
  35. bigCount++;
  36. }else if(ch>='a' && ch<='z') {
  37. smallCount++;
  38. }else if(ch>='0' && ch<='9') {
  39. numberCount++;
  40. }else {
  41. System.out.println("该字符"+ch+"非法");
  42. }
  43. }
  44. //输出结果
  45. System.out.println("大写字符:"+bigCount+"个");
  46. System.out.println("小写字符:"+smallCount+"个");
  47. System.out.println("数字字符:"+numberCount+"个");
  48. }
  49. }

String类的转换功能

char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串

案例

  1. package com.igeek_02_05;
  2. /**
  3. * @ClassName: StringDemo
  4. * @Description: String类的转换功能
  5. * @date 2017年11月11日 上午11:13:33
  6. * Company www.igeekhome.com
  7. *
  8. * String类的转换功能:
  9. * char[] toCharArray():把字符串转换为字符数组
  10. * String toLowerCase():把字符串转换为小写字符串
  11. * String toUpperCase():把字符串转换为大写字符串
  12. *
  13. * 字符串的遍历:
  14. * A:length()加上charAt()
  15. * B:把字符串转换为字符数组,然后遍历数组
  16. */
  17. public class StringDemo {
  18. public static void main(String[] args) {
  19. //创建字符串对象
  20. String s = "abcde";
  21. //char[] toCharArray():把字符串转换为字符数组
  22. char[] chs = s.toCharArray();
  23. for(int x=0; x<chs.length; x++) {
  24. System.out.println(chs[x]);
  25. }
  26. System.out.println("-----------");
  27. //String toLowerCase():把字符串转换为小写字符串
  28. System.out.println("HelloWorld".toLowerCase());
  29. //String toUpperCase():把字符串转换为大写字符串
  30. System.out.println("HelloWorld".toUpperCase());
  31. }
  32. }
  1. package com.igeek_02_05;
  2. import java.util.Scanner;
  3. /**
  4. * @ClassName: StringTest
  5. * @Description: 键盘录入一个字符串,把该字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
  6. * @date 2017年11月11日 上午11:16:20
  7. * Company www.igeekhome.com
  8. *
  9. * 分析:
  10. * A:键盘录入一个字符串
  11. * B:截取首字母
  12. * C:截取除了首字母以外的字符串
  13. * D:B转大写+C转小写
  14. * E:输出即可
  15. */
  16. public class StringTest {
  17. public static void main(String[] args) {
  18. //键盘录入一个字符串
  19. Scanner sc = new Scanner(System.in);
  20. System.out.println("请输入一个字符串:");
  21. String s = sc.nextLine();
  22. //截取首字母
  23. String s1 = s.substring(0, 1);
  24. //截取除了首字母以外的字符串
  25. String s2 = s.substring(1);
  26. //B转大写+C转小写
  27. String s3 = s1.toUpperCase()+s2.toLowerCase();
  28. //输出即可
  29. System.out.println("s3:"+s3);
  30. }
  31. }

String类的其它功能

去除字符串两端空格

  1. String trim()

按照指定符号分割字符串

  1. String[] split(String str)

案例

  1. package com.igeek_02_06;
  2. /**
  3. * @ClassName: StringDemo
  4. * @Description: String类的其它功能
  5. * @date 2017年11月11日 上午11:18:31
  6. * Company www.igeekhome.com
  7. *
  8. * 去除字符串两端空格
  9. * String trim()
  10. * 按照指定符号分割字符串
  11. * String[] split(String str)
  12. */
  13. public class StringDemo {
  14. public static void main(String[] args) {
  15. //创建字符串对象
  16. String s1 = "helloworld";
  17. String s2 = " helloworld ";
  18. String s3 = " hello world ";
  19. System.out.println("---"+s1+"---");
  20. System.out.println("---"+s1.trim()+"---");
  21. System.out.println("---"+s2+"---");
  22. System.out.println("---"+s2.trim()+"---");
  23. System.out.println("---"+s3+"---");
  24. System.out.println("---"+s3.trim()+"---");
  25. System.out.println("-------------------");
  26. //String[] split(String str)
  27. //创建字符串对象
  28. String s4 = "aa,bb,cc";
  29. String[] strArray = s4.split(",");
  30. for(int x=0; x<strArray.length; x++) {
  31. System.out.println(strArray[x]);
  32. }
  33. }
  34. }

String类的其它案例

  1. package com.igeek_02_06;
  2. /**
  3. * @ClassName: StringTest
  4. * @Description: 把数组中的数据按照指定个格式拼接成一个字符串
  5. * @date 2017年11月11日 上午11:20:04
  6. * Company www.igeekhome.com
  7. *
  8. * 举例:int[] arr = {1,2,3};
  9. * 输出结果:[1, 2, 3]
  10. *
  11. * 分析:
  12. * A:定义一个int类型的数组
  13. * B:写方法实现把数组中的元素按照指定的格式拼接成一个字符串
  14. * C:调用方法
  15. * D:输出结果
  16. */
  17. public class StringTest {
  18. public static void main(String[] args) {
  19. //定义一个int类型的数组
  20. int[] arr = {1,2,3};
  21. //写方法实现把数组中的元素按照指定的格式拼接成一个字符串
  22. //调用方法
  23. String s = arrayToString(arr);
  24. //输出结果
  25. System.out.println("s:"+s);
  26. }
  27. /*
  28. * 两个明确:
  29. * 返回值类型:String
  30. * 参数列表:int[] arr
  31. */
  32. /**
  33. * @Title: arrayToString
  34. * @Description: 数组转成字符串
  35. * @param arr
  36. * @return
  37. */
  38. public static String arrayToString(int[] arr) {
  39. String s = "";
  40. //[1, 2, 3]
  41. s += "[";
  42. for(int x=0; x<arr.length; x++) {
  43. if(x==arr.length-1) {
  44. s += arr[x];
  45. }else {
  46. s += arr[x];
  47. s += ", ";
  48. }
  49. }
  50. s += "]";
  51. return s;
  52. }
  53. }

字符串反转

  1. package com.igeek_02_06;
  2. import java.util.Scanner;
  3. /**
  4. * @ClassName: StringTest2
  5. * @Description: 字符串反转
  6. * @date 2017年11月11日 上午11:23:19
  7. * Company www.igeekhome.com
  8. *
  9. * 举例:键盘录入”abc”
  10. * 输出结果:”cba”
  11. *
  12. * 分析:
  13. * A:键盘录入一个字符串
  14. * B:写方法实现字符串的反转
  15. * a:把字符串倒着遍历,得到的每一个字符拼接成字符串。
  16. * b:把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
  17. * C:调用方法
  18. * D:输出结果
  19. */
  20. public class StringTest2 {
  21. public static void main(String[] args) {
  22. //键盘录入一个字符串
  23. Scanner sc = new Scanner(System.in);
  24. System.out.println("请输入一个字符串:");
  25. String s = sc.nextLine();
  26. //写方法实现字符串的反转
  27. //调用方法
  28. String result = reverse(s);
  29. //输出结果
  30. System.out.println("result:"+result);
  31. }
  32. /*
  33. * 把字符串倒着遍历,得到的每一个字符拼接成字符串。
  34. *
  35. * 两个明确:
  36. * 返回值类型:String
  37. * 参数列表:String s
  38. */
  39. /*
  40. public static String reverse(String s) {
  41. String ss = "";
  42. for(int x=s.length()-1; x>=0; x--) {
  43. ss += s.charAt(x);
  44. }
  45. return ss;
  46. }
  47. */
  48. /**
  49. * @Title: reverse
  50. * @Description: 把字符串转换为字符数组,然后对字符数组进行反转,最后在把字符数组转换为字符串
  51. * @param s
  52. * @return
  53. */
  54. public static String reverse(String s) {
  55. //把字符串转换为字符数组
  56. char[] chs = s.toCharArray();
  57. //对字符数组进行反转
  58. for(int start=0,end=chs.length-1; start<=end; start++,end--) {
  59. char temp = chs[start];
  60. chs[start] = chs[end];
  61. chs[end] = temp;
  62. }
  63. //最后在把字符数组转换为字符串
  64. String ss = new String(chs);
  65. return ss;
  66. }
  67. }

1.3 StringBuilder类

StringBuffer和StringBuilder的区别:

  • 1.StringBuffer是可追加的字符串,使用的方式和StringBuilder完全一样
  • 2.区别:
  • StringBuilder是jdk5.0推出的,线程不安全,但是效率高,优先选择使用
  • StringBuffer是jdk1.0推出的,线程是安全的,但是效率低(非特殊情况,可以不使用)
  • 3.Java在当初设计的时候做了过度设计,所以在jdk5.0的时候就推出了StringBuilder

  • 线程安全:一群人过安检—一个一个的过
  • 线程不安全:一群难民抢馒头吃 ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-11-25-10:04 */

/**

  • StringBuffer和StringBuilder的区别:
  • 1.StringBuffer是可追加的字符串,使用的方式和StringBuilder完全一样
  • 2.区别:
  • StringBuilder是jdk5.0推出的,线程不安全,但是效率高,优先选择使用
  • StringBuffer是jdk1.0推出的,线程是安全的,但是效率低(非特殊情况,可以不使用)
  • 3.Java在当初设计的时候做了过度设计,所以在jdk5.0的时候就推出了StringBuilder *
  • 线程安全:一群人过安检—一个一个的过
  • 线程不安全:一群难民抢馒头吃 / public class StringBufferDemo { public static void main(String[] args) {

    1. //创建对象
    2. StringBuffer sb=new StringBuffer();//不需要导包,就属于lang包
    3. //StringBuilder sb=new StringBuilder();结果一样
    4. //链式编程
    5. sb.append("黄药师,").append("洪七公,").append("欧阳锋,").append("段王爷,").append("王重阳");
    6. System.out.println(sb);

    } } ```

    StringBuilder类概述

    StringBuilder:是一个可变的字符串。字符串缓冲区类。
    String和StringBuilder的区别:
    String的内容是固定的
    StringBuilder的内容是可变的

    StringBuilder类的常用方法

    A:构造方法:
    StringBuilder()
    B:成员方法:
    public int capacity():返回当前容量 (理论值)
    public int length():返回长度(已经存储的字符个数)
    public StringBuilder append(任意类型):添加数据,并返回自身对象
    public StringBuilder reverse():反转功能 ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-11-25-10:17 */

/**

  • StringBuilder:是一个可变长度的字符串 *
  • 构造函数:StringBuilder()
  • 常用的成员方法:
  • public int capacity():返回当前的容量—理论值(默认值—16)
  • public int length():返回长度(字符数)—实际值 */ public class StringBuilderDemo { public static void main(String[] args) {
    1. //创建对象
    2. StringBuilder sb=new StringBuilder();
    3. System.out.println(sb);//空的可变字符串
    4. System.out.println("sb.capacity():"+sb.capacity());//16 --默认值
    5. System.out.println("sb.length():"+sb.length());//0
    } } ```

    ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-11-25-10:26 */

/**

  • 其他的用法:
  • 1.添加功能:append(任意类型的数据)
  • 2.反转功能:reverse() */ public class StringBuilderDemo02 { public static void main(String[] args) {

    1. //创建对象
    2. StringBuilder sb=new StringBuilder();
    3. //添加
    4. StringBuilder sb2=sb.append("你好");
    5. //输出结果
    6. System.out.println("sb:"+sb);//sb:你好
    7. System.out.println("sb2:"+sb2);//sb2:你好
    8. System.out.println(sb==sb2);//true
    9. //StringBuilder中的append方法会将所有的追加的元素统一转换为字符串进行处理--其实际效果就是:任意类型的数据+“
    10. sb.append(true);
    11. sb.append(9999);
    12. sb.append("王嘉尔");
    13. System.out.println(sb);//你好true9999王嘉尔
    14. //反转功能
    15. sb.reverse();
    16. System.out.println(sb);//尔嘉王9999eurt好你

    } } ```

    案例

    ```java package com.igeek_02;

/**

  • @author Lynn
  • @create 2020-11-25-10:43 */

import java.util.Scanner;

/**

  • 回文:
  • 上海自来水来自海上 *
  • 判断是不是回文
  • 是:返回true
  • 否:返回false */ public class Test { public static void main(String[] args) {

    1. //作用:程序的主入口,在业务逻辑中调用层--main方法中的业务逻辑越少越好
    2. Scanner sc=new Scanner(System.in);
    3. System.out.println("请输入字符串:");
    4. String s=sc.nextLine();
    5. //调用方法
    6. boolean flag=isSymmetry(s);//s表示通过sc获取到的字符串
    7. System.out.println(flag);
    8. sc.close();

    // StringBuilder sb=new StringBuilder(“上海自来水来自海上”); // StringBuilder sb2=new StringBuilder(sb.reverse()); // // System.out.println(); // System.out.println(sb.equals(sb2));//true

// sb.append(12321); // System.out.println(sb.reverse()); // System.out.println(sb==sb.reverse()); // System.out.println(“————————————————“); // // System.out.println(sb2.reverse()); // System.out.println(sb2==sb2.reverse()); } //封装一个方法—业务逻辑的封装—封装的越彻底越好 public static boolean isSymmetry(String s){ //逻辑代码—把字符串进行反转,之后的结果相同 //String转化成StringBuilder—再调用reverse()—再转回String //通过构造函数 StringBuilder sb=new StringBuilder(s); sb.reverse(); //转回String String result= sb.toString();

  1. //比较结果是不是一样,--两个字符串是不是一样(反转前后)
  2. //result是经过反转之后的字符串
  3. //s是sc获取到用户输入的字符串
  4. return result.equals(s);
  5. }

} ```