同系列文章导读:【JavaSE】文章导读

所有文章均在本博客首发,其他平台同步更新

如有问题,欢迎指正(评论区留言即可)

发表评论时请填写正确邮箱,以便于接收通知【推荐QQ邮箱】


  • API(Application Programming Interface):应用程序编程接口
编写程序去控制踢足球,程序需要向机器人发出向前跑、向后跑、射门、抢球等各种命令。机器人厂商一定会提供一些用于控制机器人的接口类,这些类中定义好了操作机器人各种动作的方法。其实,这些接口类就是机器人厂商提供给应用程序编程的接口,大家把这些类称为API。
  • 键盘录入字符串
Scanner sc = new Scanner();
System.out.print("请输入内容:");
String s = sc.nextLine(System.in);        //遇到回车、换行结束
//String s = sc.next(System.in);        //遇到空格、tab就停止
System.out.println(s);
// 在键盘录入接收数据的时候,如果是字符串和整数一起接收,建议使用next方法接收字符串

String类

概述:String类在java.lang包下,使用时不需要导包。

  • String类代表字符串,Java程序中的所有字符串字面值(如:"abc")都作为此类的方法实现
  • 字符串是常量,它们的值在创建后不能更改

常见构造方法

  • public String() 创建一个空白字符串对象,不含有任何内容
  • public String(char[] chs) 根据字符数组的内容,来创建字符串
  • public String(String original) 根据传入的字符串内容,来创建字符串对象
  • String s = "abc"; 直接赋值的方式创建字符串对象,内容就是abc
String 这个类比较特殊,打印其对象名的时候,不会出现内存地址,而是该对象所记录的真实内容

创建字符串对象的区别对比

  • 以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护

字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在。若不存在,则创建;存在则不会重新创建,直接使用

注意:字符串常量池从JDK7开始,从方法区挪到了堆内存

扩展:==在比较基本数据类型时比较值,在比较引用数据类型时比较地址是否相同

通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同

特点

  • Java程序中所有双引号字符,都是String类的对象
  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然String的值是不可变的,但是他们可以被共享

当字符串之间使用 + 拼接的时候,系统底层会自动创建一个StringBuilder对象

然后再调用其append方法完成拼接

拼接后,再调用toString方法转换为String类型

字符串比较

  • 字符串是对象,他比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()

    • public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数之间传递一个字符串
String s1 = "abc";
String s2 = "ABC";
s1.equals(s2);        //false
//equalsIgnoreCase()方法比较字符串不区分大小写
s1.equalsIgnoreCase(s2);        //true

案例

// 需求:已知用户名和密码,请用程序实现模拟用户登录,总共给三次机会,登录之后,给出相应的提示
import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      String userName = "abcde";
      String passWord = "abc666";
      int count = 0;
      Scanner sc = new Scanner(System.in);
      for(int i = 0; i < 3; i++){
          System.out.print("请输入用户名:");
          String user = sc.nextLine();
          System.out.print("请输入密码:");
          String pass = sc.nextLine();
          if(userName.equals(user) && passWord.equals(pass)){
              System.out.println("恭喜您,登录成功!");
              break;
          }else{
              System.out.println("账号或密码错误,请重试");
              count++;
          }
      }
      if(count >= 3) System.out.println("登录失败次数过多,请稍后重试");
  }
}
// 需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串,将字符串拆分为字符数组
// public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
// public int length():返回此字符串的长度
// public char[] toCharArray():将当前字符串拆分为字符数组并返回
import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      System.out.print("请输入字符串:");
      String s = sc.nextLine();
      /*
      for(int i = 0; i < s.length(); i++){
          System.out.print(s.charAt(i) + " ");
      }
      */
      char[] chars = s.toCharArray();
      for(int i = 0; i < chars.length; i++){
          System.out.print(chars[i] + " ");
      }
  }
}
//需求: 键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      System.out.print("请输入字符串:");
      String s = sc.nextLine();
      char[] chars = s.toCharArray();
      int num = 0;
      int english = 0;
      int English = 0;
      for(int i = 0; i < chars.length; i++){
          if(chars[i] >= '0' && chars[i] <= '9') num++;
          else if(chars[i] >= 'a' && chars[i] <= 'z') english++;
          else if(chars[i] >= 'A' && chars[i] <= 'Z') English++;
      }
      System.out.println("数字:" + num + " 小写字母:" + english + " 大写字母:" + English);
  }
}
// 需求:以字符串的形式从键盘接收一个手机号,将中间四位号码屏蔽
// 最终效果:183****4828
/*
    截取字符串:
            String substring(int beginIndex):
                    从传入的索引位置处,向后截取,一直截取到末尾,得到新的字符串并返回
      String substring(int beginIndex, int endIndex):
            从beginIndex索引位置开始截取,截取到endIndex索引位置,得到新的字符串并返回(含头不含尾)
*/
import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      System.out.print("请输入手机号:");
      String s = sc.nextLine();
      String begin = s.substring(0, 3);
      String end = s.substring(7, 11);
      System.out.println("最终手机号为:" + begin + "****" + end);
  }
}
// 需求:键盘录入一个字符串,如果字符串中包含(TMD),则使用***替换
/*
    String replace(CharSequence target, CharSequence replacement)
            将当前字符串中的target(被替换的旧值)内容,使用replacement(替换的新值)进行替换
            返回新的字符串
*/
import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      System.out.print("请输入内容:");
      String s = sc.nextLine();
      String result = s.replace("TMD", "***");
      System.out.println("您输入的内容为:" + result);
  }
}
// 需求:以字符串的形式从键盘录入学生信息,例如:"张三,23"从该字符串中切割出有效数据,封装为Student学生对象
// String[] split(String regex):根据传入的字符作为规则进行切割,将切割后的内容存入字符串数组中,并将字符串返回(数组)
11
11
// 新建一个Student类
public class Student{
  private String name;
  private String age;
  public Student(){}
  public Student(String name, String age){
      this.name = name;
      this.age = age;
  }
  public String getName(){
      return name;
  }
  public void setName(String name){
      this.name = name;
  }
  public String getAge(){
      return age;
  }
  public void setAge(String age){
      this.age = age;
  }
}

//---------------------------下面为一个新的class文件----------------------------------------------

import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      System.out.print("请输入您的信息:");
      String stuInfo = sc.nextLine();
      String[] sArr = stuInfo.split(",");
      Student stu = new Student(sArr[0], sArr[1]);
      System.out.println("姓名:" + stu.getName() + " 年龄:" + stu.get)
  }
}

StringBuilder

概述:StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器

作用:提高字符串的操作效率

构造方法

  • public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
  • public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象

常用方法

  • public StringBuilder append(任意类型) 添加数据,并返回对象本身
  • public StringBuilder reverse() 返回相反的字符序列
  • public int length() 返回长度(字符出现的个数)
  • public String toString() 通过toString()就可以实现把StringBuilder转换为String
方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()返回相反的字符序列
public int length()返回长度(字符出现的个数)
public String toString()通过toString()就可以实现把StringBuilder转换为String
StringBuilder sb = new StringBuilder();
//链式编程:如果一个方法返回的是对象类型,对象就可以继续向下调用方法
sb.append("red").append("blue").append("green");

StringBuilder 提高效率原理

  • 当String类型字符串以 + 拼接时,系统默认在堆内存中new一个StringBuilder类型对象,通过append()方法完成拼接,再通过toString()将StringBuilder类型转换为String类型。
  • 使用StringBuilder则可以省去不必要的步骤

案例

// 需求:键盘接收一个字符串,程序判断出该字符串是否是对称字符串,并在控制台打印是或不是
// 对称字符串:123321、111            非对称字符串:123123
import java.util.Scanner;
public class Test{
  public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      System.out.print("请输入内容:");
      String s = sc.nextLine();
      StringBuilder ss = new StringBuilder(s);
      String sss = ss.reverse().toString();
      if(s.equals(sss)){
          System.out.println("是");
      }else{
          System.out.println("不是");
      }
  }
}
// 需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
// 例如:数组为:int[] arr = {1, 2, 3};    执行方法后的输出结果为:[1,2,3]
public static void main(String[] args){
  int[] arr = {1, 2, 3};
  String s = arrayToString(arr);
  System.out.println(s);
}
// 定义一个方法,返回值类型 String ,参数列表int[] arr
public static String arrayToString(int[] arr){
  StringBuilder sb = new StringBuilder("【");
  for(int i = 0; i < arr.length; i++){
      if(i == arr.length - 1){
          sb.append(arr[i]).append("】");
      }else{
          sb.append(arr[i]).append(",");
      }
  }
  return sb.toString();
}


END

本文作者: 文章标题:【JavaSE】API基础
本文地址:https://www.hellocode.top/archives/26/
版权说明:若无注明,本文皆HelloCode原创,转载请保留文章出处。
最后修改:2022 年 04 月 16 日
如果觉得我的文章对你有用,请随意赞赏